Skip to content

Instantly share code, notes, and snippets.

@TokyoYoshida
Last active October 25, 2020 05:35
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save TokyoYoshida/2fada34313385d63b666253490b5f3f4 to your computer and use it in GitHub Desktop.
Save TokyoYoshida/2fada34313385d63b666253490b5f3f4 to your computer and use it in GitHub Desktop.
keras-to-coreml-with-builder.ipynb
Display the source blob
Display the rendered blob
Raw
{
"nbformat": 4,
"nbformat_minor": 0,
"metadata": {
"colab": {
"name": "keras-to-coreml-with-builder.ipynb",
"provenance": [],
"collapsed_sections": [],
"authorship_tag": "ABX9TyPX85SoPGLYC5uDYjhWOWyD",
"include_colab_link": true
},
"kernelspec": {
"display_name": "Python 3",
"name": "python3"
}
},
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "view-in-github",
"colab_type": "text"
},
"source": [
"<a href=\"https://colab.research.google.com/gist/TokyoYoshida/2fada34313385d63b666253490b5f3f4/keras-to-coreml-with-builder.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "vsGCrft8f8di"
},
"source": [
"# シンプルなモデルをCoreMLに変換する(ビルダーも使用)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "a9asgQ1zJ5xx"
},
"source": [
"# 事前準備"
]
},
{
"cell_type": "code",
"metadata": {
"id": "7z2NnNPqFkx9",
"outputId": "4fc04c87-be25-4c68-9423-73be14a4bd4b",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 734
}
},
"source": [
"!pip install tensorflow==1.14.0"
],
"execution_count": 3,
"outputs": [
{
"output_type": "stream",
"text": [
"Collecting tensorflow==1.14.0\n",
"\u001b[?25l Downloading https://files.pythonhosted.org/packages/de/f0/96fb2e0412ae9692dbf400e5b04432885f677ad6241c088ccc5fe7724d69/tensorflow-1.14.0-cp36-cp36m-manylinux1_x86_64.whl (109.2MB)\n",
"\u001b[K |████████████████████████████████| 109.2MB 75kB/s \n",
"\u001b[?25hRequirement already satisfied: keras-preprocessing>=1.0.5 in /usr/local/lib/python3.6/dist-packages (from tensorflow==1.14.0) (1.1.2)\n",
"Requirement already satisfied: numpy<2.0,>=1.14.5 in /usr/local/lib/python3.6/dist-packages (from tensorflow==1.14.0) (1.18.5)\n",
"Requirement already satisfied: protobuf>=3.6.1 in /usr/local/lib/python3.6/dist-packages (from tensorflow==1.14.0) (3.12.4)\n",
"Collecting tensorboard<1.15.0,>=1.14.0\n",
"\u001b[?25l Downloading https://files.pythonhosted.org/packages/91/2d/2ed263449a078cd9c8a9ba50ebd50123adf1f8cfbea1492f9084169b89d9/tensorboard-1.14.0-py3-none-any.whl (3.1MB)\n",
"\u001b[K |████████████████████████████████| 3.2MB 41.3MB/s \n",
"\u001b[?25hRequirement already satisfied: google-pasta>=0.1.6 in /usr/local/lib/python3.6/dist-packages (from tensorflow==1.14.0) (0.2.0)\n",
"Requirement already satisfied: wrapt>=1.11.1 in /usr/local/lib/python3.6/dist-packages (from tensorflow==1.14.0) (1.12.1)\n",
"Requirement already satisfied: six>=1.10.0 in /usr/local/lib/python3.6/dist-packages (from tensorflow==1.14.0) (1.15.0)\n",
"Collecting tensorflow-estimator<1.15.0rc0,>=1.14.0rc0\n",
"\u001b[?25l Downloading https://files.pythonhosted.org/packages/3c/d5/21860a5b11caf0678fbc8319341b0ae21a07156911132e0e71bffed0510d/tensorflow_estimator-1.14.0-py2.py3-none-any.whl (488kB)\n",
"\u001b[K |████████████████████████████████| 491kB 46.0MB/s \n",
"\u001b[?25hCollecting keras-applications>=1.0.6\n",
"\u001b[?25l Downloading https://files.pythonhosted.org/packages/71/e3/19762fdfc62877ae9102edf6342d71b28fbfd9dea3d2f96a882ce099b03f/Keras_Applications-1.0.8-py3-none-any.whl (50kB)\n",
"\u001b[K |████████████████████████████████| 51kB 7.2MB/s \n",
"\u001b[?25hRequirement already satisfied: absl-py>=0.7.0 in /usr/local/lib/python3.6/dist-packages (from tensorflow==1.14.0) (0.10.0)\n",
"Requirement already satisfied: termcolor>=1.1.0 in /usr/local/lib/python3.6/dist-packages (from tensorflow==1.14.0) (1.1.0)\n",
"Requirement already satisfied: gast>=0.2.0 in /usr/local/lib/python3.6/dist-packages (from tensorflow==1.14.0) (0.3.3)\n",
"Requirement already satisfied: astor>=0.6.0 in /usr/local/lib/python3.6/dist-packages (from tensorflow==1.14.0) (0.8.1)\n",
"Requirement already satisfied: wheel>=0.26 in /usr/local/lib/python3.6/dist-packages (from tensorflow==1.14.0) (0.35.1)\n",
"Requirement already satisfied: grpcio>=1.8.6 in /usr/local/lib/python3.6/dist-packages (from tensorflow==1.14.0) (1.32.0)\n",
"Requirement already satisfied: setuptools in /usr/local/lib/python3.6/dist-packages (from protobuf>=3.6.1->tensorflow==1.14.0) (50.3.0)\n",
"Requirement already satisfied: werkzeug>=0.11.15 in /usr/local/lib/python3.6/dist-packages (from tensorboard<1.15.0,>=1.14.0->tensorflow==1.14.0) (1.0.1)\n",
"Requirement already satisfied: markdown>=2.6.8 in /usr/local/lib/python3.6/dist-packages (from tensorboard<1.15.0,>=1.14.0->tensorflow==1.14.0) (3.2.2)\n",
"Requirement already satisfied: h5py in /usr/local/lib/python3.6/dist-packages (from keras-applications>=1.0.6->tensorflow==1.14.0) (2.10.0)\n",
"Requirement already satisfied: importlib-metadata; python_version < \"3.8\" in /usr/local/lib/python3.6/dist-packages (from markdown>=2.6.8->tensorboard<1.15.0,>=1.14.0->tensorflow==1.14.0) (2.0.0)\n",
"Requirement already satisfied: zipp>=0.5 in /usr/local/lib/python3.6/dist-packages (from importlib-metadata; python_version < \"3.8\"->markdown>=2.6.8->tensorboard<1.15.0,>=1.14.0->tensorflow==1.14.0) (3.2.0)\n",
"Installing collected packages: tensorboard, tensorflow-estimator, keras-applications, tensorflow\n",
" Found existing installation: tensorboard 2.3.0\n",
" Uninstalling tensorboard-2.3.0:\n",
" Successfully uninstalled tensorboard-2.3.0\n",
" Found existing installation: tensorflow-estimator 2.3.0\n",
" Uninstalling tensorflow-estimator-2.3.0:\n",
" Successfully uninstalled tensorflow-estimator-2.3.0\n",
" Found existing installation: tensorflow 2.3.0\n",
" Uninstalling tensorflow-2.3.0:\n",
" Successfully uninstalled tensorflow-2.3.0\n",
"Successfully installed keras-applications-1.0.8 tensorboard-1.14.0 tensorflow-1.14.0 tensorflow-estimator-1.14.0\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "8ilVrJX0Fq0E",
"outputId": "b60dade7-ae6a-4de3-a13a-effbd9fd00de",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 428
}
},
"source": [
"!pip install -U coremltools"
],
"execution_count": 4,
"outputs": [
{
"output_type": "stream",
"text": [
"Collecting coremltools\n",
"\u001b[?25l Downloading https://files.pythonhosted.org/packages/f1/30/32f5bce33571b00f8e43e290bb4a9561956bc7f35b96dcd48f300029b23f/coremltools-4.0-cp36-none-manylinux1_x86_64.whl (3.4MB)\n",
"\u001b[K |████████████████████████████████| 3.4MB 4.8MB/s \n",
"\u001b[?25hRequirement already satisfied, skipping upgrade: protobuf>=3.1.0 in /usr/local/lib/python3.6/dist-packages (from coremltools) (3.12.4)\n",
"Collecting attr\n",
" Downloading https://files.pythonhosted.org/packages/de/be/ddc7f84d4e087144472a38a373d3e319f51a6faf6e5fc1ae897173675f21/attr-0.3.1.tar.gz\n",
"Requirement already satisfied, skipping upgrade: six>=1.10.0 in /usr/local/lib/python3.6/dist-packages (from coremltools) (1.15.0)\n",
"Requirement already satisfied, skipping upgrade: attrs in /usr/local/lib/python3.6/dist-packages (from coremltools) (20.2.0)\n",
"Requirement already satisfied, skipping upgrade: numpy>=1.14.5 in /usr/local/lib/python3.6/dist-packages (from coremltools) (1.18.5)\n",
"Requirement already satisfied, skipping upgrade: packaging in /usr/local/lib/python3.6/dist-packages (from coremltools) (20.4)\n",
"Requirement already satisfied, skipping upgrade: scipy in /usr/local/lib/python3.6/dist-packages (from coremltools) (1.4.1)\n",
"Requirement already satisfied, skipping upgrade: tqdm in /usr/local/lib/python3.6/dist-packages (from coremltools) (4.41.1)\n",
"Requirement already satisfied, skipping upgrade: sympy in /usr/local/lib/python3.6/dist-packages (from coremltools) (1.1.1)\n",
"Requirement already satisfied, skipping upgrade: setuptools in /usr/local/lib/python3.6/dist-packages (from protobuf>=3.1.0->coremltools) (50.3.0)\n",
"Requirement already satisfied, skipping upgrade: pyparsing>=2.0.2 in /usr/local/lib/python3.6/dist-packages (from packaging->coremltools) (2.4.7)\n",
"Requirement already satisfied, skipping upgrade: mpmath>=0.19 in /usr/local/lib/python3.6/dist-packages (from sympy->coremltools) (1.1.0)\n",
"Building wheels for collected packages: attr\n",
" Building wheel for attr (setup.py) ... \u001b[?25l\u001b[?25hdone\n",
" Created wheel for attr: filename=attr-0.3.1-cp36-none-any.whl size=2458 sha256=8c52570616f5de3ec2afcaec7efd0b1a5a975dd58e51aefe5b8b9d003a88be77\n",
" Stored in directory: /root/.cache/pip/wheels/f0/96/9b/1f8892a707d17095b5a6eab0275da9d39e68e03a26aee2e726\n",
"Successfully built attr\n",
"Installing collected packages: attr, coremltools\n",
"Successfully installed attr-0.3.1 coremltools-4.0\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "h1i3QSK1FyDy",
"outputId": "ac6f6883-9e86-43ae-dc34-2026e2b7ec56",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 272
}
},
"source": [
"!pip install keras==2.2.4"
],
"execution_count": 5,
"outputs": [
{
"output_type": "stream",
"text": [
"Collecting keras==2.2.4\n",
"\u001b[?25l Downloading https://files.pythonhosted.org/packages/5e/10/aa32dad071ce52b5502266b5c659451cfd6ffcbf14e6c8c4f16c0ff5aaab/Keras-2.2.4-py2.py3-none-any.whl (312kB)\n",
"\r\u001b[K |█ | 10kB 17.2MB/s eta 0:00:01\r\u001b[K |██ | 20kB 2.9MB/s eta 0:00:01\r\u001b[K |███▏ | 30kB 3.2MB/s eta 0:00:01\r\u001b[K |████▏ | 40kB 3.6MB/s eta 0:00:01\r\u001b[K |█████▎ | 51kB 3.4MB/s eta 0:00:01\r\u001b[K |██████▎ | 61kB 3.7MB/s eta 0:00:01\r\u001b[K |███████▍ | 71kB 4.0MB/s eta 0:00:01\r\u001b[K |████████▍ | 81kB 4.1MB/s eta 0:00:01\r\u001b[K |█████████▍ | 92kB 4.1MB/s eta 0:00:01\r\u001b[K |██████████▌ | 102kB 4.3MB/s eta 0:00:01\r\u001b[K |███████████▌ | 112kB 4.3MB/s eta 0:00:01\r\u001b[K |████████████▋ | 122kB 4.3MB/s eta 0:00:01\r\u001b[K |█████████████▋ | 133kB 4.3MB/s eta 0:00:01\r\u001b[K |██████████████▊ | 143kB 4.3MB/s eta 0:00:01\r\u001b[K |███████████████▊ | 153kB 4.3MB/s eta 0:00:01\r\u001b[K |████████████████▊ | 163kB 4.3MB/s eta 0:00:01\r\u001b[K |█████████████████▉ | 174kB 4.3MB/s eta 0:00:01\r\u001b[K |██████████████████▉ | 184kB 4.3MB/s eta 0:00:01\r\u001b[K |████████████████████ | 194kB 4.3MB/s eta 0:00:01\r\u001b[K |█████████████████████ | 204kB 4.3MB/s eta 0:00:01\r\u001b[K |██████████████████████ | 215kB 4.3MB/s eta 0:00:01\r\u001b[K |███████████████████████ | 225kB 4.3MB/s eta 0:00:01\r\u001b[K |████████████████████████▏ | 235kB 4.3MB/s eta 0:00:01\r\u001b[K |█████████████████████████▏ | 245kB 4.3MB/s eta 0:00:01\r\u001b[K |██████████████████████████▏ | 256kB 4.3MB/s eta 0:00:01\r\u001b[K |███████████████████████████▎ | 266kB 4.3MB/s eta 0:00:01\r\u001b[K |████████████████████████████▎ | 276kB 4.3MB/s eta 0:00:01\r\u001b[K |█████████████████████████████▍ | 286kB 4.3MB/s eta 0:00:01\r\u001b[K |██████████████████████████████▍ | 296kB 4.3MB/s eta 0:00:01\r\u001b[K |███████████████████████████████▌| 307kB 4.3MB/s eta 0:00:01\r\u001b[K |████████████████████████████████| 317kB 4.3MB/s \n",
"\u001b[?25hRequirement already satisfied: six>=1.9.0 in /usr/local/lib/python3.6/dist-packages (from keras==2.2.4) (1.15.0)\n",
"Requirement already satisfied: pyyaml in /usr/local/lib/python3.6/dist-packages (from keras==2.2.4) (3.13)\n",
"Requirement already satisfied: scipy>=0.14 in /usr/local/lib/python3.6/dist-packages (from keras==2.2.4) (1.4.1)\n",
"Requirement already satisfied: keras-applications>=1.0.6 in /usr/local/lib/python3.6/dist-packages (from keras==2.2.4) (1.0.8)\n",
"Requirement already satisfied: numpy>=1.9.1 in /usr/local/lib/python3.6/dist-packages (from keras==2.2.4) (1.18.5)\n",
"Requirement already satisfied: keras-preprocessing>=1.0.5 in /usr/local/lib/python3.6/dist-packages (from keras==2.2.4) (1.1.2)\n",
"Requirement already satisfied: h5py in /usr/local/lib/python3.6/dist-packages (from keras==2.2.4) (2.10.0)\n",
"Installing collected packages: keras\n",
" Found existing installation: Keras 2.4.3\n",
" Uninstalling Keras-2.4.3:\n",
" Successfully uninstalled Keras-2.4.3\n",
"Successfully installed keras-2.2.4\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "v3YrdcUxKGeA",
"outputId": "3dbc0363-bf9c-4b64-a535-e82852891ee8",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 462
}
},
"source": [
"from keras.models import Sequential\n",
"from keras.layers import Dense, Activation\n",
"import numpy as np\n",
"import math\n",
"from keras.utils import np_utils\n",
"import keras"
],
"execution_count": 6,
"outputs": [
{
"output_type": "stream",
"text": [
"Using TensorFlow backend.\n",
"/usr/local/lib/python3.6/dist-packages/tensorflow/python/framework/dtypes.py:516: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n",
" _np_qint8 = np.dtype([(\"qint8\", np.int8, 1)])\n",
"/usr/local/lib/python3.6/dist-packages/tensorflow/python/framework/dtypes.py:517: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n",
" _np_quint8 = np.dtype([(\"quint8\", np.uint8, 1)])\n",
"/usr/local/lib/python3.6/dist-packages/tensorflow/python/framework/dtypes.py:518: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n",
" _np_qint16 = np.dtype([(\"qint16\", np.int16, 1)])\n",
"/usr/local/lib/python3.6/dist-packages/tensorflow/python/framework/dtypes.py:519: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n",
" _np_quint16 = np.dtype([(\"quint16\", np.uint16, 1)])\n",
"/usr/local/lib/python3.6/dist-packages/tensorflow/python/framework/dtypes.py:520: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n",
" _np_qint32 = np.dtype([(\"qint32\", np.int32, 1)])\n",
"/usr/local/lib/python3.6/dist-packages/tensorflow/python/framework/dtypes.py:525: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n",
" np_resource = np.dtype([(\"resource\", np.ubyte, 1)])\n",
"/usr/local/lib/python3.6/dist-packages/tensorboard/compat/tensorflow_stub/dtypes.py:541: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n",
" _np_qint8 = np.dtype([(\"qint8\", np.int8, 1)])\n",
"/usr/local/lib/python3.6/dist-packages/tensorboard/compat/tensorflow_stub/dtypes.py:542: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n",
" _np_quint8 = np.dtype([(\"quint8\", np.uint8, 1)])\n",
"/usr/local/lib/python3.6/dist-packages/tensorboard/compat/tensorflow_stub/dtypes.py:543: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n",
" _np_qint16 = np.dtype([(\"qint16\", np.int16, 1)])\n",
"/usr/local/lib/python3.6/dist-packages/tensorboard/compat/tensorflow_stub/dtypes.py:544: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n",
" _np_quint16 = np.dtype([(\"quint16\", np.uint16, 1)])\n",
"/usr/local/lib/python3.6/dist-packages/tensorboard/compat/tensorflow_stub/dtypes.py:545: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n",
" _np_qint32 = np.dtype([(\"qint32\", np.int32, 1)])\n",
"/usr/local/lib/python3.6/dist-packages/tensorboard/compat/tensorflow_stub/dtypes.py:550: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n",
" np_resource = np.dtype([(\"resource\", np.ubyte, 1)])\n"
],
"name": "stderr"
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "zSWb8FtvJ-XU"
},
"source": [
"# モデルの作成"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "8i0IC4LuJ4Z3"
},
"source": [
""
]
},
{
"cell_type": "code",
"metadata": {
"id": "nNmVQ-RlgPXo"
},
"source": [
"!rm -rf logs\n",
"!mkdir logs"
],
"execution_count": 7,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "ie0vY5aLeaZq"
},
"source": [
"tb_cb = keras.callbacks.TensorBoard(log_dir='./logs', histogram_freq=0, batch_size=32, write_graph=True, write_grads=False, write_images=False, embeddings_freq=0, embeddings_layer_names=None, embeddings_metadata=None)"
],
"execution_count": 8,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "pp2iQaAJghZR"
},
"source": [
"cbks = [tb_cb]"
],
"execution_count": 9,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "7RUwdVp9FzDa",
"outputId": "d571e813-2235-4d2f-8dee-2e347b0ce208",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 1000
}
},
"source": [
"x = np.random.randint(0, 10, (10000,2))\n",
"y = np_utils.to_categorical(np.sum(x, axis=1))\n",
"\n",
"model = Sequential()\n",
"model.add(Dense(512, activation='relu', input_dim=2))\n",
"model.add(Dense(256, activation='relu'))\n",
"model.add(Dense(y.shape[1]))\n",
"model.add(Activation(\"softmax\"))\n",
"model.compile('rmsprop',\n",
" 'categorical_crossentropy',\n",
" metrics=['accuracy'])\n",
"\n",
"\n",
"train_rate = 0.7\n",
"train_len = math.floor(len(x) * train_rate)\n",
"trainx = x[0:train_len]\n",
"trainy = y[0:train_len]\n",
"testx = x[train_len:]\n",
"testy = y[train_len:]\n",
"\n",
"history = model.fit(trainx, trainy,\n",
" batch_size=128,\n",
" epochs=50,\n",
" verbose=1,\n",
" callbacks=cbks,\n",
" validation_data=(testx, testy))"
],
"execution_count": 10,
"outputs": [
{
"output_type": "stream",
"text": [
"WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py:74: The name tf.get_default_graph is deprecated. Please use tf.compat.v1.get_default_graph instead.\n",
"\n",
"WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py:517: The name tf.placeholder is deprecated. Please use tf.compat.v1.placeholder instead.\n",
"\n",
"WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py:4138: The name tf.random_uniform is deprecated. Please use tf.random.uniform instead.\n",
"\n",
"WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/keras/optimizers.py:790: The name tf.train.Optimizer is deprecated. Please use tf.compat.v1.train.Optimizer instead.\n",
"\n",
"WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py:3295: The name tf.log is deprecated. Please use tf.math.log instead.\n",
"\n",
"WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/tensorflow/python/ops/math_grad.py:1250: add_dispatch_support.<locals>.wrapper (from tensorflow.python.ops.array_ops) is deprecated and will be removed in a future version.\n",
"Instructions for updating:\n",
"Use tf.where in 2.0, which has the same broadcast rule as np.where\n",
"WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py:986: The name tf.assign_add is deprecated. Please use tf.compat.v1.assign_add instead.\n",
"\n",
"Train on 7000 samples, validate on 3000 samples\n",
"WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/keras/callbacks.py:850: The name tf.summary.merge_all is deprecated. Please use tf.compat.v1.summary.merge_all instead.\n",
"\n",
"WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/keras/callbacks.py:853: The name tf.summary.FileWriter is deprecated. Please use tf.compat.v1.summary.FileWriter instead.\n",
"\n",
"Epoch 1/50\n",
"7000/7000 [==============================] - 0s 63us/step - loss: 2.5104 - acc: 0.1149 - val_loss: 2.3733 - val_acc: 0.1283\n",
"Epoch 2/50\n",
"7000/7000 [==============================] - 0s 42us/step - loss: 2.1736 - acc: 0.1803 - val_loss: 1.9878 - val_acc: 0.2770\n",
"Epoch 3/50\n",
"7000/7000 [==============================] - 0s 45us/step - loss: 1.8134 - acc: 0.3331 - val_loss: 1.6632 - val_acc: 0.4337\n",
"Epoch 4/50\n",
"7000/7000 [==============================] - 0s 42us/step - loss: 1.5417 - acc: 0.4501 - val_loss: 1.4106 - val_acc: 0.5623\n",
"Epoch 5/50\n",
"7000/7000 [==============================] - 0s 45us/step - loss: 1.3557 - acc: 0.5277 - val_loss: 1.2477 - val_acc: 0.6430\n",
"Epoch 6/50\n",
"7000/7000 [==============================] - 0s 42us/step - loss: 1.2126 - acc: 0.5707 - val_loss: 1.1236 - val_acc: 0.5767\n",
"Epoch 7/50\n",
"7000/7000 [==============================] - 0s 43us/step - loss: 1.1043 - acc: 0.5944 - val_loss: 1.0230 - val_acc: 0.6210\n",
"Epoch 8/50\n",
"7000/7000 [==============================] - 0s 44us/step - loss: 1.0003 - acc: 0.6466 - val_loss: 1.0602 - val_acc: 0.6400\n",
"Epoch 9/50\n",
"7000/7000 [==============================] - 0s 41us/step - loss: 0.9347 - acc: 0.6614 - val_loss: 0.8885 - val_acc: 0.7617\n",
"Epoch 10/50\n",
"7000/7000 [==============================] - 0s 44us/step - loss: 0.8668 - acc: 0.6756 - val_loss: 0.8099 - val_acc: 0.6840\n",
"Epoch 11/50\n",
"7000/7000 [==============================] - 0s 46us/step - loss: 0.8058 - acc: 0.7010 - val_loss: 0.7930 - val_acc: 0.6787\n",
"Epoch 12/50\n",
"7000/7000 [==============================] - 0s 42us/step - loss: 0.7592 - acc: 0.7120 - val_loss: 0.7130 - val_acc: 0.7273\n",
"Epoch 13/50\n",
"7000/7000 [==============================] - 0s 42us/step - loss: 0.7129 - acc: 0.7296 - val_loss: 0.6284 - val_acc: 0.8330\n",
"Epoch 14/50\n",
"7000/7000 [==============================] - 0s 45us/step - loss: 0.6754 - acc: 0.7397 - val_loss: 0.7297 - val_acc: 0.6307\n",
"Epoch 15/50\n",
"7000/7000 [==============================] - 0s 43us/step - loss: 0.6287 - acc: 0.7644 - val_loss: 0.5951 - val_acc: 0.7767\n",
"Epoch 16/50\n",
"7000/7000 [==============================] - 0s 45us/step - loss: 0.6054 - acc: 0.7650 - val_loss: 0.5762 - val_acc: 0.8350\n",
"Epoch 17/50\n",
"7000/7000 [==============================] - 0s 46us/step - loss: 0.5742 - acc: 0.7814 - val_loss: 0.5855 - val_acc: 0.7490\n",
"Epoch 18/50\n",
"7000/7000 [==============================] - 0s 45us/step - loss: 0.5546 - acc: 0.7869 - val_loss: 0.4859 - val_acc: 0.8570\n",
"Epoch 19/50\n",
"7000/7000 [==============================] - 0s 42us/step - loss: 0.5145 - acc: 0.8136 - val_loss: 0.5574 - val_acc: 0.7750\n",
"Epoch 20/50\n",
"7000/7000 [==============================] - 0s 46us/step - loss: 0.4999 - acc: 0.8061 - val_loss: 0.6331 - val_acc: 0.7187\n",
"Epoch 21/50\n",
"7000/7000 [==============================] - 0s 46us/step - loss: 0.4774 - acc: 0.8300 - val_loss: 0.5468 - val_acc: 0.7607\n",
"Epoch 22/50\n",
"7000/7000 [==============================] - 0s 44us/step - loss: 0.4613 - acc: 0.8267 - val_loss: 0.3877 - val_acc: 0.8607\n",
"Epoch 23/50\n",
"7000/7000 [==============================] - 0s 44us/step - loss: 0.4375 - acc: 0.8380 - val_loss: 0.3744 - val_acc: 0.9437\n",
"Epoch 24/50\n",
"7000/7000 [==============================] - 0s 45us/step - loss: 0.4122 - acc: 0.8469 - val_loss: 0.3464 - val_acc: 0.8953\n",
"Epoch 25/50\n",
"7000/7000 [==============================] - 0s 42us/step - loss: 0.3940 - acc: 0.8627 - val_loss: 0.5236 - val_acc: 0.7253\n",
"Epoch 26/50\n",
"7000/7000 [==============================] - 0s 43us/step - loss: 0.3831 - acc: 0.8597 - val_loss: 0.4199 - val_acc: 0.8630\n",
"Epoch 27/50\n",
"7000/7000 [==============================] - 0s 44us/step - loss: 0.3737 - acc: 0.8653 - val_loss: 0.2924 - val_acc: 0.9247\n",
"Epoch 28/50\n",
"7000/7000 [==============================] - 0s 44us/step - loss: 0.3606 - acc: 0.8623 - val_loss: 0.2435 - val_acc: 0.9823\n",
"Epoch 29/50\n",
"7000/7000 [==============================] - 0s 42us/step - loss: 0.3346 - acc: 0.8869 - val_loss: 0.3609 - val_acc: 0.8817\n",
"Epoch 30/50\n",
"7000/7000 [==============================] - 0s 44us/step - loss: 0.3260 - acc: 0.8860 - val_loss: 0.3973 - val_acc: 0.8290\n",
"Epoch 31/50\n",
"7000/7000 [==============================] - 0s 46us/step - loss: 0.3246 - acc: 0.8851 - val_loss: 0.2511 - val_acc: 0.8867\n",
"Epoch 32/50\n",
"7000/7000 [==============================] - 0s 44us/step - loss: 0.3226 - acc: 0.8817 - val_loss: 0.3160 - val_acc: 0.8280\n",
"Epoch 33/50\n",
"7000/7000 [==============================] - 0s 44us/step - loss: 0.2728 - acc: 0.9180 - val_loss: 0.3125 - val_acc: 0.8740\n",
"Epoch 34/50\n",
"7000/7000 [==============================] - 0s 45us/step - loss: 0.2858 - acc: 0.9103 - val_loss: 0.1596 - val_acc: 1.0000\n",
"Epoch 35/50\n",
"7000/7000 [==============================] - 0s 46us/step - loss: 0.2751 - acc: 0.9163 - val_loss: 0.8182 - val_acc: 0.5863\n",
"Epoch 36/50\n",
"7000/7000 [==============================] - 0s 44us/step - loss: 0.2860 - acc: 0.9051 - val_loss: 0.1849 - val_acc: 0.9240\n",
"Epoch 37/50\n",
"7000/7000 [==============================] - 0s 47us/step - loss: 0.2586 - acc: 0.9193 - val_loss: 0.1386 - val_acc: 0.9907\n",
"Epoch 38/50\n",
"7000/7000 [==============================] - 0s 43us/step - loss: 0.2313 - acc: 0.9299 - val_loss: 0.5393 - val_acc: 0.6693\n",
"Epoch 39/50\n",
"7000/7000 [==============================] - 0s 45us/step - loss: 0.2585 - acc: 0.9109 - val_loss: 0.1088 - val_acc: 1.0000\n",
"Epoch 40/50\n",
"7000/7000 [==============================] - 0s 45us/step - loss: 0.2511 - acc: 0.9239 - val_loss: 0.1288 - val_acc: 1.0000\n",
"Epoch 41/50\n",
"7000/7000 [==============================] - 0s 44us/step - loss: 0.2242 - acc: 0.9297 - val_loss: 0.1015 - val_acc: 1.0000\n",
"Epoch 42/50\n",
"7000/7000 [==============================] - 0s 43us/step - loss: 0.2241 - acc: 0.9300 - val_loss: 0.1125 - val_acc: 1.0000\n",
"Epoch 43/50\n",
"7000/7000 [==============================] - 0s 45us/step - loss: 0.1906 - acc: 0.9447 - val_loss: 0.1144 - val_acc: 0.9627\n",
"Epoch 44/50\n",
"7000/7000 [==============================] - 0s 45us/step - loss: 0.2282 - acc: 0.9320 - val_loss: 0.0770 - val_acc: 1.0000\n",
"Epoch 45/50\n",
"7000/7000 [==============================] - 0s 45us/step - loss: 0.2165 - acc: 0.9297 - val_loss: 0.0947 - val_acc: 0.9837\n",
"Epoch 46/50\n",
"7000/7000 [==============================] - 0s 46us/step - loss: 0.1819 - acc: 0.9539 - val_loss: 0.3045 - val_acc: 0.8047\n",
"Epoch 47/50\n",
"7000/7000 [==============================] - 0s 46us/step - loss: 0.2056 - acc: 0.9351 - val_loss: 0.0648 - val_acc: 1.0000\n",
"Epoch 48/50\n",
"7000/7000 [==============================] - 0s 46us/step - loss: 0.2217 - acc: 0.9253 - val_loss: 0.0721 - val_acc: 0.9927\n",
"Epoch 49/50\n",
"7000/7000 [==============================] - 0s 45us/step - loss: 0.1608 - acc: 0.9567 - val_loss: 0.0612 - val_acc: 1.0000\n",
"Epoch 50/50\n",
"7000/7000 [==============================] - 0s 46us/step - loss: 0.2043 - acc: 0.9376 - val_loss: 0.2097 - val_acc: 0.9160\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "F8MyAzc7gfzw"
},
"source": [
""
],
"execution_count": 10,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "hFEJEKYKfPI9"
},
"source": [
"%load_ext tensorboard"
],
"execution_count": 11,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "1MKZ41KnfWK_",
"outputId": "f19d826e-7f39-4035-d658-f456ac1ac7f1",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 119
}
},
"source": [
"!pip uninstall -y tensorboard-plugin-wit"
],
"execution_count": 62,
"outputs": [
{
"output_type": "stream",
"text": [
"y\n",
"y\n",
"y\n",
"\n",
"Uninstalling tensorboard-plugin-wit-1.7.0:\n",
" Successfully uninstalled tensorboard-plugin-wit-1.7.0\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "7opVEasaFJno",
"outputId": "201ec737-67ab-40ff-e1cf-ac80c8aeb921",
"colab": {
"resources": {
"http://localhost:6006/": {
"data": "PCFkb2N0eXBlIGh0bWw+PCEtLQpAbGljZW5zZQpDb3B5cmlnaHQgMjAxNiBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgoKTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgogICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCgpVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgpTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLT48bWV0YSBjaGFyc2V0PSJ1dGYtOCI+Cjx0aXRsZT5UZW5zb3JCb2FyZDwvdGl0bGU+CjxsaW5rIHJlbD0ic2hvcnRjdXQgaWNvbiIgaHJlZj0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFNUUFBQURFQ0FNQUFBRDNlSDVaQUFBQUJHZEJUVUVBQUxHUEMveGhCUUFBQUFGelVrZENBSzdPSE9rQUFBRC9VRXhVUmZGbEtmYUVMdkZtS2ZOeUsvNjdOdldBTGY2OE52NjlOdk54Sy8yME5meXlOUDIyTmZOMEsvSnJLdnFoTXYyek5mMjVOZjI0TmYyM05mZU9ML3l6TlB5dk5QSm9LdmlXTVBtZU1mTjFLL1dCTGZlUEwvRm5LZmVNTC9xbE12UjdMUG1jTWZlTEwvYUpMdlI1TFBGb0tmSnVLdlIzTFA2Nk52eXdOUGVOTC9WL0xmYUlMdjIxTmYyNk5mTnpLL052Sy9SNkxQbWFNZnl4TlBxZk12VitMZnVyTS9pU01QbWJNZkp2S3ZtZE1mdW1NL3FpTXZtWk1meXROUEpxS3Z5c05QTjJLL2lZTVBOd0svdXBNL0p0S3ZKc0t2aVZNUGFITHZhR0x2SnBLdlI4TFBhS0x2cWtNdnVxTS9hRkx2UjRMUHVvTS9pVE1QV0RMZmlSTVBtWU1YUzBuZ2tBQUFMb1NVUkJWSGphN2RybmN0cEFGSWJoRlVJU1NLSjNNS1lhMCt5NHhUVzk5MzcvMTVKa0pobFRqaHJTckhSbXZ1Zi9hczZMMFlMRkNnRUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQU1CSjZuamVucXNwemduUHJzckdYOVpwaTJ0Q3JtbmM2K2RZTnRoVlk1V3BNbXhRTFdQZE1zT3VZVnd6TmozZWkydDNtUXdhVjQzQkpQRENTMk5iSjVhRWV1WC8rOXFjalFPdGZGSWtJa3J2WTJnNE1WY21PQnNGV2Jvd0tPL2tOeWo2MmdScEpjRGFQQmx4THIxQjB6ZEcwQy84THpiSmlKcnNodXZ5MWd6bEE5K3JEOG1Ja3V5SUpqRkUzL2Rxbll3b1NtN0lVRVBvRC93dXQ4aUlndVNJRGpsRnhlL3lmWEw1dnVTSTIxQlRaTExoWG9PSUxNTzhIeHdhL0w4YkkwTGZtVWRoR293YjJadlQwZTU3cEZORGdCMDZJbFZ5am1tSUJsMlQvbmw5Unc2U0Q5R2dTRy9RMHVRa2FXM1hobW92S1EzZUZRNE4yVW85T1ExZUZac05lcmY3dlArck80cmhtWTFMZzN2RlZvUDgrOEJYZzFzRm53Ym5DazROVGhXOEd1aUtCRGRrVlZ0VE5Gdk5lbFZzTnFUYnlXbklPTTJvZVRSb3lXdndtcEpIZy91Y1hCcmNKdVhUNER3cnB3WmkydnkwVkN4OFl0WGcvRDJiVTRPZml1UTNlRmZFMktENGJmQ3FpTE5COTkzZ1hzR2x3YTJDVDROekJhY0dJVlE2WXNpcFFkaDB4RWRPRFVLakl4clNwODhvblo4emJiRkxnMURvaUZPNUJYdkRHdjJNeTkvSmhVVDhKVVpUSTB5RGFOSExCeklidnFURE5ZaFVpVncva2RqUTFrTTJDSEZEUGpLVytLenlSVEYwZy9nYTl3OXkrZkFOUXB4dlg4Q1UrTnk3RlVXRGVGM1krZzNsUk9JZjRrMFVEWDllQ3l2TzUzMVB5WWhIZ2E5enZQWkpVNWI3M1kvZVhqOEh2OUQ0OG42SGFGNUxiY2pSdDhUWlR0ZGE1TTFEZlhuYmtYMUMwU0hDRkt6UUI1RmU4b3A0R05HTkhhdnZaRVNiVndUNXI2VzF4eXVDUEJZM1k5WWdEcXprbkgvZTNZZk56enVMMzBsMEllYnJaNWtLdHVESVh0MW44NjhFVDZrZjMvNDl0THZyQ2NaeUY4UHUyMTVkQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFjUEliTnJCaE9hQlh1Y29BQUFBQVNVVk9SSzVDWUlJPSI+CjxsaW5rIHJlbD0iYXBwbGUtdG91Y2gtaWNvbiIgaHJlZj0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFNUUFBQURFQ0FNQUFBRDNlSDVaQUFBQUJHZEJUVUVBQUxHUEMveGhCUUFBQUFGelVrZENBSzdPSE9rQUFBRC9VRXhVUmZGbEtmYUVMdkZtS2ZOeUsvNjdOdldBTGY2OE52NjlOdk54Sy8yME5meXlOUDIyTmZOMEsvSnJLdnFoTXYyek5mMjVOZjI0TmYyM05mZU9ML3l6TlB5dk5QSm9LdmlXTVBtZU1mTjFLL1dCTGZlUEwvRm5LZmVNTC9xbE12UjdMUG1jTWZlTEwvYUpMdlI1TFBGb0tmSnVLdlIzTFA2Nk52eXdOUGVOTC9WL0xmYUlMdjIxTmYyNk5mTnpLL052Sy9SNkxQbWFNZnl4TlBxZk12VitMZnVyTS9pU01QbWJNZkp2S3ZtZE1mdW1NL3FpTXZtWk1meXROUEpxS3Z5c05QTjJLL2lZTVBOd0svdXBNL0p0S3ZKc0t2aVZNUGFITHZhR0x2SnBLdlI4TFBhS0x2cWtNdnVxTS9hRkx2UjRMUHVvTS9pVE1QV0RMZmlSTVBtWU1YUzBuZ2tBQUFMb1NVUkJWSGphN2RybmN0cEFGSWJoRlVJU1NLSjNNS1lhMCt5NHhUVzk5MzcvMTVKa0pobFRqaHJTckhSbXZ1Zi9hczZMMFlMRkNnRUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQU1CSjZuamVucXNwemduUHJzckdYOVpwaTJ0Q3JtbmM2K2RZTnRoVlk1V3BNbXhRTFdQZE1zT3VZVnd6TmozZWkydDNtUXdhVjQzQkpQRENTMk5iSjVhRWV1WC8rOXFjalFPdGZGSWtJa3J2WTJnNE1WY21PQnNGV2Jvd0tPL2tOeWo2MmdScEpjRGFQQmx4THIxQjB6ZEcwQy84THpiSmlKcnNodXZ5MWd6bEE5K3JEOG1Ja3V5SUpqRkUzL2Rxbll3b1NtN0lVRVBvRC93dXQ4aUlndVNJRGpsRnhlL3lmWEw1dnVTSTIxQlRaTExoWG9PSUxNTzhIeHdhL0w4YkkwTGZtVWRoR293YjJadlQwZTU3cEZORGdCMDZJbFZ5am1tSUJsMlQvbmw5Unc2U0Q5R2dTRy9RMHVRa2FXM1hobW92S1EzZUZRNE4yVW85T1ExZUZac05lcmY3dlArck80cmhtWTFMZzN2RlZvUDgrOEJYZzFzRm53Ym5DazROVGhXOEd1aUtCRGRrVlZ0VE5Gdk5lbFZzTnFUYnlXbklPTTJvZVRSb3lXdndtcEpIZy91Y1hCcmNKdVhUNER3cnB3WmkydnkwVkN4OFl0WGcvRDJiVTRPZml1UTNlRmZFMktENGJmQ3FpTE5COTkzZ1hzR2x3YTJDVDROekJhY0dJVlE2WXNpcFFkaDB4RWRPRFVLakl4clNwODhvblo4emJiRkxnMURvaUZPNUJYdkRHdjJNeTkvSmhVVDhKVVpUSTB5RGFOSExCeklidnFURE5ZaFVpVncva2RqUTFrTTJDSEZEUGpLVytLenlSVEYwZy9nYTl3OXkrZkFOUXB4dlg4Q1UrTnk3RlVXRGVGM1krZzNsUk9JZjRrMFVEWDllQ3l2TzUzMVB5WWhIZ2E5enZQWkpVNWI3M1kvZVhqOEh2OUQ0OG42SGFGNUxiY2pSdDhUWlR0ZGE1TTFEZlhuYmtYMUMwU0hDRkt6UUI1RmU4b3A0R05HTkhhdnZaRVNiVndUNXI2VzF4eXVDUEJZM1k5WWdEcXprbkgvZTNZZk56enVMMzBsMEllYnJaNWtLdHVESVh0MW44NjhFVDZrZjMvNDl0THZyQ2NaeUY4UHUyMTVkQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFjUEliTnJCaE9hQlh1Y29BQUFBQVNVVk9SSzVDWUlJPSI+CjxzY3JpcHQ+LyoqCiAqIEBsaWNlbnNlCiAqIENvcHlyaWdodCAoYykgMjAxNCBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQKICogVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQKICogVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0CiAqIENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvCiAqIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAqLwovLyBAdmVyc2lvbiAwLjcuMjQKIWZ1bmN0aW9uKCl7d2luZG93LldlYkNvbXBvbmVudHM9d2luZG93LldlYkNvbXBvbmVudHN8fHtmbGFnczp7fX07dmFyIGU9IndlYmNvbXBvbmVudHMtbGl0ZS5qcyIsdD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdzY3JpcHRbc3JjKj0iJytlKyciXScpLG49e307aWYoIW4ubm9PcHRzKXtpZihsb2NhdGlvbi5zZWFyY2guc2xpY2UoMSkuc3BsaXQoIiYiKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0LG89ZS5zcGxpdCgiPSIpO29bMF0mJih0PW9bMF0ubWF0Y2goL3djLSguKykvKSkmJihuW3RbMV1dPW9bMV18fCEwKX0pLHQpZm9yKHZhciBvLHI9MDtvPXQuYXR0cmlidXRlc1tyXTtyKyspInNyYyIhPT1vLm5hbWUmJihuW28ubmFtZV09by52YWx1ZXx8ITApO2lmKG4ubG9nJiZuLmxvZy5zcGxpdCl7dmFyIGk9bi5sb2cuc3BsaXQoIiwiKTtuLmxvZz17fSxpLmZvckVhY2goZnVuY3Rpb24oZSl7bi5sb2dbZV09ITB9KX1lbHNlIG4ubG9nPXt9fW4ucmVnaXN0ZXImJih3aW5kb3cuQ3VzdG9tRWxlbWVudHM9d2luZG93LkN1c3RvbUVsZW1lbnRzfHx7ZmxhZ3M6e319LHdpbmRvdy5DdXN0b21FbGVtZW50cy5mbGFncy5yZWdpc3Rlcj1uLnJlZ2lzdGVyKSxXZWJDb21wb25lbnRzLmZsYWdzPW59KCksZnVuY3Rpb24oZSl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHQoZSl7cmV0dXJuIHZvaWQgMCE9PWhbZV19ZnVuY3Rpb24gbigpe3MuY2FsbCh0aGlzKSx0aGlzLl9pc0ludmFsaWQ9ITB9ZnVuY3Rpb24gbyhlKXtyZXR1cm4iIj09ZSYmbi5jYWxsKHRoaXMpLGUudG9Mb3dlckNhc2UoKX1mdW5jdGlvbiByKGUpe3ZhciB0PWUuY2hhckNvZGVBdCgwKTtyZXR1cm4gdD4zMiYmdDwxMjcmJlszNCwzNSw2MCw2Miw2Myw5Nl0uaW5kZXhPZih0KT09LTE/ZTplbmNvZGVVUklDb21wb25lbnQoZSl9ZnVuY3Rpb24gaShlKXt2YXIgdD1lLmNoYXJDb2RlQXQoMCk7cmV0dXJuIHQ+MzImJnQ8MTI3JiZbMzQsMzUsNjAsNjIsOTZdLmluZGV4T2YodCk9PS0xP2U6ZW5jb2RlVVJJQ29tcG9uZW50KGUpfWZ1bmN0aW9uIGEoZSxhLHMpe2Z1bmN0aW9uIGMoZSl7Zy5wdXNoKGUpfXZhciBkPWF8fCJzY2hlbWUgc3RhcnQiLGw9MCx1PSIiLHc9ITEsXz0hMSxnPVtdO2U6Zm9yKDsoZVtsLTFdIT1wfHwwPT1sKSYmIXRoaXMuX2lzSW52YWxpZDspe3ZhciBiPWVbbF07c3dpdGNoKGQpe2Nhc2Uic2NoZW1lIHN0YXJ0IjppZighYnx8IW0udGVzdChiKSl7aWYoYSl7YygiSW52YWxpZCBzY2hlbWUuIik7YnJlYWsgZX11PSIiLGQ9Im5vIHNjaGVtZSI7Y29udGludWV9dSs9Yi50b0xvd2VyQ2FzZSgpLGQ9InNjaGVtZSI7YnJlYWs7Y2FzZSJzY2hlbWUiOmlmKGImJnYudGVzdChiKSl1Kz1iLnRvTG93ZXJDYXNlKCk7ZWxzZXtpZigiOiIhPWIpe2lmKGEpe2lmKHA9PWIpYnJlYWsgZTtjKCJDb2RlIHBvaW50IG5vdCBhbGxvd2VkIGluIHNjaGVtZTogIitiKTticmVhayBlfXU9IiIsbD0wLGQ9Im5vIHNjaGVtZSI7Y29udGludWV9aWYodGhpcy5fc2NoZW1lPXUsdT0iIixhKWJyZWFrIGU7dCh0aGlzLl9zY2hlbWUpJiYodGhpcy5faXNSZWxhdGl2ZT0hMCksZD0iZmlsZSI9PXRoaXMuX3NjaGVtZT8icmVsYXRpdmUiOnRoaXMuX2lzUmVsYXRpdmUmJnMmJnMuX3NjaGVtZT09dGhpcy5fc2NoZW1lPyJyZWxhdGl2ZSBvciBhdXRob3JpdHkiOnRoaXMuX2lzUmVsYXRpdmU/ImF1dGhvcml0eSBmaXJzdCBzbGFzaCI6InNjaGVtZSBkYXRhIn1icmVhaztjYXNlInNjaGVtZSBkYXRhIjoiPyI9PWI/KHRoaXMuX3F1ZXJ5PSI/IixkPSJxdWVyeSIpOiIjIj09Yj8odGhpcy5fZnJhZ21lbnQ9IiMiLGQ9ImZyYWdtZW50Iik6cCE9YiYmIlx0IiE9YiYmIlxuIiE9YiYmIlxyIiE9YiYmKHRoaXMuX3NjaGVtZURhdGErPXIoYikpO2JyZWFrO2Nhc2Uibm8gc2NoZW1lIjppZihzJiZ0KHMuX3NjaGVtZSkpe2Q9InJlbGF0aXZlIjtjb250aW51ZX1jKCJNaXNzaW5nIHNjaGVtZS4iKSxuLmNhbGwodGhpcyk7YnJlYWs7Y2FzZSJyZWxhdGl2ZSBvciBhdXRob3JpdHkiOmlmKCIvIiE9Ynx8Ii8iIT1lW2wrMV0pe2MoIkV4cGVjdGVkIC8sIGdvdDogIitiKSxkPSJyZWxhdGl2ZSI7Y29udGludWV9ZD0iYXV0aG9yaXR5IGlnbm9yZSBzbGFzaGVzIjticmVhaztjYXNlInJlbGF0aXZlIjppZih0aGlzLl9pc1JlbGF0aXZlPSEwLCJmaWxlIiE9dGhpcy5fc2NoZW1lJiYodGhpcy5fc2NoZW1lPXMuX3NjaGVtZSkscD09Yil7dGhpcy5faG9zdD1zLl9ob3N0LHRoaXMuX3BvcnQ9cy5fcG9ydCx0aGlzLl9wYXRoPXMuX3BhdGguc2xpY2UoKSx0aGlzLl9xdWVyeT1zLl9xdWVyeSx0aGlzLl91c2VybmFtZT1zLl91c2VybmFtZSx0aGlzLl9wYXNzd29yZD1zLl9wYXNzd29yZDticmVhayBlfWlmKCIvIj09Ynx8IlxcIj09YikiXFwiPT1iJiZjKCJcXCBpcyBhbiBpbnZhbGlkIGNvZGUgcG9pbnQuIiksZD0icmVsYXRpdmUgc2xhc2giO2Vsc2UgaWYoIj8iPT1iKXRoaXMuX2hvc3Q9cy5faG9zdCx0aGlzLl9wb3J0PXMuX3BvcnQsdGhpcy5fcGF0aD1zLl9wYXRoLnNsaWNlKCksdGhpcy5fcXVlcnk9Ij8iLHRoaXMuX3VzZXJuYW1lPXMuX3VzZXJuYW1lLHRoaXMuX3Bhc3N3b3JkPXMuX3Bhc3N3b3JkLGQ9InF1ZXJ5IjtlbHNle2lmKCIjIiE9Yil7dmFyIHk9ZVtsKzFdLEU9ZVtsKzJdOygiZmlsZSIhPXRoaXMuX3NjaGVtZXx8IW0udGVzdChiKXx8IjoiIT15JiYifCIhPXl8fHAhPUUmJiIvIiE9RSYmIlxcIiE9RSYmIj8iIT1FJiYiIyIhPUUpJiYodGhpcy5faG9zdD1zLl9ob3N0LHRoaXMuX3BvcnQ9cy5fcG9ydCx0aGlzLl91c2VybmFtZT1zLl91c2VybmFtZSx0aGlzLl9wYXNzd29yZD1zLl9wYXNzd29yZCx0aGlzLl9wYXRoPXMuX3BhdGguc2xpY2UoKSx0aGlzLl9wYXRoLnBvcCgpKSxkPSJyZWxhdGl2ZSBwYXRoIjtjb250aW51ZX10aGlzLl9ob3N0PXMuX2hvc3QsdGhpcy5fcG9ydD1zLl9wb3J0LHRoaXMuX3BhdGg9cy5fcGF0aC5zbGljZSgpLHRoaXMuX3F1ZXJ5PXMuX3F1ZXJ5LHRoaXMuX2ZyYWdtZW50PSIjIix0aGlzLl91c2VybmFtZT1zLl91c2VybmFtZSx0aGlzLl9wYXNzd29yZD1zLl9wYXNzd29yZCxkPSJmcmFnbWVudCJ9YnJlYWs7Y2FzZSJyZWxhdGl2ZSBzbGFzaCI6aWYoIi8iIT1iJiYiXFwiIT1iKXsiZmlsZSIhPXRoaXMuX3NjaGVtZSYmKHRoaXMuX2hvc3Q9cy5faG9zdCx0aGlzLl9wb3J0PXMuX3BvcnQsdGhpcy5fdXNlcm5hbWU9cy5fdXNlcm5hbWUsdGhpcy5fcGFzc3dvcmQ9cy5fcGFzc3dvcmQpLGQ9InJlbGF0aXZlIHBhdGgiO2NvbnRpbnVlfSJcXCI9PWImJmMoIlxcIGlzIGFuIGludmFsaWQgY29kZSBwb2ludC4iKSxkPSJmaWxlIj09dGhpcy5fc2NoZW1lPyJmaWxlIGhvc3QiOiJhdXRob3JpdHkgaWdub3JlIHNsYXNoZXMiO2JyZWFrO2Nhc2UiYXV0aG9yaXR5IGZpcnN0IHNsYXNoIjppZigiLyIhPWIpe2MoIkV4cGVjdGVkICcvJywgZ290OiAiK2IpLGQ9ImF1dGhvcml0eSBpZ25vcmUgc2xhc2hlcyI7Y29udGludWV9ZD0iYXV0aG9yaXR5IHNlY29uZCBzbGFzaCI7YnJlYWs7Y2FzZSJhdXRob3JpdHkgc2Vjb25kIHNsYXNoIjppZihkPSJhdXRob3JpdHkgaWdub3JlIHNsYXNoZXMiLCIvIiE9Yil7YygiRXhwZWN0ZWQgJy8nLCBnb3Q6ICIrYik7Y29udGludWV9YnJlYWs7Y2FzZSJhdXRob3JpdHkgaWdub3JlIHNsYXNoZXMiOmlmKCIvIiE9YiYmIlxcIiE9Yil7ZD0iYXV0aG9yaXR5Ijtjb250aW51ZX1jKCJFeHBlY3RlZCBhdXRob3JpdHksIGdvdDogIitiKTticmVhaztjYXNlImF1dGhvcml0eSI6aWYoIkAiPT1iKXt3JiYoYygiQCBhbHJlYWR5IHNlZW4uIiksdSs9IiU0MCIpLHc9ITA7Zm9yKHZhciBMPTA7TDx1Lmxlbmd0aDtMKyspe3ZhciBOPXVbTF07aWYoIlx0IiE9TiYmIlxuIiE9TiYmIlxyIiE9TilpZigiOiIhPU58fG51bGwhPT10aGlzLl9wYXNzd29yZCl7dmFyIE09cihOKTtudWxsIT09dGhpcy5fcGFzc3dvcmQ/dGhpcy5fcGFzc3dvcmQrPU06dGhpcy5fdXNlcm5hbWUrPU19ZWxzZSB0aGlzLl9wYXNzd29yZD0iIjtlbHNlIGMoIkludmFsaWQgd2hpdGVzcGFjZSBpbiBhdXRob3JpdHkuIil9dT0iIn1lbHNle2lmKHA9PWJ8fCIvIj09Ynx8IlxcIj09Ynx8Ij8iPT1ifHwiIyI9PWIpe2wtPXUubGVuZ3RoLHU9IiIsZD0iaG9zdCI7Y29udGludWV9dSs9Yn1icmVhaztjYXNlImZpbGUgaG9zdCI6aWYocD09Ynx8Ii8iPT1ifHwiXFwiPT1ifHwiPyI9PWJ8fCIjIj09Yil7MiE9dS5sZW5ndGh8fCFtLnRlc3QodVswXSl8fCI6IiE9dVsxXSYmInwiIT11WzFdPzA9PXUubGVuZ3RoP2Q9InJlbGF0aXZlIHBhdGggc3RhcnQiOih0aGlzLl9ob3N0PW8uY2FsbCh0aGlzLHUpLHU9IiIsZD0icmVsYXRpdmUgcGF0aCBzdGFydCIpOmQ9InJlbGF0aXZlIHBhdGgiO2NvbnRpbnVlfSJcdCI9PWJ8fCJcbiI9PWJ8fCJcciI9PWI/YygiSW52YWxpZCB3aGl0ZXNwYWNlIGluIGZpbGUgaG9zdC4iKTp1Kz1iO2JyZWFrO2Nhc2UiaG9zdCI6Y2FzZSJob3N0bmFtZSI6aWYoIjoiIT1ifHxfKXtpZihwPT1ifHwiLyI9PWJ8fCJcXCI9PWJ8fCI/Ij09Ynx8IiMiPT1iKXtpZih0aGlzLl9ob3N0PW8uY2FsbCh0aGlzLHUpLHU9IiIsZD0icmVsYXRpdmUgcGF0aCBzdGFydCIsYSlicmVhayBlO2NvbnRpbnVlfSJcdCIhPWImJiJcbiIhPWImJiJcciIhPWI/KCJbIj09Yj9fPSEwOiJdIj09YiYmKF89ITEpLHUrPWIpOmMoIkludmFsaWQgY29kZSBwb2ludCBpbiBob3N0L2hvc3RuYW1lOiAiK2IpfWVsc2UgaWYodGhpcy5faG9zdD1vLmNhbGwodGhpcyx1KSx1PSIiLGQ9InBvcnQiLCJob3N0bmFtZSI9PWEpYnJlYWsgZTticmVhaztjYXNlInBvcnQiOmlmKC9bMC05XS8udGVzdChiKSl1Kz1iO2Vsc2V7aWYocD09Ynx8Ii8iPT1ifHwiXFwiPT1ifHwiPyI9PWJ8fCIjIj09Ynx8YSl7aWYoIiIhPXUpe3ZhciBUPXBhcnNlSW50KHUsMTApO1QhPWhbdGhpcy5fc2NoZW1lXSYmKHRoaXMuX3BvcnQ9VCsiIiksdT0iIn1pZihhKWJyZWFrIGU7ZD0icmVsYXRpdmUgcGF0aCBzdGFydCI7Y29udGludWV9Ilx0Ij09Ynx8IlxuIj09Ynx8IlxyIj09Yj9jKCJJbnZhbGlkIGNvZGUgcG9pbnQgaW4gcG9ydDogIitiKTpuLmNhbGwodGhpcyl9YnJlYWs7Y2FzZSJyZWxhdGl2ZSBwYXRoIHN0YXJ0IjppZigiXFwiPT1iJiZjKCInXFwnIG5vdCBhbGxvd2VkIGluIHBhdGguIiksZD0icmVsYXRpdmUgcGF0aCIsIi8iIT1iJiYiXFwiIT1iKWNvbnRpbnVlO2JyZWFrO2Nhc2UicmVsYXRpdmUgcGF0aCI6aWYocCE9YiYmIi8iIT1iJiYiXFwiIT1iJiYoYXx8Ij8iIT1iJiYiIyIhPWIpKSJcdCIhPWImJiJcbiIhPWImJiJcciIhPWImJih1Kz1yKGIpKTtlbHNleyJcXCI9PWImJmMoIlxcIG5vdCBhbGxvd2VkIGluIHJlbGF0aXZlIHBhdGguIik7dmFyIE87KE89Zlt1LnRvTG93ZXJDYXNlKCldKSYmKHU9TyksIi4uIj09dT8odGhpcy5fcGF0aC5wb3AoKSwiLyIhPWImJiJcXCIhPWImJnRoaXMuX3BhdGgucHVzaCgiIikpOiIuIj09dSYmIi8iIT1iJiYiXFwiIT1iP3RoaXMuX3BhdGgucHVzaCgiIik6Ii4iIT11JiYoImZpbGUiPT10aGlzLl9zY2hlbWUmJjA9PXRoaXMuX3BhdGgubGVuZ3RoJiYyPT11Lmxlbmd0aCYmbS50ZXN0KHVbMF0pJiYifCI9PXVbMV0mJih1PXVbMF0rIjoiKSx0aGlzLl9wYXRoLnB1c2godSkpLHU9IiIsIj8iPT1iPyh0aGlzLl9xdWVyeT0iPyIsZD0icXVlcnkiKToiIyI9PWImJih0aGlzLl9mcmFnbWVudD0iIyIsZD0iZnJhZ21lbnQiKX1icmVhaztjYXNlInF1ZXJ5IjphfHwiIyIhPWI/cCE9YiYmIlx0IiE9YiYmIlxuIiE9YiYmIlxyIiE9YiYmKHRoaXMuX3F1ZXJ5Kz1pKGIpKToodGhpcy5fZnJhZ21lbnQ9IiMiLGQ9ImZyYWdtZW50Iik7YnJlYWs7Y2FzZSJmcmFnbWVudCI6cCE9YiYmIlx0IiE9YiYmIlxuIiE9YiYmIlxyIiE9YiYmKHRoaXMuX2ZyYWdtZW50Kz1iKX1sKyt9fWZ1bmN0aW9uIHMoKXt0aGlzLl9zY2hlbWU9IiIsdGhpcy5fc2NoZW1lRGF0YT0iIix0aGlzLl91c2VybmFtZT0iIix0aGlzLl9wYXNzd29yZD1udWxsLHRoaXMuX2hvc3Q9IiIsdGhpcy5fcG9ydD0iIix0aGlzLl9wYXRoPVtdLHRoaXMuX3F1ZXJ5PSIiLHRoaXMuX2ZyYWdtZW50PSIiLHRoaXMuX2lzSW52YWxpZD0hMSx0aGlzLl9pc1JlbGF0aXZlPSExfWZ1bmN0aW9uIGMoZSx0KXt2b2lkIDA9PT10fHx0IGluc3RhbmNlb2YgY3x8KHQ9bmV3IGMoU3RyaW5nKHQpKSksdGhpcy5fdXJsPWUscy5jYWxsKHRoaXMpO3ZhciBuPWUucmVwbGFjZSgvXlsgXHRcclxuXGZdK3xbIFx0XHJcblxmXSskL2csIiIpO2EuY2FsbCh0aGlzLG4sbnVsbCx0KX12YXIgZD0hMTtpZighZS5mb3JjZUpVUkwpdHJ5e3ZhciBsPW5ldyBVUkwoImIiLCJodHRwOi8vYSIpO2wucGF0aG5hbWU9ImMlMjBkIixkPSJodHRwOi8vYS9jJTIwZCI9PT1sLmhyZWZ9Y2F0Y2godSl7fWlmKCFkKXt2YXIgaD1PYmplY3QuY3JlYXRlKG51bGwpO2guZnRwPTIxLGguZmlsZT0wLGguZ29waGVyPTcwLGguaHR0cD04MCxoLmh0dHBzPTQ0MyxoLndzPTgwLGgud3NzPTQ0Mzt2YXIgZj1PYmplY3QuY3JlYXRlKG51bGwpO2ZbIiUyZSJdPSIuIixmWyIuJTJlIl09Ii4uIixmWyIlMmUuIl09Ii4uIixmWyIlMmUlMmUiXT0iLi4iO3ZhciBwPXZvaWQgMCxtPS9bYS16QS1aXS8sdj0vW2EtekEtWjAtOVwrXC1cLl0vO2MucHJvdG90eXBlPXt0b1N0cmluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmhyZWZ9LGdldCBocmVmKCl7aWYodGhpcy5faXNJbnZhbGlkKXJldHVybiB0aGlzLl91cmw7dmFyIGU9IiI7cmV0dXJuIiI9PXRoaXMuX3VzZXJuYW1lJiZudWxsPT10aGlzLl9wYXNzd29yZHx8KGU9dGhpcy5fdXNlcm5hbWUrKG51bGwhPXRoaXMuX3Bhc3N3b3JkPyI6Iit0aGlzLl9wYXNzd29yZDoiIikrIkAiKSx0aGlzLnByb3RvY29sKyh0aGlzLl9pc1JlbGF0aXZlPyIvLyIrZSt0aGlzLmhvc3Q6IiIpK3RoaXMucGF0aG5hbWUrdGhpcy5fcXVlcnkrdGhpcy5fZnJhZ21lbnR9LHNldCBocmVmKGUpe3MuY2FsbCh0aGlzKSxhLmNhbGwodGhpcyxlKX0sZ2V0IHByb3RvY29sKCl7cmV0dXJuIHRoaXMuX3NjaGVtZSsiOiJ9LHNldCBwcm90b2NvbChlKXt0aGlzLl9pc0ludmFsaWR8fGEuY2FsbCh0aGlzLGUrIjoiLCJzY2hlbWUgc3RhcnQiKX0sZ2V0IGhvc3QoKXtyZXR1cm4gdGhpcy5faXNJbnZhbGlkPyIiOnRoaXMuX3BvcnQ/dGhpcy5faG9zdCsiOiIrdGhpcy5fcG9ydDp0aGlzLl9ob3N0fSxzZXQgaG9zdChlKXshdGhpcy5faXNJbnZhbGlkJiZ0aGlzLl9pc1JlbGF0aXZlJiZhLmNhbGwodGhpcyxlLCJob3N0Iil9LGdldCBob3N0bmFtZSgpe3JldHVybiB0aGlzLl9ob3N0fSxzZXQgaG9zdG5hbWUoZSl7IXRoaXMuX2lzSW52YWxpZCYmdGhpcy5faXNSZWxhdGl2ZSYmYS5jYWxsKHRoaXMsZSwiaG9zdG5hbWUiKX0sZ2V0IHBvcnQoKXtyZXR1cm4gdGhpcy5fcG9ydH0sc2V0IHBvcnQoZSl7IXRoaXMuX2lzSW52YWxpZCYmdGhpcy5faXNSZWxhdGl2ZSYmYS5jYWxsKHRoaXMsZSwicG9ydCIpfSxnZXQgcGF0aG5hbWUoKXtyZXR1cm4gdGhpcy5faXNJbnZhbGlkPyIiOnRoaXMuX2lzUmVsYXRpdmU/Ii8iK3RoaXMuX3BhdGguam9pbigiLyIpOnRoaXMuX3NjaGVtZURhdGF9LHNldCBwYXRobmFtZShlKXshdGhpcy5faXNJbnZhbGlkJiZ0aGlzLl9pc1JlbGF0aXZlJiYodGhpcy5fcGF0aD1bXSxhLmNhbGwodGhpcyxlLCJyZWxhdGl2ZSBwYXRoIHN0YXJ0IikpfSxnZXQgc2VhcmNoKCl7cmV0dXJuIHRoaXMuX2lzSW52YWxpZHx8IXRoaXMuX3F1ZXJ5fHwiPyI9PXRoaXMuX3F1ZXJ5PyIiOnRoaXMuX3F1ZXJ5fSxzZXQgc2VhcmNoKGUpeyF0aGlzLl9pc0ludmFsaWQmJnRoaXMuX2lzUmVsYXRpdmUmJih0aGlzLl9xdWVyeT0iPyIsIj8iPT1lWzBdJiYoZT1lLnNsaWNlKDEpKSxhLmNhbGwodGhpcyxlLCJxdWVyeSIpKX0sZ2V0IGhhc2goKXtyZXR1cm4gdGhpcy5faXNJbnZhbGlkfHwhdGhpcy5fZnJhZ21lbnR8fCIjIj09dGhpcy5fZnJhZ21lbnQ/IiI6dGhpcy5fZnJhZ21lbnR9LHNldCBoYXNoKGUpe3RoaXMuX2lzSW52YWxpZHx8KHRoaXMuX2ZyYWdtZW50PSIjIiwiIyI9PWVbMF0mJihlPWUuc2xpY2UoMSkpLGEuY2FsbCh0aGlzLGUsImZyYWdtZW50IikpfSxnZXQgb3JpZ2luKCl7dmFyIGU7aWYodGhpcy5faXNJbnZhbGlkfHwhdGhpcy5fc2NoZW1lKXJldHVybiIiO3N3aXRjaCh0aGlzLl9zY2hlbWUpe2Nhc2UiZGF0YSI6Y2FzZSJmaWxlIjpjYXNlImphdmFzY3JpcHQiOmNhc2UibWFpbHRvIjpyZXR1cm4ibnVsbCJ9cmV0dXJuIGU9dGhpcy5ob3N0LGU/dGhpcy5fc2NoZW1lKyI6Ly8iK2U6IiJ9fTt2YXIgdz1lLlVSTDt3JiYoYy5jcmVhdGVPYmplY3RVUkw9ZnVuY3Rpb24oZSl7cmV0dXJuIHcuY3JlYXRlT2JqZWN0VVJMLmFwcGx5KHcsYXJndW1lbnRzKX0sYy5yZXZva2VPYmplY3RVUkw9ZnVuY3Rpb24oZSl7dy5yZXZva2VPYmplY3RVUkwoZSl9KSxlLlVSTD1jfX0oc2VsZiksInVuZGVmaW5lZCI9PXR5cGVvZiBXZWFrTWFwJiYhZnVuY3Rpb24oKXt2YXIgZT1PYmplY3QuZGVmaW5lUHJvcGVydHksdD1EYXRlLm5vdygpJTFlOSxuPWZ1bmN0aW9uKCl7dGhpcy5uYW1lPSJfX3N0IisoMWU5Kk1hdGgucmFuZG9tKCk+Pj4wKSsodCsrICsiX18iKX07bi5wcm90b3R5cGU9e3NldDpmdW5jdGlvbih0LG4pe3ZhciBvPXRbdGhpcy5uYW1lXTtyZXR1cm4gbyYmb1swXT09PXQ/b1sxXT1uOmUodCx0aGlzLm5hbWUse3ZhbHVlOlt0LG5dLHdyaXRhYmxlOiEwfSksdGhpc30sZ2V0OmZ1bmN0aW9uKGUpe3ZhciB0O3JldHVybih0PWVbdGhpcy5uYW1lXSkmJnRbMF09PT1lP3RbMV06dm9pZCAwfSwiZGVsZXRlIjpmdW5jdGlvbihlKXt2YXIgdD1lW3RoaXMubmFtZV07cmV0dXJuISghdHx8dFswXSE9PWUpJiYodFswXT10WzFdPXZvaWQgMCwhMCl9LGhhczpmdW5jdGlvbihlKXt2YXIgdD1lW3RoaXMubmFtZV07cmV0dXJuISF0JiZ0WzBdPT09ZX19LHdpbmRvdy5XZWFrTWFwPW59KCksZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChlKXtiLnB1c2goZSksZ3x8KGc9ITAsbShvKSl9ZnVuY3Rpb24gbihlKXtyZXR1cm4gd2luZG93LlNoYWRvd0RPTVBvbHlmaWxsJiZ3aW5kb3cuU2hhZG93RE9NUG9seWZpbGwud3JhcElmTmVlZGVkKGUpfHxlfWZ1bmN0aW9uIG8oKXtnPSExO3ZhciBlPWI7Yj1bXSxlLnNvcnQoZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS51aWRfLXQudWlkX30pO3ZhciB0PSExO2UuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgbj1lLnRha2VSZWNvcmRzKCk7cihlKSxuLmxlbmd0aCYmKGUuY2FsbGJhY2tfKG4sZSksdD0hMCl9KSx0JiZvKCl9ZnVuY3Rpb24gcihlKXtlLm5vZGVzXy5mb3JFYWNoKGZ1bmN0aW9uKHQpe3ZhciBuPXYuZ2V0KHQpO24mJm4uZm9yRWFjaChmdW5jdGlvbih0KXt0Lm9ic2VydmVyPT09ZSYmdC5yZW1vdmVUcmFuc2llbnRPYnNlcnZlcnMoKX0pfSl9ZnVuY3Rpb24gaShlLHQpe2Zvcih2YXIgbj1lO247bj1uLnBhcmVudE5vZGUpe3ZhciBvPXYuZ2V0KG4pO2lmKG8pZm9yKHZhciByPTA7cjxvLmxlbmd0aDtyKyspe3ZhciBpPW9bcl0sYT1pLm9wdGlvbnM7aWYobj09PWV8fGEuc3VidHJlZSl7dmFyIHM9dChhKTtzJiZpLmVucXVldWUocyl9fX19ZnVuY3Rpb24gYShlKXt0aGlzLmNhbGxiYWNrXz1lLHRoaXMubm9kZXNfPVtdLHRoaXMucmVjb3Jkc189W10sdGhpcy51aWRfPSsreX1mdW5jdGlvbiBzKGUsdCl7dGhpcy50eXBlPWUsdGhpcy50YXJnZXQ9dCx0aGlzLmFkZGVkTm9kZXM9W10sdGhpcy5yZW1vdmVkTm9kZXM9W10sdGhpcy5wcmV2aW91c1NpYmxpbmc9bnVsbCx0aGlzLm5leHRTaWJsaW5nPW51bGwsdGhpcy5hdHRyaWJ1dGVOYW1lPW51bGwsdGhpcy5hdHRyaWJ1dGVOYW1lc3BhY2U9bnVsbCx0aGlzLm9sZFZhbHVlPW51bGx9ZnVuY3Rpb24gYyhlKXt2YXIgdD1uZXcgcyhlLnR5cGUsZS50YXJnZXQpO3JldHVybiB0LmFkZGVkTm9kZXM9ZS5hZGRlZE5vZGVzLnNsaWNlKCksdC5yZW1vdmVkTm9kZXM9ZS5yZW1vdmVkTm9kZXMuc2xpY2UoKSx0LnByZXZpb3VzU2libGluZz1lLnByZXZpb3VzU2libGluZyx0Lm5leHRTaWJsaW5nPWUubmV4dFNpYmxpbmcsdC5hdHRyaWJ1dGVOYW1lPWUuYXR0cmlidXRlTmFtZSx0LmF0dHJpYnV0ZU5hbWVzcGFjZT1lLmF0dHJpYnV0ZU5hbWVzcGFjZSx0Lm9sZFZhbHVlPWUub2xkVmFsdWUsdH1mdW5jdGlvbiBkKGUsdCl7cmV0dXJuIEU9bmV3IHMoZSx0KX1mdW5jdGlvbiBsKGUpe3JldHVybiBMP0w6KEw9YyhFKSxMLm9sZFZhbHVlPWUsTCl9ZnVuY3Rpb24gdSgpe0U9TD12b2lkIDB9ZnVuY3Rpb24gaChlKXtyZXR1cm4gZT09PUx8fGU9PT1FfWZ1bmN0aW9uIGYoZSx0KXtyZXR1cm4gZT09PXQ/ZTpMJiZoKGUpP0w6bnVsbH1mdW5jdGlvbiBwKGUsdCxuKXt0aGlzLm9ic2VydmVyPWUsdGhpcy50YXJnZXQ9dCx0aGlzLm9wdGlvbnM9bix0aGlzLnRyYW5zaWVudE9ic2VydmVkTm9kZXM9W119aWYoIWUuSnNNdXRhdGlvbk9ic2VydmVyKXt2YXIgbSx2PW5ldyBXZWFrTWFwO2lmKC9UcmlkZW50fEVkZ2UvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkpbT1zZXRUaW1lb3V0O2Vsc2UgaWYod2luZG93LnNldEltbWVkaWF0ZSltPXdpbmRvdy5zZXRJbW1lZGlhdGU7ZWxzZXt2YXIgdz1bXSxfPVN0cmluZyhNYXRoLnJhbmRvbSgpKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsZnVuY3Rpb24oZSl7aWYoZS5kYXRhPT09Xyl7dmFyIHQ9dzt3PVtdLHQuZm9yRWFjaChmdW5jdGlvbihlKXtlKCl9KX19KSxtPWZ1bmN0aW9uKGUpe3cucHVzaChlKSx3aW5kb3cucG9zdE1lc3NhZ2UoXywiKiIpfX12YXIgZz0hMSxiPVtdLHk9MDthLnByb3RvdHlwZT17b2JzZXJ2ZTpmdW5jdGlvbihlLHQpe2lmKGU9bihlKSwhdC5jaGlsZExpc3QmJiF0LmF0dHJpYnV0ZXMmJiF0LmNoYXJhY3RlckRhdGF8fHQuYXR0cmlidXRlT2xkVmFsdWUmJiF0LmF0dHJpYnV0ZXN8fHQuYXR0cmlidXRlRmlsdGVyJiZ0LmF0dHJpYnV0ZUZpbHRlci5sZW5ndGgmJiF0LmF0dHJpYnV0ZXN8fHQuY2hhcmFjdGVyRGF0YU9sZFZhbHVlJiYhdC5jaGFyYWN0ZXJEYXRhKXRocm93IG5ldyBTeW50YXhFcnJvcjt2YXIgbz12LmdldChlKTtvfHx2LnNldChlLG89W10pO2Zvcih2YXIgcixpPTA7aTxvLmxlbmd0aDtpKyspaWYob1tpXS5vYnNlcnZlcj09PXRoaXMpe3I9b1tpXSxyLnJlbW92ZUxpc3RlbmVycygpLHIub3B0aW9ucz10O2JyZWFrfXJ8fChyPW5ldyBwKHRoaXMsZSx0KSxvLnB1c2gociksdGhpcy5ub2Rlc18ucHVzaChlKSksci5hZGRMaXN0ZW5lcnMoKX0sZGlzY29ubmVjdDpmdW5jdGlvbigpe3RoaXMubm9kZXNfLmZvckVhY2goZnVuY3Rpb24oZSl7Zm9yKHZhciB0PXYuZ2V0KGUpLG49MDtuPHQubGVuZ3RoO24rKyl7dmFyIG89dFtuXTtpZihvLm9ic2VydmVyPT09dGhpcyl7by5yZW1vdmVMaXN0ZW5lcnMoKSx0LnNwbGljZShuLDEpO2JyZWFrfX19LHRoaXMpLHRoaXMucmVjb3Jkc189W119LHRha2VSZWNvcmRzOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5yZWNvcmRzXztyZXR1cm4gdGhpcy5yZWNvcmRzXz1bXSxlfX07dmFyIEUsTDtwLnByb3RvdHlwZT17ZW5xdWV1ZTpmdW5jdGlvbihlKXt2YXIgbj10aGlzLm9ic2VydmVyLnJlY29yZHNfLG89bi5sZW5ndGg7aWYobi5sZW5ndGg+MCl7dmFyIHI9bltvLTFdLGk9ZihyLGUpO2lmKGkpcmV0dXJuIHZvaWQobltvLTFdPWkpfWVsc2UgdCh0aGlzLm9ic2VydmVyKTtuW29dPWV9LGFkZExpc3RlbmVyczpmdW5jdGlvbigpe3RoaXMuYWRkTGlzdGVuZXJzXyh0aGlzLnRhcmdldCl9LGFkZExpc3RlbmVyc186ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5vcHRpb25zO3QuYXR0cmlidXRlcyYmZS5hZGRFdmVudExpc3RlbmVyKCJET01BdHRyTW9kaWZpZWQiLHRoaXMsITApLHQuY2hhcmFjdGVyRGF0YSYmZS5hZGRFdmVudExpc3RlbmVyKCJET01DaGFyYWN0ZXJEYXRhTW9kaWZpZWQiLHRoaXMsITApLHQuY2hpbGRMaXN0JiZlLmFkZEV2ZW50TGlzdGVuZXIoIkRPTU5vZGVJbnNlcnRlZCIsdGhpcywhMCksKHQuY2hpbGRMaXN0fHx0LnN1YnRyZWUpJiZlLmFkZEV2ZW50TGlzdGVuZXIoIkRPTU5vZGVSZW1vdmVkIix0aGlzLCEwKX0scmVtb3ZlTGlzdGVuZXJzOmZ1bmN0aW9uKCl7dGhpcy5yZW1vdmVMaXN0ZW5lcnNfKHRoaXMudGFyZ2V0KX0scmVtb3ZlTGlzdGVuZXJzXzpmdW5jdGlvbihlKXt2YXIgdD10aGlzLm9wdGlvbnM7dC5hdHRyaWJ1dGVzJiZlLnJlbW92ZUV2ZW50TGlzdGVuZXIoIkRPTUF0dHJNb2RpZmllZCIsdGhpcywhMCksdC5jaGFyYWN0ZXJEYXRhJiZlLnJlbW92ZUV2ZW50TGlzdGVuZXIoIkRPTUNoYXJhY3RlckRhdGFNb2RpZmllZCIsdGhpcywhMCksdC5jaGlsZExpc3QmJmUucmVtb3ZlRXZlbnRMaXN0ZW5lcigiRE9NTm9kZUluc2VydGVkIix0aGlzLCEwKSwodC5jaGlsZExpc3R8fHQuc3VidHJlZSkmJmUucmVtb3ZlRXZlbnRMaXN0ZW5lcigiRE9NTm9kZVJlbW92ZWQiLHRoaXMsITApfSxhZGRUcmFuc2llbnRPYnNlcnZlcjpmdW5jdGlvbihlKXtpZihlIT09dGhpcy50YXJnZXQpe3RoaXMuYWRkTGlzdGVuZXJzXyhlKSx0aGlzLnRyYW5zaWVudE9ic2VydmVkTm9kZXMucHVzaChlKTt2YXIgdD12LmdldChlKTt0fHx2LnNldChlLHQ9W10pLHQucHVzaCh0aGlzKX19LHJlbW92ZVRyYW5zaWVudE9ic2VydmVyczpmdW5jdGlvbigpe3ZhciBlPXRoaXMudHJhbnNpZW50T2JzZXJ2ZWROb2Rlczt0aGlzLnRyYW5zaWVudE9ic2VydmVkTm9kZXM9W10sZS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3RoaXMucmVtb3ZlTGlzdGVuZXJzXyhlKTtmb3IodmFyIHQ9di5nZXQoZSksbj0wO248dC5sZW5ndGg7bisrKWlmKHRbbl09PT10aGlzKXt0LnNwbGljZShuLDEpO2JyZWFrfX0sdGhpcyl9LGhhbmRsZUV2ZW50OmZ1bmN0aW9uKGUpe3N3aXRjaChlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpLGUudHlwZSl7Y2FzZSJET01BdHRyTW9kaWZpZWQiOnZhciB0PWUuYXR0ck5hbWUsbj1lLnJlbGF0ZWROb2RlLm5hbWVzcGFjZVVSSSxvPWUudGFyZ2V0LHI9bmV3IGQoImF0dHJpYnV0ZXMiLG8pO3IuYXR0cmlidXRlTmFtZT10LHIuYXR0cmlidXRlTmFtZXNwYWNlPW47dmFyIGE9ZS5hdHRyQ2hhbmdlPT09TXV0YXRpb25FdmVudC5BRERJVElPTj9udWxsOmUucHJldlZhbHVlO2kobyxmdW5jdGlvbihlKXtpZihlLmF0dHJpYnV0ZXMmJighZS5hdHRyaWJ1dGVGaWx0ZXJ8fCFlLmF0dHJpYnV0ZUZpbHRlci5sZW5ndGh8fGUuYXR0cmlidXRlRmlsdGVyLmluZGV4T2YodCkhPT0tMXx8ZS5hdHRyaWJ1dGVGaWx0ZXIuaW5kZXhPZihuKSE9PS0xKSlyZXR1cm4gZS5hdHRyaWJ1dGVPbGRWYWx1ZT9sKGEpOnJ9KTticmVhaztjYXNlIkRPTUNoYXJhY3RlckRhdGFNb2RpZmllZCI6dmFyIG89ZS50YXJnZXQscj1kKCJjaGFyYWN0ZXJEYXRhIixvKSxhPWUucHJldlZhbHVlO2kobyxmdW5jdGlvbihlKXtpZihlLmNoYXJhY3RlckRhdGEpcmV0dXJuIGUuY2hhcmFjdGVyRGF0YU9sZFZhbHVlP2woYSk6cn0pO2JyZWFrO2Nhc2UiRE9NTm9kZVJlbW92ZWQiOnRoaXMuYWRkVHJhbnNpZW50T2JzZXJ2ZXIoZS50YXJnZXQpO2Nhc2UiRE9NTm9kZUluc2VydGVkIjp2YXIgcyxjLGg9ZS50YXJnZXQ7IkRPTU5vZGVJbnNlcnRlZCI9PT1lLnR5cGU/KHM9W2hdLGM9W10pOihzPVtdLGM9W2hdKTt2YXIgZj1oLnByZXZpb3VzU2libGluZyxwPWgubmV4dFNpYmxpbmcscj1kKCJjaGlsZExpc3QiLGUudGFyZ2V0LnBhcmVudE5vZGUpO3IuYWRkZWROb2Rlcz1zLHIucmVtb3ZlZE5vZGVzPWMsci5wcmV2aW91c1NpYmxpbmc9ZixyLm5leHRTaWJsaW5nPXAsaShlLnJlbGF0ZWROb2RlLGZ1bmN0aW9uKGUpe2lmKGUuY2hpbGRMaXN0KXJldHVybiByfSl9dSgpfX0sZS5Kc011dGF0aW9uT2JzZXJ2ZXI9YSxlLk11dGF0aW9uT2JzZXJ2ZXJ8fChlLk11dGF0aW9uT2JzZXJ2ZXI9YSxhLl9pc1BvbHlmaWxsZWQ9ITApfX0oc2VsZiksZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUpe3N3aXRjaChlKXtjYXNlIiYiOnJldHVybiImYW1wOyI7Y2FzZSI8IjpyZXR1cm4iJmx0OyI7Y2FzZSI+IjpyZXR1cm4iJmd0OyI7Y2FzZSLCoCI6cmV0dXJuIiZuYnNwOyJ9fWZ1bmN0aW9uIHQodCl7cmV0dXJuIHQucmVwbGFjZSh1LGUpfXZhciBuPSJ1bmRlZmluZWQiPT10eXBlb2YgSFRNTFRlbXBsYXRlRWxlbWVudDsvVHJpZGVudC8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmIWZ1bmN0aW9uKCl7dmFyIGU9ZG9jdW1lbnQuaW1wb3J0Tm9kZTtkb2N1bWVudC5pbXBvcnROb2RlPWZ1bmN0aW9uKCl7dmFyIHQ9ZS5hcHBseShkb2N1bWVudCxhcmd1bWVudHMpO2lmKHQubm9kZVR5cGU9PT1Ob2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREUpe3ZhciBuPWRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtyZXR1cm4gbi5hcHBlbmRDaGlsZCh0KSxufXJldHVybiB0fX0oKTt2YXIgbz1mdW5jdGlvbigpe2lmKCFuKXt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZW1wbGF0ZSIpLHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGVtcGxhdGUiKTt0LmNvbnRlbnQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikpLGUuY29udGVudC5hcHBlbmRDaGlsZCh0KTt2YXIgbz1lLmNsb25lTm9kZSghMCk7cmV0dXJuIDA9PT1vLmNvbnRlbnQuY2hpbGROb2Rlcy5sZW5ndGh8fDA9PT1vLmNvbnRlbnQuZmlyc3RDaGlsZC5jb250ZW50LmNoaWxkTm9kZXMubGVuZ3RofX0oKSxyPSJ0ZW1wbGF0ZSIsaT1mdW5jdGlvbigpe307aWYobil7dmFyIGE9ZG9jdW1lbnQuaW1wbGVtZW50YXRpb24uY3JlYXRlSFRNTERvY3VtZW50KCJ0ZW1wbGF0ZSIpLHM9ITAsYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzdHlsZSIpO2MudGV4dENvbnRlbnQ9cisie2Rpc3BsYXk6bm9uZTt9Ijt2YXIgZD1kb2N1bWVudC5oZWFkO2QuaW5zZXJ0QmVmb3JlKGMsZC5maXJzdEVsZW1lbnRDaGlsZCksaS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShIVE1MRWxlbWVudC5wcm90b3R5cGUpLGkuZGVjb3JhdGU9ZnVuY3Rpb24oZSl7aWYoIWUuY29udGVudCl7ZS5jb250ZW50PWEuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO2Zvcih2YXIgbjtuPWUuZmlyc3RDaGlsZDspZS5jb250ZW50LmFwcGVuZENoaWxkKG4pO2lmKGUuY2xvbmVOb2RlPWZ1bmN0aW9uKGUpe3JldHVybiBpLmNsb25lTm9kZSh0aGlzLGUpfSxzKXRyeXtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiaW5uZXJIVE1MIix7Z2V0OmZ1bmN0aW9uKCl7Zm9yKHZhciBlPSIiLG49dGhpcy5jb250ZW50LmZpcnN0Q2hpbGQ7bjtuPW4ubmV4dFNpYmxpbmcpZSs9bi5vdXRlckhUTUx8fHQobi5kYXRhKTtyZXR1cm4gZX0sc2V0OmZ1bmN0aW9uKGUpe2ZvcihhLmJvZHkuaW5uZXJIVE1MPWUsaS5ib290c3RyYXAoYSk7dGhpcy5jb250ZW50LmZpcnN0Q2hpbGQ7KXRoaXMuY29udGVudC5yZW1vdmVDaGlsZCh0aGlzLmNvbnRlbnQuZmlyc3RDaGlsZCk7Zm9yKDthLmJvZHkuZmlyc3RDaGlsZDspdGhpcy5jb250ZW50LmFwcGVuZENoaWxkKGEuYm9keS5maXJzdENoaWxkKX0sY29uZmlndXJhYmxlOiEwfSl9Y2F0Y2gobyl7cz0hMX1pLmJvb3RzdHJhcChlLmNvbnRlbnQpfX0saS5ib290c3RyYXA9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0LG49ZS5xdWVyeVNlbGVjdG9yQWxsKHIpLG89MCxhPW4ubGVuZ3RoO288YSYmKHQ9bltvXSk7bysrKWkuZGVjb3JhdGUodCl9LGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLGZ1bmN0aW9uKCl7aS5ib290c3RyYXAoZG9jdW1lbnQpfSk7dmFyIGw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudDtkb2N1bWVudC5jcmVhdGVFbGVtZW50PWZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO3ZhciBlPWwuYXBwbHkoZG9jdW1lbnQsYXJndW1lbnRzKTtyZXR1cm4idGVtcGxhdGUiPT09ZS5sb2NhbE5hbWUmJmkuZGVjb3JhdGUoZSksZX07dmFyIHU9L1smXHUwMEEwPD5dL2d9aWYobnx8byl7dmFyIGg9Tm9kZS5wcm90b3R5cGUuY2xvbmVOb2RlO2kuY2xvbmVOb2RlPWZ1bmN0aW9uKGUsdCl7dmFyIG49aC5jYWxsKGUsITEpO3JldHVybiB0aGlzLmRlY29yYXRlJiZ0aGlzLmRlY29yYXRlKG4pLHQmJihuLmNvbnRlbnQuYXBwZW5kQ2hpbGQoaC5jYWxsKGUuY29udGVudCwhMCkpLHRoaXMuZml4Q2xvbmVkRG9tKG4uY29udGVudCxlLmNvbnRlbnQpKSxufSxpLmZpeENsb25lZERvbT1mdW5jdGlvbihlLHQpe2lmKHQucXVlcnlTZWxlY3RvckFsbClmb3IodmFyIG4sbyxpPXQucXVlcnlTZWxlY3RvckFsbChyKSxhPWUucXVlcnlTZWxlY3RvckFsbChyKSxzPTAsYz1hLmxlbmd0aDtzPGM7cysrKW89aVtzXSxuPWFbc10sdGhpcy5kZWNvcmF0ZSYmdGhpcy5kZWNvcmF0ZShvKSxuLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKG8uY2xvbmVOb2RlKCEwKSxuKX07dmFyIGY9ZG9jdW1lbnQuaW1wb3J0Tm9kZTtOb2RlLnByb3RvdHlwZS5jbG9uZU5vZGU9ZnVuY3Rpb24oZSl7dmFyIHQ9aC5jYWxsKHRoaXMsZSk7cmV0dXJuIGUmJmkuZml4Q2xvbmVkRG9tKHQsdGhpcyksdH0sZG9jdW1lbnQuaW1wb3J0Tm9kZT1mdW5jdGlvbihlLHQpe2lmKGUubG9jYWxOYW1lPT09cilyZXR1cm4gaS5jbG9uZU5vZGUoZSx0KTt2YXIgbj1mLmNhbGwoZG9jdW1lbnQsZSx0KTtyZXR1cm4gdCYmaS5maXhDbG9uZWREb20obixlKSxufSxvJiYoSFRNTFRlbXBsYXRlRWxlbWVudC5wcm90b3R5cGUuY2xvbmVOb2RlPWZ1bmN0aW9uKGUpe3JldHVybiBpLmNsb25lTm9kZSh0aGlzLGUpfSl9biYmKHdpbmRvdy5IVE1MVGVtcGxhdGVFbGVtZW50PWkpfSgpLGZ1bmN0aW9uKGUpeyJ1c2Ugc3RyaWN0IjtpZighd2luZG93LnBlcmZvcm1hbmNlfHwhd2luZG93LnBlcmZvcm1hbmNlLm5vdyl7dmFyIHQ9RGF0ZS5ub3coKTt3aW5kb3cucGVyZm9ybWFuY2U9e25vdzpmdW5jdGlvbigpe3JldHVybiBEYXRlLm5vdygpLXR9fX13aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lfHwod2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZT1mdW5jdGlvbigpe3ZhciBlPXdpbmRvdy53ZWJraXRSZXF1ZXN0QW5pbWF0aW9uRnJhbWV8fHdpbmRvdy5tb3pSZXF1ZXN0QW5pbWF0aW9uRnJhbWU7cmV0dXJuIGU/ZnVuY3Rpb24odCl7cmV0dXJuIGUoZnVuY3Rpb24oKXt0KHBlcmZvcm1hbmNlLm5vdygpKX0pfTpmdW5jdGlvbihlKXtyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZSwxZTMvNjApfX0oKSksd2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lfHwod2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lPWZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy53ZWJraXRDYW5jZWxBbmltYXRpb25GcmFtZXx8d2luZG93Lm1vekNhbmNlbEFuaW1hdGlvbkZyYW1lfHxmdW5jdGlvbihlKXtjbGVhclRpbWVvdXQoZSl9fSgpKTt2YXIgbj1mdW5jdGlvbigpe3ZhciBlPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpO3JldHVybiBlLmluaXRFdmVudCgiZm9vIiwhMCwhMCksZS5wcmV2ZW50RGVmYXVsdCgpLGUuZGVmYXVsdFByZXZlbnRlZH0oKTtpZighbil7dmFyIG89RXZlbnQucHJvdG90eXBlLnByZXZlbnREZWZhdWx0O0V2ZW50LnByb3RvdHlwZS5wcmV2ZW50RGVmYXVsdD1mdW5jdGlvbigpe3RoaXMuY2FuY2VsYWJsZSYmKG8uY2FsbCh0aGlzKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiZGVmYXVsdFByZXZlbnRlZCIse2dldDpmdW5jdGlvbigpe3JldHVybiEwfSxjb25maWd1cmFibGU6ITB9KSl9fXZhciByPS9UcmlkZW50Ly50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpO2lmKCghd2luZG93LkN1c3RvbUV2ZW50fHxyJiYiZnVuY3Rpb24iIT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50KSYmKHdpbmRvdy5DdXN0b21FdmVudD1mdW5jdGlvbihlLHQpe3Q9dHx8e307dmFyIG49ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50Iik7cmV0dXJuIG4uaW5pdEN1c3RvbUV2ZW50KGUsQm9vbGVhbih0LmJ1YmJsZXMpLEJvb2xlYW4odC5jYW5jZWxhYmxlKSx0LmRldGFpbCksbn0sd2luZG93LkN1c3RvbUV2ZW50LnByb3RvdHlwZT13aW5kb3cuRXZlbnQucHJvdG90eXBlKSwhd2luZG93LkV2ZW50fHxyJiYiZnVuY3Rpb24iIT10eXBlb2Ygd2luZG93LkV2ZW50KXt2YXIgaT13aW5kb3cuRXZlbnQ7d2luZG93LkV2ZW50PWZ1bmN0aW9uKGUsdCl7dD10fHx7fTt2YXIgbj1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKTtyZXR1cm4gbi5pbml0RXZlbnQoZSxCb29sZWFuKHQuYnViYmxlcyksQm9vbGVhbih0LmNhbmNlbGFibGUpKSxufSx3aW5kb3cuRXZlbnQucHJvdG90eXBlPWkucHJvdG90eXBlfX0od2luZG93LldlYkNvbXBvbmVudHMpLHdpbmRvdy5IVE1MSW1wb3J0cz13aW5kb3cuSFRNTEltcG9ydHN8fHtmbGFnczp7fX0sZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChlLHQpe3Q9dHx8cCxvKGZ1bmN0aW9uKCl7aShlLHQpfSx0KX1mdW5jdGlvbiBuKGUpe3JldHVybiJjb21wbGV0ZSI9PT1lLnJlYWR5U3RhdGV8fGUucmVhZHlTdGF0ZT09PXd9ZnVuY3Rpb24gbyhlLHQpe2lmKG4odCkpZSYmZSgpO2Vsc2V7dmFyIHI9ZnVuY3Rpb24oKXsiY29tcGxldGUiIT09dC5yZWFkeVN0YXRlJiZ0LnJlYWR5U3RhdGUhPT13fHwodC5yZW1vdmVFdmVudExpc3RlbmVyKF8sciksbyhlLHQpKX07dC5hZGRFdmVudExpc3RlbmVyKF8scil9fWZ1bmN0aW9uIHIoZSl7ZS50YXJnZXQuX19sb2FkZWQ9ITB9ZnVuY3Rpb24gaShlLHQpe2Z1bmN0aW9uIG4oKXtjPT1kJiZlJiZlKHthbGxJbXBvcnRzOnMsbG9hZGVkSW1wb3J0czpsLGVycm9ySW1wb3J0czp1fSl9ZnVuY3Rpb24gbyhlKXtyKGUpLGwucHVzaCh0aGlzKSxjKyssbigpfWZ1bmN0aW9uIGkoZSl7dS5wdXNoKHRoaXMpLGMrKyxuKCl9dmFyIHM9dC5xdWVyeVNlbGVjdG9yQWxsKCJsaW5rW3JlbD1pbXBvcnRdIiksYz0wLGQ9cy5sZW5ndGgsbD1bXSx1PVtdO2lmKGQpZm9yKHZhciBoLGY9MDtmPGQmJihoPXNbZl0pO2YrKylhKGgpPyhsLnB1c2godGhpcyksYysrLG4oKSk6KGguYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsbyksaC5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsaSkpO2Vsc2UgbigpfWZ1bmN0aW9uIGEoZSl7cmV0dXJuIHU/ZS5fX2xvYWRlZHx8ZVsiaW1wb3J0Il0mJiJsb2FkaW5nIiE9PWVbImltcG9ydCJdLnJlYWR5U3RhdGU6ZS5fX2ltcG9ydFBhcnNlZH1mdW5jdGlvbiBzKGUpe2Zvcih2YXIgdCxuPTAsbz1lLmxlbmd0aDtuPG8mJih0PWVbbl0pO24rKyljKHQpJiZkKHQpfWZ1bmN0aW9uIGMoZSl7cmV0dXJuImxpbmsiPT09ZS5sb2NhbE5hbWUmJiJpbXBvcnQiPT09ZS5yZWx9ZnVuY3Rpb24gZChlKXt2YXIgdD1lWyJpbXBvcnQiXTt0P3Ioe3RhcmdldDplfSk6KGUuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsciksZS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIscikpfXZhciBsPSJpbXBvcnQiLHU9Qm9vbGVhbihsIGluIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImxpbmsiKSksaD1Cb29sZWFuKHdpbmRvdy5TaGFkb3dET01Qb2x5ZmlsbCksZj1mdW5jdGlvbihlKXtyZXR1cm4gaD93aW5kb3cuU2hhZG93RE9NUG9seWZpbGwud3JhcElmTmVlZGVkKGUpOmV9LHA9Zihkb2N1bWVudCksbT17Z2V0OmZ1bmN0aW9uKCl7dmFyIGU9d2luZG93LkhUTUxJbXBvcnRzLmN1cnJlbnRTY3JpcHR8fGRvY3VtZW50LmN1cnJlbnRTY3JpcHR8fCgiY29tcGxldGUiIT09ZG9jdW1lbnQucmVhZHlTdGF0ZT9kb2N1bWVudC5zY3JpcHRzW2RvY3VtZW50LnNjcmlwdHMubGVuZ3RoLTFdOm51bGwpO3JldHVybiBmKGUpfSxjb25maWd1cmFibGU6ITB9O09iamVjdC5kZWZpbmVQcm9wZXJ0eShkb2N1bWVudCwiX2N1cnJlbnRTY3JpcHQiLG0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShwLCJfY3VycmVudFNjcmlwdCIsbSk7dmFyIHY9L1RyaWRlbnQvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCksdz12PyJjb21wbGV0ZSI6ImludGVyYWN0aXZlIixfPSJyZWFkeXN0YXRlY2hhbmdlIjt1JiYobmV3IE11dGF0aW9uT2JzZXJ2ZXIoZnVuY3Rpb24oZSl7Zm9yKHZhciB0LG49MCxvPWUubGVuZ3RoO248byYmKHQ9ZVtuXSk7bisrKXQuYWRkZWROb2RlcyYmcyh0LmFkZGVkTm9kZXMpfSkub2JzZXJ2ZShkb2N1bWVudC5oZWFkLHtjaGlsZExpc3Q6ITB9KSxmdW5jdGlvbigpe2lmKCJsb2FkaW5nIj09PWRvY3VtZW50LnJlYWR5U3RhdGUpZm9yKHZhciBlLHQ9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgibGlua1tyZWw9aW1wb3J0XSIpLG49MCxvPXQubGVuZ3RoO248byYmKGU9dFtuXSk7bisrKWQoZSl9KCkpLHQoZnVuY3Rpb24oZSl7d2luZG93LkhUTUxJbXBvcnRzLnJlYWR5PSEwLHdpbmRvdy5IVE1MSW1wb3J0cy5yZWFkeVRpbWU9KG5ldyBEYXRlKS5nZXRUaW1lKCk7dmFyIHQ9cC5jcmVhdGVFdmVudCgiQ3VzdG9tRXZlbnQiKTt0LmluaXRDdXN0b21FdmVudCgiSFRNTEltcG9ydHNMb2FkZWQiLCEwLCEwLGUpLHAuZGlzcGF0Y2hFdmVudCh0KX0pLGUuSU1QT1JUX0xJTktfVFlQRT1sLGUudXNlTmF0aXZlPXUsZS5yb290RG9jdW1lbnQ9cCxlLndoZW5SZWFkeT10LGUuaXNJRT12fSh3aW5kb3cuSFRNTEltcG9ydHMpLGZ1bmN0aW9uKGUpe3ZhciB0PVtdLG49ZnVuY3Rpb24oZSl7dC5wdXNoKGUpfSxvPWZ1bmN0aW9uKCl7dC5mb3JFYWNoKGZ1bmN0aW9uKHQpe3QoZSl9KX07ZS5hZGRNb2R1bGU9bixlLmluaXRpYWxpemVNb2R1bGVzPW99KHdpbmRvdy5IVE1MSW1wb3J0cyksd2luZG93LkhUTUxJbXBvcnRzLmFkZE1vZHVsZShmdW5jdGlvbihlKXt2YXIgdD0vKHVybFwoKShbXildKikoXCkpL2csbj0vKEBpbXBvcnRbXHNdKyg/IXVybFwoKSkoW147XSopKDspL2csbz17cmVzb2x2ZVVybHNJblN0eWxlOmZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5vd25lckRvY3VtZW50LG89bi5jcmVhdGVFbGVtZW50KCJhIik7cmV0dXJuIGUudGV4dENvbnRlbnQ9dGhpcy5yZXNvbHZlVXJsc0luQ3NzVGV4dChlLnRleHRDb250ZW50LHQsbyksZX0scmVzb2x2ZVVybHNJbkNzc1RleHQ6ZnVuY3Rpb24oZSxvLHIpe3ZhciBpPXRoaXMucmVwbGFjZVVybHMoZSxyLG8sdCk7cmV0dXJuIGk9dGhpcy5yZXBsYWNlVXJscyhpLHIsbyxuKX0scmVwbGFjZVVybHM6ZnVuY3Rpb24oZSx0LG4sbyl7cmV0dXJuIGUucmVwbGFjZShvLGZ1bmN0aW9uKGUsbyxyLGkpe3ZhciBhPXIucmVwbGFjZSgvWyInXS9nLCIiKTtyZXR1cm4gbiYmKGE9bmV3IFVSTChhLG4pLmhyZWYpLHQuaHJlZj1hLGE9dC5ocmVmLG8rIiciK2ErIiciK2l9KX19O2UucGF0aD1vfSksd2luZG93LkhUTUxJbXBvcnRzLmFkZE1vZHVsZShmdW5jdGlvbihlKXt2YXIgdD17YXN5bmM6ITAsb2s6ZnVuY3Rpb24oZSl7cmV0dXJuIGUuc3RhdHVzPj0yMDAmJmUuc3RhdHVzPDMwMHx8MzA0PT09ZS5zdGF0dXN8fDA9PT1lLnN0YXR1c30sbG9hZDpmdW5jdGlvbihuLG8scil7dmFyIGk9bmV3IFhNTEh0dHBSZXF1ZXN0O3JldHVybihlLmZsYWdzLmRlYnVnfHxlLmZsYWdzLmJ1c3QpJiYobis9Ij8iK01hdGgucmFuZG9tKCkpLGkub3BlbigiR0VUIixuLHQuYXN5bmMpLGkuYWRkRXZlbnRMaXN0ZW5lcigicmVhZHlzdGF0ZWNoYW5nZSIsZnVuY3Rpb24oZSl7aWYoND09PWkucmVhZHlTdGF0ZSl7dmFyIG49bnVsbDt0cnl7dmFyIGE9aS5nZXRSZXNwb25zZUhlYWRlcigiTG9jYXRpb24iKTthJiYobj0iLyI9PT1hLnN1YnN0cigwLDEpP2xvY2F0aW9uLm9yaWdpbithOmEpfWNhdGNoKGUpe2NvbnNvbGUuZXJyb3IoZS5tZXNzYWdlKX1vLmNhbGwociwhdC5vayhpKSYmaSxpLnJlc3BvbnNlfHxpLnJlc3BvbnNlVGV4dCxuKX19KSxpLnNlbmQoKSxpfSxsb2FkRG9jdW1lbnQ6ZnVuY3Rpb24oZSx0LG4pe3RoaXMubG9hZChlLHQsbikucmVzcG9uc2VUeXBlPSJkb2N1bWVudCJ9fTtlLnhocj10fSksd2luZG93LkhUTUxJbXBvcnRzLmFkZE1vZHVsZShmdW5jdGlvbihlKXt2YXIgdD1lLnhocixuPWUuZmxhZ3Msbz1mdW5jdGlvbihlLHQpe3RoaXMuY2FjaGU9e30sdGhpcy5vbmxvYWQ9ZSx0aGlzLm9uY29tcGxldGU9dCx0aGlzLmluZmxpZ2h0PTAsdGhpcy5wZW5kaW5nPXt9fTtvLnByb3RvdHlwZT17YWRkTm9kZXM6ZnVuY3Rpb24oZSl7dGhpcy5pbmZsaWdodCs9ZS5sZW5ndGg7Zm9yKHZhciB0LG49MCxvPWUubGVuZ3RoO248byYmKHQ9ZVtuXSk7bisrKXRoaXMucmVxdWlyZSh0KTt0aGlzLmNoZWNrRG9uZSgpfSxhZGROb2RlOmZ1bmN0aW9uKGUpe3RoaXMuaW5mbGlnaHQrKyx0aGlzLnJlcXVpcmUoZSksdGhpcy5jaGVja0RvbmUoKX0scmVxdWlyZTpmdW5jdGlvbihlKXt2YXIgdD1lLnNyY3x8ZS5ocmVmO2UuX19ub2RlVXJsPXQsdGhpcy5kZWR1cGUodCxlKXx8dGhpcy5mZXRjaCh0LGUpfSxkZWR1cGU6ZnVuY3Rpb24oZSx0KXtpZih0aGlzLnBlbmRpbmdbZV0pcmV0dXJuIHRoaXMucGVuZGluZ1tlXS5wdXNoKHQpLCEwO3JldHVybiB0aGlzLmNhY2hlW2VdPyh0aGlzLm9ubG9hZChlLHQsdGhpcy5jYWNoZVtlXSksdGhpcy50YWlsKCksITApOih0aGlzLnBlbmRpbmdbZV09W3RdLCExKX0sZmV0Y2g6ZnVuY3Rpb24oZSxvKXtpZihuLmxvYWQmJmNvbnNvbGUubG9nKCJmZXRjaCIsZSxvKSxlKWlmKGUubWF0Y2goL15kYXRhOi8pKXt2YXIgcj1lLnNwbGl0KCIsIiksaT1yWzBdLGE9clsxXTthPWkuaW5kZXhPZigiO2Jhc2U2NCIpPi0xP2F0b2IoYSk6ZGVjb2RlVVJJQ29tcG9uZW50KGEpLHNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJlY2VpdmUoZSxvLG51bGwsYSl9LmJpbmQodGhpcyksMCl9ZWxzZXt2YXIgcz1mdW5jdGlvbih0LG4scil7dGhpcy5yZWNlaXZlKGUsbyx0LG4scil9LmJpbmQodGhpcyk7dC5sb2FkKGUscyl9ZWxzZSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5yZWNlaXZlKGUsbyx7ZXJyb3I6ImhyZWYgbXVzdCBiZSBzcGVjaWZpZWQifSxudWxsKX0uYmluZCh0aGlzKSwwKX0scmVjZWl2ZTpmdW5jdGlvbihlLHQsbixvLHIpe3RoaXMuY2FjaGVbZV09bztmb3IodmFyIGksYT10aGlzLnBlbmRpbmdbZV0scz0wLGM9YS5sZW5ndGg7czxjJiYoaT1hW3NdKTtzKyspdGhpcy5vbmxvYWQoZSxpLG8sbixyKSx0aGlzLnRhaWwoKTt0aGlzLnBlbmRpbmdbZV09bnVsbH0sdGFpbDpmdW5jdGlvbigpey0tdGhpcy5pbmZsaWdodCx0aGlzLmNoZWNrRG9uZSgpfSxjaGVja0RvbmU6ZnVuY3Rpb24oKXt0aGlzLmluZmxpZ2h0fHx0aGlzLm9uY29tcGxldGUoKX19LGUuTG9hZGVyPW99KSx3aW5kb3cuSFRNTEltcG9ydHMuYWRkTW9kdWxlKGZ1bmN0aW9uKGUpe3ZhciB0PWZ1bmN0aW9uKGUpe3RoaXMuYWRkQ2FsbGJhY2s9ZSx0aGlzLm1vPW5ldyBNdXRhdGlvbk9ic2VydmVyKHRoaXMuaGFuZGxlci5iaW5kKHRoaXMpKX07dC5wcm90b3R5cGU9e2hhbmRsZXI6ZnVuY3Rpb24oZSl7Zm9yKHZhciB0LG49MCxvPWUubGVuZ3RoO248byYmKHQ9ZVtuXSk7bisrKSJjaGlsZExpc3QiPT09dC50eXBlJiZ0LmFkZGVkTm9kZXMubGVuZ3RoJiZ0aGlzLmFkZGVkTm9kZXModC5hZGRlZE5vZGVzKX0sYWRkZWROb2RlczpmdW5jdGlvbihlKXt0aGlzLmFkZENhbGxiYWNrJiZ0aGlzLmFkZENhbGxiYWNrKGUpO2Zvcih2YXIgdCxuPTAsbz1lLmxlbmd0aDtuPG8mJih0PWVbbl0pO24rKyl0LmNoaWxkcmVuJiZ0LmNoaWxkcmVuLmxlbmd0aCYmdGhpcy5hZGRlZE5vZGVzKHQuY2hpbGRyZW4pfSxvYnNlcnZlOmZ1bmN0aW9uKGUpe3RoaXMubW8ub2JzZXJ2ZShlLHtjaGlsZExpc3Q6ITAsc3VidHJlZTohMH0pfX0sZS5PYnNlcnZlcj10fSksd2luZG93LkhUTUxJbXBvcnRzLmFkZE1vZHVsZShmdW5jdGlvbihlKXtmdW5jdGlvbiB0KGUpe3JldHVybiJsaW5rIj09PWUubG9jYWxOYW1lJiZlLnJlbD09PWx9ZnVuY3Rpb24gbihlKXt2YXIgdD1vKGUpO3JldHVybiJkYXRhOnRleHQvamF2YXNjcmlwdDtjaGFyc2V0PXV0Zi04LCIrZW5jb2RlVVJJQ29tcG9uZW50KHQpfWZ1bmN0aW9uIG8oZSl7cmV0dXJuIGUudGV4dENvbnRlbnQrcihlKX1mdW5jdGlvbiByKGUpe3ZhciB0PWUub3duZXJEb2N1bWVudDt0Ll9faW1wb3J0ZWRTY3JpcHRzPXQuX19pbXBvcnRlZFNjcmlwdHN8fDA7dmFyIG49ZS5vd25lckRvY3VtZW50LmJhc2VVUkksbz10Ll9faW1wb3J0ZWRTY3JpcHRzPyItIit0Ll9faW1wb3J0ZWRTY3JpcHRzOiIiO3JldHVybiB0Ll9faW1wb3J0ZWRTY3JpcHRzKyssIlxuLy8jIHNvdXJjZVVSTD0iK24rbysiLmpzXG4ifWZ1bmN0aW9uIGkoZSl7dmFyIHQ9ZS5vd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInN0eWxlIik7cmV0dXJuIHQudGV4dENvbnRlbnQ9ZS50ZXh0Q29udGVudCxhLnJlc29sdmVVcmxzSW5TdHlsZSh0KSx0fXZhciBhPWUucGF0aCxzPWUucm9vdERvY3VtZW50LGM9ZS5mbGFncyxkPWUuaXNJRSxsPWUuSU1QT1JUX0xJTktfVFlQRSx1PSJsaW5rW3JlbD0iK2wrIl0iLGg9e2RvY3VtZW50U2VsZWN0b3JzOnUsaW1wb3J0c1NlbGVjdG9yczpbdSwibGlua1tyZWw9c3R5bGVzaGVldF06bm90KFt0eXBlXSkiLCJzdHlsZTpub3QoW3R5cGVdKSIsInNjcmlwdDpub3QoW3R5cGVdKSIsJ3NjcmlwdFt0eXBlPSJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Il0nLCdzY3JpcHRbdHlwZT0idGV4dC9qYXZhc2NyaXB0Il0nXS5qb2luKCIsIiksbWFwOntsaW5rOiJwYXJzZUxpbmsiLHNjcmlwdDoicGFyc2VTY3JpcHQiLHN0eWxlOiJwYXJzZVN0eWxlIn0sZHluYW1pY0VsZW1lbnRzOltdLHBhcnNlTmV4dDpmdW5jdGlvbigpe3ZhciBlPXRoaXMubmV4dFRvUGFyc2UoKTtlJiZ0aGlzLnBhcnNlKGUpfSxwYXJzZTpmdW5jdGlvbihlKXtpZih0aGlzLmlzUGFyc2VkKGUpKXJldHVybiB2b2lkKGMucGFyc2UmJmNvbnNvbGUubG9nKCJbJXNdIGlzIGFscmVhZHkgcGFyc2VkIixlLmxvY2FsTmFtZSkpO3ZhciB0PXRoaXNbdGhpcy5tYXBbZS5sb2NhbE5hbWVdXTt0JiYodGhpcy5tYXJrUGFyc2luZyhlKSx0LmNhbGwodGhpcyxlKSl9LHBhcnNlRHluYW1pYzpmdW5jdGlvbihlLHQpe3RoaXMuZHluYW1pY0VsZW1lbnRzLnB1c2goZSksdHx8dGhpcy5wYXJzZU5leHQoKX0sbWFya1BhcnNpbmc6ZnVuY3Rpb24oZSl7Yy5wYXJzZSYmY29uc29sZS5sb2coInBhcnNpbmciLGUpLHRoaXMucGFyc2luZ0VsZW1lbnQ9ZX0sbWFya1BhcnNpbmdDb21wbGV0ZTpmdW5jdGlvbihlKXtlLl9faW1wb3J0UGFyc2VkPSEwLHRoaXMubWFya0R5bmFtaWNQYXJzaW5nQ29tcGxldGUoZSksZS5fX2ltcG9ydEVsZW1lbnQmJihlLl9faW1wb3J0RWxlbWVudC5fX2ltcG9ydFBhcnNlZD0hMCx0aGlzLm1hcmtEeW5hbWljUGFyc2luZ0NvbXBsZXRlKGUuX19pbXBvcnRFbGVtZW50KSksdGhpcy5wYXJzaW5nRWxlbWVudD1udWxsLGMucGFyc2UmJmNvbnNvbGUubG9nKCJjb21wbGV0ZWQiLGUpfSxtYXJrRHluYW1pY1BhcnNpbmdDb21wbGV0ZTpmdW5jdGlvbihlKXt2YXIgdD10aGlzLmR5bmFtaWNFbGVtZW50cy5pbmRleE9mKGUpO3Q+PTAmJnRoaXMuZHluYW1pY0VsZW1lbnRzLnNwbGljZSh0LDEpfSxwYXJzZUltcG9ydDpmdW5jdGlvbihlKXtpZihlWyJpbXBvcnQiXT1lLl9fZG9jLHdpbmRvdy5IVE1MSW1wb3J0cy5fX2ltcG9ydHNQYXJzaW5nSG9vayYmd2luZG93LkhUTUxJbXBvcnRzLl9faW1wb3J0c1BhcnNpbmdIb29rKGUpLGVbImltcG9ydCJdJiYoZVsiaW1wb3J0Il0uX19pbXBvcnRQYXJzZWQ9ITApLHRoaXMubWFya1BhcnNpbmdDb21wbGV0ZShlKSxlLl9fcmVzb3VyY2UmJiFlLl9fZXJyb3I/ZS5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgibG9hZCIse2J1YmJsZXM6ITF9KSk6ZS5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgiZXJyb3IiLHtidWJibGVzOiExfSkpLGUuX19wZW5kaW5nKWZvcih2YXIgdDtlLl9fcGVuZGluZy5sZW5ndGg7KXQ9ZS5fX3BlbmRpbmcuc2hpZnQoKSx0JiZ0KHt0YXJnZXQ6ZX0pO3RoaXMucGFyc2VOZXh0KCl9LHBhcnNlTGluazpmdW5jdGlvbihlKXt0KGUpP3RoaXMucGFyc2VJbXBvcnQoZSk6KGUuaHJlZj1lLmhyZWYsdGhpcy5wYXJzZUdlbmVyaWMoZSkpfSxwYXJzZVN0eWxlOmZ1bmN0aW9uKGUpe3ZhciB0PWU7ZT1pKGUpLHQuX19hcHBsaWVkRWxlbWVudD1lLGUuX19pbXBvcnRFbGVtZW50PXQsdGhpcy5wYXJzZUdlbmVyaWMoZSl9LHBhcnNlR2VuZXJpYzpmdW5jdGlvbihlKXt0aGlzLnRyYWNrRWxlbWVudChlKSx0aGlzLmFkZEVsZW1lbnRUb0RvY3VtZW50KGUpfSxyb290SW1wb3J0Rm9yRWxlbWVudDpmdW5jdGlvbihlKXtmb3IodmFyIHQ9ZTt0Lm93bmVyRG9jdW1lbnQuX19pbXBvcnRMaW5rOyl0PXQub3duZXJEb2N1bWVudC5fX2ltcG9ydExpbms7cmV0dXJuIHR9LGFkZEVsZW1lbnRUb0RvY3VtZW50OmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMucm9vdEltcG9ydEZvckVsZW1lbnQoZS5fX2ltcG9ydEVsZW1lbnR8fGUpO3QucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZSx0KX0sdHJhY2tFbGVtZW50OmZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcyxvPWZ1bmN0aW9uKHIpe2UucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZCIsbyksZS5yZW1vdmVFdmVudExpc3RlbmVyKCJlcnJvciIsbyksdCYmdChyKSxuLm1hcmtQYXJzaW5nQ29tcGxldGUoZSksbi5wYXJzZU5leHQoKX07aWYoZS5hZGRFdmVudExpc3RlbmVyKCJsb2FkIixvKSxlLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixvKSxkJiYic3R5bGUiPT09ZS5sb2NhbE5hbWUpe3ZhciByPSExO2lmKGUudGV4dENvbnRlbnQuaW5kZXhPZigiQGltcG9ydCIpPT0tMSlyPSEwO2Vsc2UgaWYoZS5zaGVldCl7cj0hMDtmb3IodmFyIGksYT1lLnNoZWV0LmNzc1J1bGVzLHM9YT9hLmxlbmd0aDowLGM9MDtjPHMmJihpPWFbY10pO2MrKylpLnR5cGU9PT1DU1NSdWxlLklNUE9SVF9SVUxFJiYocj1yJiZCb29sZWFuKGkuc3R5bGVTaGVldCkpfXImJnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJsb2FkIix7YnViYmxlczohMX0pKX0pfX0scGFyc2VTY3JpcHQ6ZnVuY3Rpb24odCl7dmFyIG89ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7by5fX2ltcG9ydEVsZW1lbnQ9dCxvLnNyYz10LnNyYz90LnNyYzpuKHQpLGUuY3VycmVudFNjcmlwdD10LHRoaXMudHJhY2tFbGVtZW50KG8sZnVuY3Rpb24odCl7by5wYXJlbnROb2RlJiZvLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobyksZS5jdXJyZW50U2NyaXB0PW51bGx9KSx0aGlzLmFkZEVsZW1lbnRUb0RvY3VtZW50KG8pfSxuZXh0VG9QYXJzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9tYXlQYXJzZT1bXSwhdGhpcy5wYXJzaW5nRWxlbWVudCYmKHRoaXMubmV4dFRvUGFyc2VJbkRvYyhzKXx8dGhpcy5uZXh0VG9QYXJzZUR5bmFtaWMoKSl9LG5leHRUb1BhcnNlSW5Eb2M6ZnVuY3Rpb24oZSxuKXtpZihlJiZ0aGlzLl9tYXlQYXJzZS5pbmRleE9mKGUpPDApe3RoaXMuX21heVBhcnNlLnB1c2goZSk7Zm9yKHZhciBvLHI9ZS5xdWVyeVNlbGVjdG9yQWxsKHRoaXMucGFyc2VTZWxlY3RvcnNGb3JOb2RlKGUpKSxpPTAsYT1yLmxlbmd0aDtpPGEmJihvPXJbaV0pO2krKylpZighdGhpcy5pc1BhcnNlZChvKSlyZXR1cm4gdGhpcy5oYXNSZXNvdXJjZShvKT90KG8pP3RoaXMubmV4dFRvUGFyc2VJbkRvYyhvLl9fZG9jLG8pOm86dm9pZCAwfXJldHVybiBufSxuZXh0VG9QYXJzZUR5bmFtaWM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5keW5hbWljRWxlbWVudHNbMF19LHBhcnNlU2VsZWN0b3JzRm9yTm9kZTpmdW5jdGlvbihlKXt2YXIgdD1lLm93bmVyRG9jdW1lbnR8fGU7cmV0dXJuIHQ9PT1zP3RoaXMuZG9jdW1lbnRTZWxlY3RvcnM6dGhpcy5pbXBvcnRzU2VsZWN0b3JzfSxpc1BhcnNlZDpmdW5jdGlvbihlKXtyZXR1cm4gZS5fX2ltcG9ydFBhcnNlZH0sbmVlZHNEeW5hbWljUGFyc2luZzpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5keW5hbWljRWxlbWVudHMuaW5kZXhPZihlKT49MH0saGFzUmVzb3VyY2U6ZnVuY3Rpb24oZSl7cmV0dXJuIXQoZSl8fHZvaWQgMCE9PWUuX19kb2N9fTtlLnBhcnNlcj1oLGUuSU1QT1JUX1NFTEVDVE9SPXV9KSx3aW5kb3cuSFRNTEltcG9ydHMuYWRkTW9kdWxlKGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQoZSl7cmV0dXJuIG4oZSxhKX1mdW5jdGlvbiBuKGUsdCl7cmV0dXJuImxpbmsiPT09ZS5sb2NhbE5hbWUmJmUuZ2V0QXR0cmlidXRlKCJyZWwiKT09PXR9ZnVuY3Rpb24gbyhlKXtyZXR1cm4hIU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZSwiYmFzZVVSSSIpfWZ1bmN0aW9uIHIoZSx0KXt2YXIgbj1kb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoYSk7bi5fVVJMPXQ7dmFyIHI9bi5jcmVhdGVFbGVtZW50KCJiYXNlIik7ci5zZXRBdHRyaWJ1dGUoImhyZWYiLHQpLG4uYmFzZVVSSXx8byhuKXx8T2JqZWN0LmRlZmluZVByb3BlcnR5KG4sImJhc2VVUkkiLHt2YWx1ZTp0fSk7dmFyIGk9bi5jcmVhdGVFbGVtZW50KCJtZXRhIik7cmV0dXJuIGkuc2V0QXR0cmlidXRlKCJjaGFyc2V0IiwidXRmLTgiKSxuLmhlYWQuYXBwZW5kQ2hpbGQoaSksbi5oZWFkLmFwcGVuZENoaWxkKHIpLG4uYm9keS5pbm5lckhUTUw9ZSx3aW5kb3cuSFRNTFRlbXBsYXRlRWxlbWVudCYmSFRNTFRlbXBsYXRlRWxlbWVudC5ib290c3RyYXAmJkhUTUxUZW1wbGF0ZUVsZW1lbnQuYm9vdHN0cmFwKG4pLG59dmFyIGk9ZS5mbGFncyxhPWUuSU1QT1JUX0xJTktfVFlQRSxzPWUuSU1QT1JUX1NFTEVDVE9SLGM9ZS5yb290RG9jdW1lbnQsZD1lLkxvYWRlcixsPWUuT2JzZXJ2ZXIsdT1lLnBhcnNlcixoPXtkb2N1bWVudHM6e30sZG9jdW1lbnRQcmVsb2FkU2VsZWN0b3JzOnMsaW1wb3J0c1ByZWxvYWRTZWxlY3RvcnM6W3NdLmpvaW4oIiwiKSxsb2FkTm9kZTpmdW5jdGlvbihlKXtmLmFkZE5vZGUoZSl9LGxvYWRTdWJ0cmVlOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMubWFyc2hhbE5vZGVzKGUpO2YuYWRkTm9kZXModCl9LG1hcnNoYWxOb2RlczpmdW5jdGlvbihlKXtyZXR1cm4gZS5xdWVyeVNlbGVjdG9yQWxsKHRoaXMubG9hZFNlbGVjdG9yc0Zvck5vZGUoZSkpfSxsb2FkU2VsZWN0b3JzRm9yTm9kZTpmdW5jdGlvbihlKXt2YXIgdD1lLm93bmVyRG9jdW1lbnR8fGU7cmV0dXJuIHQ9PT1jP3RoaXMuZG9jdW1lbnRQcmVsb2FkU2VsZWN0b3JzOnRoaXMuaW1wb3J0c1ByZWxvYWRTZWxlY3RvcnN9LGxvYWRlZDpmdW5jdGlvbihlLG4sbyxhLHMpe2lmKGkubG9hZCYmY29uc29sZS5sb2coImxvYWRlZCIsZSxuKSxuLl9fcmVzb3VyY2U9byxuLl9fZXJyb3I9YSx0KG4pKXt2YXIgYz10aGlzLmRvY3VtZW50c1tlXTt2b2lkIDA9PT1jJiYoYz1hP251bGw6cihvLHN8fGUpLGMmJihjLl9faW1wb3J0TGluaz1uLHRoaXMuYm9vdERvY3VtZW50KGMpKSx0aGlzLmRvY3VtZW50c1tlXT1jKSxuLl9fZG9jPWN9dS5wYXJzZU5leHQoKX0sYm9vdERvY3VtZW50OmZ1bmN0aW9uKGUpe3RoaXMubG9hZFN1YnRyZWUoZSksdGhpcy5vYnNlcnZlci5vYnNlcnZlKGUpLHUucGFyc2VOZXh0KCl9LGxvYWRlZEFsbDpmdW5jdGlvbigpe3UucGFyc2VOZXh0KCl9fSxmPW5ldyBkKGgubG9hZGVkLmJpbmQoaCksaC5sb2FkZWRBbGwuYmluZChoKSk7aWYoaC5vYnNlcnZlcj1uZXcgbCwhZG9jdW1lbnQuYmFzZVVSSSl7dmFyIHA9e2dldDpmdW5jdGlvbigpe3ZhciBlPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoImJhc2UiKTtyZXR1cm4gZT9lLmhyZWY6d2luZG93LmxvY2F0aW9uLmhyZWZ9LGNvbmZpZ3VyYWJsZTohMH07T2JqZWN0LmRlZmluZVByb3BlcnR5KGRvY3VtZW50LCJiYXNlVVJJIixwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoYywiYmFzZVVSSSIscCl9ZS5pbXBvcnRlcj1oLGUuaW1wb3J0TG9hZGVyPWZ9KSx3aW5kb3cuSFRNTEltcG9ydHMuYWRkTW9kdWxlKGZ1bmN0aW9uKGUpe3ZhciB0PWUucGFyc2VyLG49ZS5pbXBvcnRlcixvPXthZGRlZDpmdW5jdGlvbihlKXtmb3IodmFyIG8scixpLGEscz0wLGM9ZS5sZW5ndGg7czxjJiYoYT1lW3NdKTtzKyspb3x8KG89YS5vd25lckRvY3VtZW50LHI9dC5pc1BhcnNlZChvKSksaT10aGlzLnNob3VsZExvYWROb2RlKGEpLGkmJm4ubG9hZE5vZGUoYSksdGhpcy5zaG91bGRQYXJzZU5vZGUoYSkmJnImJnQucGFyc2VEeW5hbWljKGEsaSl9LHNob3VsZExvYWROb2RlOmZ1bmN0aW9uKGUpe3JldHVybiAxPT09ZS5ub2RlVHlwZSYmci5jYWxsKGUsbi5sb2FkU2VsZWN0b3JzRm9yTm9kZShlKSl9LHNob3VsZFBhcnNlTm9kZTpmdW5jdGlvbihlKXtyZXR1cm4gMT09PWUubm9kZVR5cGUmJnIuY2FsbChlLHQucGFyc2VTZWxlY3RvcnNGb3JOb2RlKGUpKX19O24ub2JzZXJ2ZXIuYWRkQ2FsbGJhY2s9by5hZGRlZC5iaW5kKG8pO3ZhciByPUhUTUxFbGVtZW50LnByb3RvdHlwZS5tYXRjaGVzfHxIVE1MRWxlbWVudC5wcm90b3R5cGUubWF0Y2hlc1NlbGVjdG9yfHxIVE1MRWxlbWVudC5wcm90b3R5cGUud2Via2l0TWF0Y2hlc1NlbGVjdG9yfHxIVE1MRWxlbWVudC5wcm90b3R5cGUubW96TWF0Y2hlc1NlbGVjdG9yfHxIVE1MRWxlbWVudC5wcm90b3R5cGUubXNNYXRjaGVzU2VsZWN0b3J9KSxmdW5jdGlvbihlKXtmdW5jdGlvbiB0KCl7d2luZG93LkhUTUxJbXBvcnRzLmltcG9ydGVyLmJvb3REb2N1bWVudChvKX12YXIgbj1lLmluaXRpYWxpemVNb2R1bGVzO2UuaXNJRTtpZighZS51c2VOYXRpdmUpe24oKTt2YXIgbz1lLnJvb3REb2N1bWVudDsiY29tcGxldGUiPT09ZG9jdW1lbnQucmVhZHlTdGF0ZXx8ImludGVyYWN0aXZlIj09PWRvY3VtZW50LnJlYWR5U3RhdGUmJiF3aW5kb3cuYXR0YWNoRXZlbnQ/dCgpOmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLHQpfX0od2luZG93LkhUTUxJbXBvcnRzKSx3aW5kb3cuQ3VzdG9tRWxlbWVudHM9d2luZG93LkN1c3RvbUVsZW1lbnRzfHx7ZmxhZ3M6e319LGZ1bmN0aW9uKGUpe3ZhciB0PWUuZmxhZ3Msbj1bXSxvPWZ1bmN0aW9uKGUpe24ucHVzaChlKX0scj1mdW5jdGlvbigpe24uZm9yRWFjaChmdW5jdGlvbih0KXt0KGUpfSl9O2UuYWRkTW9kdWxlPW8sZS5pbml0aWFsaXplTW9kdWxlcz1yLGUuaGFzTmF0aXZlPUJvb2xlYW4oZG9jdW1lbnQucmVnaXN0ZXJFbGVtZW50KSxlLmlzSUU9L1RyaWRlbnQvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCksZS51c2VOYXRpdmU9IXQucmVnaXN0ZXImJmUuaGFzTmF0aXZlJiYhd2luZG93LlNoYWRvd0RPTVBvbHlmaWxsJiYoIXdpbmRvdy5IVE1MSW1wb3J0c3x8d2luZG93LkhUTUxJbXBvcnRzLnVzZU5hdGl2ZSl9KHdpbmRvdy5DdXN0b21FbGVtZW50cyksd2luZG93LkN1c3RvbUVsZW1lbnRzLmFkZE1vZHVsZShmdW5jdGlvbihlKXtmdW5jdGlvbiB0KGUsdCl7bihlLGZ1bmN0aW9uKGUpe3JldHVybiEhdChlKXx8dm9pZCBvKGUsdCl9KSxvKGUsdCl9ZnVuY3Rpb24gbihlLHQsbyl7dmFyIHI9ZS5maXJzdEVsZW1lbnRDaGlsZDtpZighcilmb3Iocj1lLmZpcnN0Q2hpbGQ7ciYmci5ub2RlVHlwZSE9PU5vZGUuRUxFTUVOVF9OT0RFOylyPXIubmV4dFNpYmxpbmc7Zm9yKDtyOyl0KHIsbykhPT0hMCYmbihyLHQsbykscj1yLm5leHRFbGVtZW50U2libGluZztyZXR1cm4gbnVsbH1mdW5jdGlvbiBvKGUsbil7Zm9yKHZhciBvPWUuc2hhZG93Um9vdDtvOyl0KG8sbiksbz1vLm9sZGVyU2hhZG93Um9vdH1mdW5jdGlvbiByKGUsdCl7aShlLHQsW10pfWZ1bmN0aW9uIGkoZSx0LG4pe2lmKGU9d2luZG93LndyYXAoZSksIShuLmluZGV4T2YoZSk+PTApKXtuLnB1c2goZSk7Zm9yKHZhciBvLHI9ZS5xdWVyeVNlbGVjdG9yQWxsKCJsaW5rW3JlbD0iK2ErIl0iKSxzPTAsYz1yLmxlbmd0aDtzPGMmJihvPXJbc10pO3MrKylvWyJpbXBvcnQiXSYmaShvWyJpbXBvcnQiXSx0LG4pO3QoZSl9fXZhciBhPXdpbmRvdy5IVE1MSW1wb3J0cz93aW5kb3cuSFRNTEltcG9ydHMuSU1QT1JUX0xJTktfVFlQRToibm9uZSI7ZS5mb3JEb2N1bWVudFRyZWU9cixlLmZvclN1YnRyZWU9dH0pLHdpbmRvdy5DdXN0b21FbGVtZW50cy5hZGRNb2R1bGUoZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChlLHQpe3JldHVybiBuKGUsdCl8fG8oZSx0KX1mdW5jdGlvbiBuKHQsbil7cmV0dXJuISFlLnVwZ3JhZGUodCxuKXx8dm9pZChuJiZhKHQpKX1mdW5jdGlvbiBvKGUsdCl7ZyhlLGZ1bmN0aW9uKGUpe2lmKG4oZSx0KSlyZXR1cm4hMH0pfWZ1bmN0aW9uIHIoZSl7TC5wdXNoKGUpLEV8fChFPSEwLHNldFRpbWVvdXQoaSkpfWZ1bmN0aW9uIGkoKXtFPSExO2Zvcih2YXIgZSx0PUwsbj0wLG89dC5sZW5ndGg7bjxvJiYoZT10W25dKTtuKyspZSgpO0w9W119ZnVuY3Rpb24gYShlKXt5P3IoZnVuY3Rpb24oKXtzKGUpOwp9KTpzKGUpfWZ1bmN0aW9uIHMoZSl7ZS5fX3VwZ3JhZGVkX18mJiFlLl9fYXR0YWNoZWQmJihlLl9fYXR0YWNoZWQ9ITAsZS5hdHRhY2hlZENhbGxiYWNrJiZlLmF0dGFjaGVkQ2FsbGJhY2soKSl9ZnVuY3Rpb24gYyhlKXtkKGUpLGcoZSxmdW5jdGlvbihlKXtkKGUpfSl9ZnVuY3Rpb24gZChlKXt5P3IoZnVuY3Rpb24oKXtsKGUpfSk6bChlKX1mdW5jdGlvbiBsKGUpe2UuX191cGdyYWRlZF9fJiZlLl9fYXR0YWNoZWQmJihlLl9fYXR0YWNoZWQ9ITEsZS5kZXRhY2hlZENhbGxiYWNrJiZlLmRldGFjaGVkQ2FsbGJhY2soKSl9ZnVuY3Rpb24gdShlKXtmb3IodmFyIHQ9ZSxuPXdpbmRvdy53cmFwKGRvY3VtZW50KTt0Oyl7aWYodD09bilyZXR1cm4hMDt0PXQucGFyZW50Tm9kZXx8dC5ub2RlVHlwZT09PU5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERSYmdC5ob3N0fX1mdW5jdGlvbiBoKGUpe2lmKGUuc2hhZG93Um9vdCYmIWUuc2hhZG93Um9vdC5fX3dhdGNoZWQpe18uZG9tJiZjb25zb2xlLmxvZygid2F0Y2hpbmcgc2hhZG93LXJvb3QgZm9yOiAiLGUubG9jYWxOYW1lKTtmb3IodmFyIHQ9ZS5zaGFkb3dSb290O3Q7KW0odCksdD10Lm9sZGVyU2hhZG93Um9vdH19ZnVuY3Rpb24gZihlLG4pe2lmKF8uZG9tKXt2YXIgbz1uWzBdO2lmKG8mJiJjaGlsZExpc3QiPT09by50eXBlJiZvLmFkZGVkTm9kZXMmJm8uYWRkZWROb2Rlcyl7Zm9yKHZhciByPW8uYWRkZWROb2Rlc1swXTtyJiZyIT09ZG9jdW1lbnQmJiFyLmhvc3Q7KXI9ci5wYXJlbnROb2RlO3ZhciBpPXImJihyLlVSTHx8ci5fVVJMfHxyLmhvc3QmJnIuaG9zdC5sb2NhbE5hbWUpfHwiIjtpPWkuc3BsaXQoIi8/Iikuc2hpZnQoKS5zcGxpdCgiLyIpLnBvcCgpfWNvbnNvbGUuZ3JvdXAoIm11dGF0aW9ucyAoJWQpIFslc10iLG4ubGVuZ3RoLGl8fCIiKX12YXIgYT11KGUpO24uZm9yRWFjaChmdW5jdGlvbihlKXsiY2hpbGRMaXN0Ij09PWUudHlwZSYmKE4oZS5hZGRlZE5vZGVzLGZ1bmN0aW9uKGUpe2UubG9jYWxOYW1lJiZ0KGUsYSl9KSxOKGUucmVtb3ZlZE5vZGVzLGZ1bmN0aW9uKGUpe2UubG9jYWxOYW1lJiZjKGUpfSkpfSksXy5kb20mJmNvbnNvbGUuZ3JvdXBFbmQoKX1mdW5jdGlvbiBwKGUpe2ZvcihlPXdpbmRvdy53cmFwKGUpLGV8fChlPXdpbmRvdy53cmFwKGRvY3VtZW50KSk7ZS5wYXJlbnROb2RlOyllPWUucGFyZW50Tm9kZTt2YXIgdD1lLl9fb2JzZXJ2ZXI7dCYmKGYoZSx0LnRha2VSZWNvcmRzKCkpLGkoKSl9ZnVuY3Rpb24gbShlKXtpZighZS5fX29ic2VydmVyKXt2YXIgdD1uZXcgTXV0YXRpb25PYnNlcnZlcihmLmJpbmQodGhpcyxlKSk7dC5vYnNlcnZlKGUse2NoaWxkTGlzdDohMCxzdWJ0cmVlOiEwfSksZS5fX29ic2VydmVyPXR9fWZ1bmN0aW9uIHYoZSl7ZT13aW5kb3cud3JhcChlKSxfLmRvbSYmY29uc29sZS5ncm91cCgidXBncmFkZURvY3VtZW50OiAiLGUuYmFzZVVSSS5zcGxpdCgiLyIpLnBvcCgpKTt2YXIgbj1lPT09d2luZG93LndyYXAoZG9jdW1lbnQpO3QoZSxuKSxtKGUpLF8uZG9tJiZjb25zb2xlLmdyb3VwRW5kKCl9ZnVuY3Rpb24gdyhlKXtiKGUsdil9dmFyIF89ZS5mbGFncyxnPWUuZm9yU3VidHJlZSxiPWUuZm9yRG9jdW1lbnRUcmVlLHk9d2luZG93Lk11dGF0aW9uT2JzZXJ2ZXIuX2lzUG9seWZpbGxlZCYmX1sidGhyb3R0bGUtYXR0YWNoZWQiXTtlLmhhc1BvbHlmaWxsTXV0YXRpb25zPXksZS5oYXNUaHJvdHRsZWRBdHRhY2hlZD15O3ZhciBFPSExLEw9W10sTj1BcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsLmJpbmQoQXJyYXkucHJvdG90eXBlLmZvckVhY2gpLE09RWxlbWVudC5wcm90b3R5cGUuY3JlYXRlU2hhZG93Um9vdDtNJiYoRWxlbWVudC5wcm90b3R5cGUuY3JlYXRlU2hhZG93Um9vdD1mdW5jdGlvbigpe3ZhciBlPU0uY2FsbCh0aGlzKTtyZXR1cm4gd2luZG93LkN1c3RvbUVsZW1lbnRzLndhdGNoU2hhZG93KHRoaXMpLGV9KSxlLndhdGNoU2hhZG93PWgsZS51cGdyYWRlRG9jdW1lbnRUcmVlPXcsZS51cGdyYWRlRG9jdW1lbnQ9dixlLnVwZ3JhZGVTdWJ0cmVlPW8sZS51cGdyYWRlQWxsPXQsZS5hdHRhY2hlZD1hLGUudGFrZVJlY29yZHM9cH0pLHdpbmRvdy5DdXN0b21FbGVtZW50cy5hZGRNb2R1bGUoZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdCh0LG8pe2lmKCJ0ZW1wbGF0ZSI9PT10LmxvY2FsTmFtZSYmd2luZG93LkhUTUxUZW1wbGF0ZUVsZW1lbnQmJkhUTUxUZW1wbGF0ZUVsZW1lbnQuZGVjb3JhdGUmJkhUTUxUZW1wbGF0ZUVsZW1lbnQuZGVjb3JhdGUodCksIXQuX191cGdyYWRlZF9fJiZ0Lm5vZGVUeXBlPT09Tm9kZS5FTEVNRU5UX05PREUpe3ZhciByPXQuZ2V0QXR0cmlidXRlKCJpcyIpLGk9ZS5nZXRSZWdpc3RlcmVkRGVmaW5pdGlvbih0LmxvY2FsTmFtZSl8fGUuZ2V0UmVnaXN0ZXJlZERlZmluaXRpb24ocik7aWYoaSYmKHImJmkudGFnPT10LmxvY2FsTmFtZXx8IXImJiFpWyJleHRlbmRzIl0pKXJldHVybiBuKHQsaSxvKX19ZnVuY3Rpb24gbih0LG4scil7cmV0dXJuIGEudXBncmFkZSYmY29uc29sZS5ncm91cCgidXBncmFkZToiLHQubG9jYWxOYW1lKSxuLmlzJiZ0LnNldEF0dHJpYnV0ZSgiaXMiLG4uaXMpLG8odCxuKSx0Ll9fdXBncmFkZWRfXz0hMCxpKHQpLHImJmUuYXR0YWNoZWQodCksZS51cGdyYWRlU3VidHJlZSh0LHIpLGEudXBncmFkZSYmY29uc29sZS5ncm91cEVuZCgpLHR9ZnVuY3Rpb24gbyhlLHQpe09iamVjdC5fX3Byb3RvX18/ZS5fX3Byb3RvX189dC5wcm90b3R5cGU6KHIoZSx0LnByb3RvdHlwZSx0WyJuYXRpdmUiXSksZS5fX3Byb3RvX189dC5wcm90b3R5cGUpfWZ1bmN0aW9uIHIoZSx0LG4pe2Zvcih2YXIgbz17fSxyPXQ7ciE9PW4mJnIhPT1IVE1MRWxlbWVudC5wcm90b3R5cGU7KXtmb3IodmFyIGksYT1PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhyKSxzPTA7aT1hW3NdO3MrKylvW2ldfHwoT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsaSxPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHIsaSkpLG9baV09MSk7cj1PYmplY3QuZ2V0UHJvdG90eXBlT2Yocil9fWZ1bmN0aW9uIGkoZSl7ZS5jcmVhdGVkQ2FsbGJhY2smJmUuY3JlYXRlZENhbGxiYWNrKCl9dmFyIGE9ZS5mbGFncztlLnVwZ3JhZGU9dCxlLnVwZ3JhZGVXaXRoRGVmaW5pdGlvbj1uLGUuaW1wbGVtZW50UHJvdG90eXBlPW99KSx3aW5kb3cuQ3VzdG9tRWxlbWVudHMuYWRkTW9kdWxlKGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQodCxvKXt2YXIgYz1vfHx7fTtpZighdCl0aHJvdyBuZXcgRXJyb3IoImRvY3VtZW50LnJlZ2lzdGVyRWxlbWVudDogZmlyc3QgYXJndW1lbnQgYG5hbWVgIG11c3Qgbm90IGJlIGVtcHR5Iik7aWYodC5pbmRleE9mKCItIik8MCl0aHJvdyBuZXcgRXJyb3IoImRvY3VtZW50LnJlZ2lzdGVyRWxlbWVudDogZmlyc3QgYXJndW1lbnQgKCduYW1lJykgbXVzdCBjb250YWluIGEgZGFzaCAoJy0nKS4gQXJndW1lbnQgcHJvdmlkZWQgd2FzICciK1N0cmluZyh0KSsiJy4iKTtpZihyKHQpKXRocm93IG5ldyBFcnJvcigiRmFpbGVkIHRvIGV4ZWN1dGUgJ3JlZ2lzdGVyRWxlbWVudCcgb24gJ0RvY3VtZW50JzogUmVnaXN0cmF0aW9uIGZhaWxlZCBmb3IgdHlwZSAnIitTdHJpbmcodCkrIicuIFRoZSB0eXBlIG5hbWUgaXMgaW52YWxpZC4iKTtpZihkKHQpKXRocm93IG5ldyBFcnJvcigiRHVwbGljYXRlRGVmaW5pdGlvbkVycm9yOiBhIHR5cGUgd2l0aCBuYW1lICciK1N0cmluZyh0KSsiJyBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQiKTtyZXR1cm4gYy5wcm90b3R5cGV8fChjLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKEhUTUxFbGVtZW50LnByb3RvdHlwZSkpLGMuX19uYW1lPXQudG9Mb3dlckNhc2UoKSxjWyJleHRlbmRzIl0mJihjWyJleHRlbmRzIl09Y1siZXh0ZW5kcyJdLnRvTG93ZXJDYXNlKCkpLGMubGlmZWN5Y2xlPWMubGlmZWN5Y2xlfHx7fSxjLmFuY2VzdHJ5PWkoY1siZXh0ZW5kcyJdKSxhKGMpLHMoYyksbihjLnByb3RvdHlwZSksbChjLl9fbmFtZSxjKSxjLmN0b3I9dShjKSxjLmN0b3IucHJvdG90eXBlPWMucHJvdG90eXBlLGMucHJvdG90eXBlLmNvbnN0cnVjdG9yPWMuY3RvcixlLnJlYWR5JiZ2KGRvY3VtZW50KSxjLmN0b3J9ZnVuY3Rpb24gbihlKXtpZighZS5zZXRBdHRyaWJ1dGUuX3BvbHlmaWxsZWQpe3ZhciB0PWUuc2V0QXR0cmlidXRlO2Uuc2V0QXR0cmlidXRlPWZ1bmN0aW9uKGUsbil7by5jYWxsKHRoaXMsZSxuLHQpfTt2YXIgbj1lLnJlbW92ZUF0dHJpYnV0ZTtlLnJlbW92ZUF0dHJpYnV0ZT1mdW5jdGlvbihlKXtvLmNhbGwodGhpcyxlLG51bGwsbil9LGUuc2V0QXR0cmlidXRlLl9wb2x5ZmlsbGVkPSEwfX1mdW5jdGlvbiBvKGUsdCxuKXtlPWUudG9Mb3dlckNhc2UoKTt2YXIgbz10aGlzLmdldEF0dHJpYnV0ZShlKTtuLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt2YXIgcj10aGlzLmdldEF0dHJpYnV0ZShlKTt0aGlzLmF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayYmciE9PW8mJnRoaXMuYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKGUsbyxyKX1mdW5jdGlvbiByKGUpe2Zvcih2YXIgdD0wO3Q8eS5sZW5ndGg7dCsrKWlmKGU9PT15W3RdKXJldHVybiEwfWZ1bmN0aW9uIGkoZSl7dmFyIHQ9ZChlKTtyZXR1cm4gdD9pKHRbImV4dGVuZHMiXSkuY29uY2F0KFt0XSk6W119ZnVuY3Rpb24gYShlKXtmb3IodmFyIHQsbj1lWyJleHRlbmRzIl0sbz0wO3Q9ZS5hbmNlc3RyeVtvXTtvKyspbj10LmlzJiZ0LnRhZztlLnRhZz1ufHxlLl9fbmFtZSxuJiYoZS5pcz1lLl9fbmFtZSl9ZnVuY3Rpb24gcyhlKXtpZighT2JqZWN0Ll9fcHJvdG9fXyl7dmFyIHQ9SFRNTEVsZW1lbnQucHJvdG90eXBlO2lmKGUuaXMpe3ZhciBuPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoZS50YWcpO3Q9T2JqZWN0LmdldFByb3RvdHlwZU9mKG4pfWZvcih2YXIgbyxyPWUucHJvdG90eXBlLGk9ITE7cjspcj09dCYmKGk9ITApLG89T2JqZWN0LmdldFByb3RvdHlwZU9mKHIpLG8mJihyLl9fcHJvdG9fXz1vKSxyPW87aXx8Y29uc29sZS53YXJuKGUudGFnKyIgcHJvdG90eXBlIG5vdCBmb3VuZCBpbiBwcm90b3R5cGUgY2hhaW4gZm9yICIrZS5pcyksZVsibmF0aXZlIl09dH19ZnVuY3Rpb24gYyhlKXtyZXR1cm4gXyhOKGUudGFnKSxlKX1mdW5jdGlvbiBkKGUpe2lmKGUpcmV0dXJuIEVbZS50b0xvd2VyQ2FzZSgpXX1mdW5jdGlvbiBsKGUsdCl7RVtlXT10fWZ1bmN0aW9uIHUoZSl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGMoZSl9fWZ1bmN0aW9uIGgoZSx0LG4pe3JldHVybiBlPT09TD9mKHQsbik6TShlLHQpfWZ1bmN0aW9uIGYoZSx0KXtlJiYoZT1lLnRvTG93ZXJDYXNlKCkpLHQmJih0PXQudG9Mb3dlckNhc2UoKSk7dmFyIG49ZCh0fHxlKTtpZihuKXtpZihlPT1uLnRhZyYmdD09bi5pcylyZXR1cm4gbmV3IG4uY3RvcjtpZighdCYmIW4uaXMpcmV0dXJuIG5ldyBuLmN0b3J9dmFyIG87cmV0dXJuIHQ/KG89ZihlKSxvLnNldEF0dHJpYnV0ZSgiaXMiLHQpLG8pOihvPU4oZSksZS5pbmRleE9mKCItIik+PTAmJmcobyxIVE1MRWxlbWVudCksbyl9ZnVuY3Rpb24gcChlLHQpe3ZhciBuPWVbdF07ZVt0XT1mdW5jdGlvbigpe3ZhciBlPW4uYXBwbHkodGhpcyxhcmd1bWVudHMpO3JldHVybiB3KGUpLGV9fXZhciBtLHY9KGUuaXNJRSxlLnVwZ3JhZGVEb2N1bWVudFRyZWUpLHc9ZS51cGdyYWRlQWxsLF89ZS51cGdyYWRlV2l0aERlZmluaXRpb24sZz1lLmltcGxlbWVudFByb3RvdHlwZSxiPWUudXNlTmF0aXZlLHk9WyJhbm5vdGF0aW9uLXhtbCIsImNvbG9yLXByb2ZpbGUiLCJmb250LWZhY2UiLCJmb250LWZhY2Utc3JjIiwiZm9udC1mYWNlLXVyaSIsImZvbnQtZmFjZS1mb3JtYXQiLCJmb250LWZhY2UtbmFtZSIsIm1pc3NpbmctZ2x5cGgiXSxFPXt9LEw9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiLE49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudC5iaW5kKGRvY3VtZW50KSxNPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUy5iaW5kKGRvY3VtZW50KTttPU9iamVjdC5fX3Byb3RvX198fGI/ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZSBpbnN0YW5jZW9mIHR9OmZ1bmN0aW9uKGUsdCl7aWYoZSBpbnN0YW5jZW9mIHQpcmV0dXJuITA7Zm9yKHZhciBuPWU7bjspe2lmKG49PT10LnByb3RvdHlwZSlyZXR1cm4hMDtuPW4uX19wcm90b19ffXJldHVybiExfSxwKE5vZGUucHJvdG90eXBlLCJjbG9uZU5vZGUiKSxwKGRvY3VtZW50LCJpbXBvcnROb2RlIiksZG9jdW1lbnQucmVnaXN0ZXJFbGVtZW50PXQsZG9jdW1lbnQuY3JlYXRlRWxlbWVudD1mLGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUz1oLGUucmVnaXN0cnk9RSxlWyJpbnN0YW5jZW9mIl09bSxlLnJlc2VydmVkVGFnTGlzdD15LGUuZ2V0UmVnaXN0ZXJlZERlZmluaXRpb249ZCxkb2N1bWVudC5yZWdpc3Rlcj1kb2N1bWVudC5yZWdpc3RlckVsZW1lbnR9KSxmdW5jdGlvbihlKXtmdW5jdGlvbiB0KCl7aSh3aW5kb3cud3JhcChkb2N1bWVudCkpLHdpbmRvdy5DdXN0b21FbGVtZW50cy5yZWFkeT0hMDt2YXIgZT13aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lfHxmdW5jdGlvbihlKXtzZXRUaW1lb3V0KGUsMTYpfTtlKGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3dpbmRvdy5DdXN0b21FbGVtZW50cy5yZWFkeVRpbWU9RGF0ZS5ub3coKSx3aW5kb3cuSFRNTEltcG9ydHMmJih3aW5kb3cuQ3VzdG9tRWxlbWVudHMuZWxhcHNlZD13aW5kb3cuQ3VzdG9tRWxlbWVudHMucmVhZHlUaW1lLXdpbmRvdy5IVE1MSW1wb3J0cy5yZWFkeVRpbWUpLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJXZWJDb21wb25lbnRzUmVhZHkiLHtidWJibGVzOiEwfSkpfSl9KX12YXIgbj1lLnVzZU5hdGl2ZSxvPWUuaW5pdGlhbGl6ZU1vZHVsZXM7ZS5pc0lFO2lmKG4pe3ZhciByPWZ1bmN0aW9uKCl7fTtlLndhdGNoU2hhZG93PXIsZS51cGdyYWRlPXIsZS51cGdyYWRlQWxsPXIsZS51cGdyYWRlRG9jdW1lbnRUcmVlPXIsZS51cGdyYWRlU3VidHJlZT1yLGUudGFrZVJlY29yZHM9cixlWyJpbnN0YW5jZW9mIl09ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZSBpbnN0YW5jZW9mIHR9fWVsc2UgbygpO3ZhciBpPWUudXBncmFkZURvY3VtZW50VHJlZSxhPWUudXBncmFkZURvY3VtZW50O2lmKHdpbmRvdy53cmFwfHwod2luZG93LlNoYWRvd0RPTVBvbHlmaWxsPyh3aW5kb3cud3JhcD13aW5kb3cuU2hhZG93RE9NUG9seWZpbGwud3JhcElmTmVlZGVkLHdpbmRvdy51bndyYXA9d2luZG93LlNoYWRvd0RPTVBvbHlmaWxsLnVud3JhcElmTmVlZGVkKTp3aW5kb3cud3JhcD13aW5kb3cudW53cmFwPWZ1bmN0aW9uKGUpe3JldHVybiBlfSksd2luZG93LkhUTUxJbXBvcnRzJiYod2luZG93LkhUTUxJbXBvcnRzLl9faW1wb3J0c1BhcnNpbmdIb29rPWZ1bmN0aW9uKGUpe2VbImltcG9ydCJdJiZhKHdyYXAoZVsiaW1wb3J0Il0pKX0pLCJjb21wbGV0ZSI9PT1kb2N1bWVudC5yZWFkeVN0YXRlfHxlLmZsYWdzLmVhZ2VyKXQoKTtlbHNlIGlmKCJpbnRlcmFjdGl2ZSIhPT1kb2N1bWVudC5yZWFkeVN0YXRlfHx3aW5kb3cuYXR0YWNoRXZlbnR8fHdpbmRvdy5IVE1MSW1wb3J0cyYmIXdpbmRvdy5IVE1MSW1wb3J0cy5yZWFkeSl7dmFyIHM9d2luZG93LkhUTUxJbXBvcnRzJiYhd2luZG93LkhUTUxJbXBvcnRzLnJlYWR5PyJIVE1MSW1wb3J0c0xvYWRlZCI6IkRPTUNvbnRlbnRMb2FkZWQiO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKHMsdCl9ZWxzZSB0KCl9KHdpbmRvdy5DdXN0b21FbGVtZW50cyksZnVuY3Rpb24oZSl7dmFyIHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTt0LnRleHRDb250ZW50PSJib2R5IHt0cmFuc2l0aW9uOiBvcGFjaXR5IGVhc2UtaW4gMC4yczsgfSBcbmJvZHlbdW5yZXNvbHZlZF0ge29wYWNpdHk6IDA7IGRpc3BsYXk6IGJsb2NrOyBvdmVyZmxvdzogaGlkZGVuOyBwb3NpdGlvbjogcmVsYXRpdmU7IH0gXG4iO3ZhciBuPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoImhlYWQiKTtuLmluc2VydEJlZm9yZSh0LG4uZmlyc3RDaGlsZCl9KHdpbmRvdy5XZWJDb21wb25lbnRzKTs8L3NjcmlwdD48c2NyaXB0Pi8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi8vCi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwovLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi8vICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLy8KLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi8vCi8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi8vICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgoKIWZ1bmN0aW9uKGEsYil7dmFyIGM9e30sZD17fSxlPXt9LGY9bnVsbDshZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBjKGEpe2lmKCJudW1iZXIiPT10eXBlb2YgYSlyZXR1cm4gYTt2YXIgYj17fTtmb3IodmFyIGMgaW4gYSliW2NdPWFbY107cmV0dXJuIGJ9ZnVuY3Rpb24gZCgpe3RoaXMuX2RlbGF5PTAsdGhpcy5fZW5kRGVsYXk9MCx0aGlzLl9maWxsPSJub25lIix0aGlzLl9pdGVyYXRpb25TdGFydD0wLHRoaXMuX2l0ZXJhdGlvbnM9MSx0aGlzLl9kdXJhdGlvbj0wLHRoaXMuX3BsYXliYWNrUmF0ZT0xLHRoaXMuX2RpcmVjdGlvbj0ibm9ybWFsIix0aGlzLl9lYXNpbmc9ImxpbmVhciIsdGhpcy5fZWFzaW5nRnVuY3Rpb249d31mdW5jdGlvbiBlKCl7cmV0dXJuIGEuaXNEZXByZWNhdGVkKCJJbnZhbGlkIHRpbWluZyBpbnB1dHMiLCIyMDE2LTAzLTAyIiwiVHlwZUVycm9yIGV4Y2VwdGlvbnMgd2lsbCBiZSB0aHJvd24gaW5zdGVhZC4iLCEwKX1mdW5jdGlvbiBmKGIsYyxlKXt2YXIgZj1uZXcgZDtyZXR1cm4gYyYmKGYuZmlsbD0iYm90aCIsZi5kdXJhdGlvbj0iYXV0byIpLCJudW1iZXIiIT10eXBlb2YgYnx8aXNOYU4oYik/dm9pZCAwIT09YiYmT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoYikuZm9yRWFjaChmdW5jdGlvbihjKXtpZigiYXV0byIhPWJbY10pe2lmKCgibnVtYmVyIj09dHlwZW9mIGZbY118fCJkdXJhdGlvbiI9PWMpJiYoIm51bWJlciIhPXR5cGVvZiBiW2NdfHxpc05hTihiW2NdKSkpcmV0dXJuO2lmKCJmaWxsIj09YyYmLTE9PXUuaW5kZXhPZihiW2NdKSlyZXR1cm47aWYoImRpcmVjdGlvbiI9PWMmJi0xPT12LmluZGV4T2YoYltjXSkpcmV0dXJuO2lmKCJwbGF5YmFja1JhdGUiPT1jJiYxIT09YltjXSYmYS5pc0RlcHJlY2F0ZWQoIkFuaW1hdGlvbkVmZmVjdFRpbWluZy5wbGF5YmFja1JhdGUiLCIyMDE0LTExLTI4IiwiVXNlIEFuaW1hdGlvbi5wbGF5YmFja1JhdGUgaW5zdGVhZC4iKSlyZXR1cm47ZltjXT1iW2NdfX0pOmYuZHVyYXRpb249YixmfWZ1bmN0aW9uIGcoYSl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiBhJiYoYT1pc05hTihhKT97ZHVyYXRpb246MH06e2R1cmF0aW9uOmF9KSxhfWZ1bmN0aW9uIGgoYixjKXtyZXR1cm4gYj1hLm51bWVyaWNUaW1pbmdUb09iamVjdChiKSxmKGIsYyl9ZnVuY3Rpb24gaShhLGIsYyxkKXtyZXR1cm4gMD5hfHxhPjF8fDA+Y3x8Yz4xP3c6ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gZihhLGIsYyl7cmV0dXJuIDMqYSooMS1jKSooMS1jKSpjKzMqYiooMS1jKSpjKmMrYypjKmN9aWYoMD09ZXx8MT09ZSlyZXR1cm4gZTtmb3IodmFyIGc9MCxoPTE7Oyl7dmFyIGk9KGcraCkvMixqPWYoYSxjLGkpO2lmKE1hdGguYWJzKGUtaik8MWUtNClyZXR1cm4gZihiLGQsaSk7ZT5qP2c9aTpoPWl9fX1mdW5jdGlvbiBqKGEsYil7cmV0dXJuIGZ1bmN0aW9uKGMpe2lmKGM+PTEpcmV0dXJuIDE7dmFyIGQ9MS9hO3JldHVybiBjKz1iKmQsYy1jJWR9fWZ1bmN0aW9uIGsoYSl7Qnx8KEI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iikuc3R5bGUpLEIuYW5pbWF0aW9uVGltaW5nRnVuY3Rpb249IiIsQi5hbmltYXRpb25UaW1pbmdGdW5jdGlvbj1hO3ZhciBiPUIuYW5pbWF0aW9uVGltaW5nRnVuY3Rpb247aWYoIiI9PWImJmUoKSl0aHJvdyBuZXcgVHlwZUVycm9yKGErIiBpcyBub3QgYSB2YWxpZCB2YWx1ZSBmb3IgZWFzaW5nIik7dmFyIGM9RC5leGVjKGIpO2lmKGMpcmV0dXJuIGkuYXBwbHkodGhpcyxjLnNsaWNlKDEpLm1hcChOdW1iZXIpKTt2YXIgZD1FLmV4ZWMoYik7aWYoZClyZXR1cm4gaihOdW1iZXIoZFsxXSkse3N0YXJ0OngsbWlkZGxlOnksZW5kOnp9W2RbMl1dKTt2YXIgZj1BW2JdO3JldHVybiBmP2Y6d31mdW5jdGlvbiBsKGEpe3JldHVybiBNYXRoLmFicyhtKGEpL2EucGxheWJhY2tSYXRlKX1mdW5jdGlvbiBtKGEpe3JldHVybiBhLmR1cmF0aW9uKmEuaXRlcmF0aW9uc31mdW5jdGlvbiBuKGEsYixjKXtyZXR1cm4gbnVsbD09Yj9GOmI8Yy5kZWxheT9HOmI+PWMuZGVsYXkrYT9IOkl9ZnVuY3Rpb24gbyhhLGIsYyxkLGUpe3N3aXRjaChkKXtjYXNlIEc6cmV0dXJuImJhY2t3YXJkcyI9PWJ8fCJib3RoIj09Yj8wOm51bGw7Y2FzZSBJOnJldHVybiBjLWU7Y2FzZSBIOnJldHVybiJmb3J3YXJkcyI9PWJ8fCJib3RoIj09Yj9hOm51bGw7Y2FzZSBGOnJldHVybiBudWxsfX1mdW5jdGlvbiBwKGEsYixjLGQpe3JldHVybihkLnBsYXliYWNrUmF0ZTwwP2ItYTpiKSpkLnBsYXliYWNrUmF0ZStjfWZ1bmN0aW9uIHEoYSxiLGMsZCxlKXtyZXR1cm4gYz09PTEvMHx8Yz09PS0oMS8wKXx8Yy1kPT1iJiZlLml0ZXJhdGlvbnMmJihlLml0ZXJhdGlvbnMrZS5pdGVyYXRpb25TdGFydCklMT09MD9hOmMlYX1mdW5jdGlvbiByKGEsYixjLGQpe3JldHVybiAwPT09Yz8wOmI9PWE/ZC5pdGVyYXRpb25TdGFydCtkLml0ZXJhdGlvbnMtMTpNYXRoLmZsb29yKGMvYSl9ZnVuY3Rpb24gcyhhLGIsYyxkKXt2YXIgZT1hJTI+PTEsZj0ibm9ybWFsIj09ZC5kaXJlY3Rpb258fGQuZGlyZWN0aW9uPT0oZT8iYWx0ZXJuYXRlLXJldmVyc2UiOiJhbHRlcm5hdGUiKSxnPWY/YzpiLWMsaD1nL2I7cmV0dXJuIGIqZC5fZWFzaW5nRnVuY3Rpb24oaCl9ZnVuY3Rpb24gdChhLGIsYyl7dmFyIGQ9bihhLGIsYyksZT1vKGEsYy5maWxsLGIsZCxjLmRlbGF5KTtpZihudWxsPT09ZSlyZXR1cm4gbnVsbDtpZigwPT09YSlyZXR1cm4gZD09PUc/MDoxO3ZhciBmPWMuaXRlcmF0aW9uU3RhcnQqYy5kdXJhdGlvbixnPXAoYSxlLGYsYyksaD1xKGMuZHVyYXRpb24sbShjKSxnLGYsYyksaT1yKGMuZHVyYXRpb24saCxnLGMpO3JldHVybiBzKGksYy5kdXJhdGlvbixoLGMpL2MuZHVyYXRpb259dmFyIHU9ImJhY2t3YXJkc3xmb3J3YXJkc3xib3RofG5vbmUiLnNwbGl0KCJ8Iiksdj0icmV2ZXJzZXxhbHRlcm5hdGV8YWx0ZXJuYXRlLXJldmVyc2UiLnNwbGl0KCJ8Iiksdz1mdW5jdGlvbihhKXtyZXR1cm4gYX07ZC5wcm90b3R5cGU9e19zZXRNZW1iZXI6ZnVuY3Rpb24oYixjKXt0aGlzWyJfIitiXT1jLHRoaXMuX2VmZmVjdCYmKHRoaXMuX2VmZmVjdC5fdGltaW5nSW5wdXRbYl09Yyx0aGlzLl9lZmZlY3QuX3RpbWluZz1hLm5vcm1hbGl6ZVRpbWluZ0lucHV0KHRoaXMuX2VmZmVjdC5fdGltaW5nSW5wdXQpLHRoaXMuX2VmZmVjdC5hY3RpdmVEdXJhdGlvbj1hLmNhbGN1bGF0ZUFjdGl2ZUR1cmF0aW9uKHRoaXMuX2VmZmVjdC5fdGltaW5nKSx0aGlzLl9lZmZlY3QuX2FuaW1hdGlvbiYmdGhpcy5fZWZmZWN0Ll9hbmltYXRpb24uX3JlYnVpbGRVbmRlcmx5aW5nQW5pbWF0aW9uKCkpfSxnZXQgcGxheWJhY2tSYXRlKCl7cmV0dXJuIHRoaXMuX3BsYXliYWNrUmF0ZX0sc2V0IGRlbGF5KGEpe3RoaXMuX3NldE1lbWJlcigiZGVsYXkiLGEpfSxnZXQgZGVsYXkoKXtyZXR1cm4gdGhpcy5fZGVsYXl9LHNldCBlbmREZWxheShhKXt0aGlzLl9zZXRNZW1iZXIoImVuZERlbGF5IixhKX0sZ2V0IGVuZERlbGF5KCl7cmV0dXJuIHRoaXMuX2VuZERlbGF5fSxzZXQgZmlsbChhKXt0aGlzLl9zZXRNZW1iZXIoImZpbGwiLGEpfSxnZXQgZmlsbCgpe3JldHVybiB0aGlzLl9maWxsfSxzZXQgaXRlcmF0aW9uU3RhcnQoYSl7aWYoKGlzTmFOKGEpfHwwPmEpJiZlKCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiaXRlcmF0aW9uU3RhcnQgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBudW1iZXIsIHJlY2VpdmVkOiAiK3RpbWluZy5pdGVyYXRpb25TdGFydCk7dGhpcy5fc2V0TWVtYmVyKCJpdGVyYXRpb25TdGFydCIsYSl9LGdldCBpdGVyYXRpb25TdGFydCgpe3JldHVybiB0aGlzLl9pdGVyYXRpb25TdGFydH0sc2V0IGR1cmF0aW9uKGEpe2lmKCJhdXRvIiE9YSYmKGlzTmFOKGEpfHwwPmEpJiZlKCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiZHVyYXRpb24gbXVzdCBiZSBub24tbmVnYXRpdmUgb3IgYXV0bywgcmVjZWl2ZWQ6ICIrYSk7dGhpcy5fc2V0TWVtYmVyKCJkdXJhdGlvbiIsYSl9LGdldCBkdXJhdGlvbigpe3JldHVybiB0aGlzLl9kdXJhdGlvbn0sc2V0IGRpcmVjdGlvbihhKXt0aGlzLl9zZXRNZW1iZXIoImRpcmVjdGlvbiIsYSl9LGdldCBkaXJlY3Rpb24oKXtyZXR1cm4gdGhpcy5fZGlyZWN0aW9ufSxzZXQgZWFzaW5nKGEpe3RoaXMuX2Vhc2luZ0Z1bmN0aW9uPWsoYSksdGhpcy5fc2V0TWVtYmVyKCJlYXNpbmciLGEpfSxnZXQgZWFzaW5nKCl7cmV0dXJuIHRoaXMuX2Vhc2luZ30sc2V0IGl0ZXJhdGlvbnMoYSl7aWYoKGlzTmFOKGEpfHwwPmEpJiZlKCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiaXRlcmF0aW9ucyBtdXN0IGJlIG5vbi1uZWdhdGl2ZSwgcmVjZWl2ZWQ6ICIrYSk7dGhpcy5fc2V0TWVtYmVyKCJpdGVyYXRpb25zIixhKX0sZ2V0IGl0ZXJhdGlvbnMoKXtyZXR1cm4gdGhpcy5faXRlcmF0aW9uc319O3ZhciB4PTEseT0uNSx6PTAsQT17ZWFzZTppKC4yNSwuMSwuMjUsMSksImVhc2UtaW4iOmkoLjQyLDAsMSwxKSwiZWFzZS1vdXQiOmkoMCwwLC41OCwxKSwiZWFzZS1pbi1vdXQiOmkoLjQyLDAsLjU4LDEpLCJzdGVwLXN0YXJ0IjpqKDEseCksInN0ZXAtbWlkZGxlIjpqKDEseSksInN0ZXAtZW5kIjpqKDEseil9LEI9bnVsbCxDPSJcXHMqKC0/XFxkK1xcLj9cXGQqfC0/XFwuXFxkKylcXHMqIixEPW5ldyBSZWdFeHAoImN1YmljLWJlemllclxcKCIrQysiLCIrQysiLCIrQysiLCIrQysiXFwpIiksRT0vc3RlcHNcKFxzKihcZCspXHMqLFxzKihzdGFydHxtaWRkbGV8ZW5kKVxzKlwpLyxGPTAsRz0xLEg9MixJPTM7YS5jbG9uZVRpbWluZ0lucHV0PWMsYS5tYWtlVGltaW5nPWYsYS5udW1lcmljVGltaW5nVG9PYmplY3Q9ZyxhLm5vcm1hbGl6ZVRpbWluZ0lucHV0PWgsYS5jYWxjdWxhdGVBY3RpdmVEdXJhdGlvbj1sLGEuY2FsY3VsYXRlVGltZUZyYWN0aW9uPXQsYS5jYWxjdWxhdGVQaGFzZT1uLGEudG9UaW1pbmdGdW5jdGlvbj1rfShjLGYpLGZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYyhhLGIpe3JldHVybiBhIGluIGo/althXVtiXXx8YjpifWZ1bmN0aW9uIGQoYSxiLGQpe3ZhciBlPWdbYV07aWYoZSl7aC5zdHlsZVthXT1iO2Zvcih2YXIgZiBpbiBlKXt2YXIgaT1lW2ZdLGo9aC5zdHlsZVtpXTtkW2ldPWMoaSxqKX19ZWxzZSBkW2FdPWMoYSxiKX1mdW5jdGlvbiBlKGEpe3ZhciBiPVtdO2Zvcih2YXIgYyBpbiBhKWlmKCEoYyBpblsiZWFzaW5nIiwib2Zmc2V0IiwiY29tcG9zaXRlIl0pKXt2YXIgZD1hW2NdO0FycmF5LmlzQXJyYXkoZCl8fChkPVtkXSk7Zm9yKHZhciBlLGY9ZC5sZW5ndGgsZz0wO2Y+ZztnKyspZT17fSwib2Zmc2V0ImluIGE/ZS5vZmZzZXQ9YS5vZmZzZXQ6MT09Zj9lLm9mZnNldD0xOmUub2Zmc2V0PWcvKGYtMSksImVhc2luZyJpbiBhJiYoZS5lYXNpbmc9YS5lYXNpbmcpLCJjb21wb3NpdGUiaW4gYSYmKGUuY29tcG9zaXRlPWEuY29tcG9zaXRlKSxlW2NdPWRbZ10sYi5wdXNoKGUpfXJldHVybiBiLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5vZmZzZXQtYi5vZmZzZXR9KSxifWZ1bmN0aW9uIGYoYSl7ZnVuY3Rpb24gYigpe3ZhciBhPWMubGVuZ3RoO251bGw9PWNbYS0xXS5vZmZzZXQmJihjW2EtMV0ub2Zmc2V0PTEpLGE+MSYmbnVsbD09Y1swXS5vZmZzZXQmJihjWzBdLm9mZnNldD0wKTtmb3IodmFyIGI9MCxkPWNbMF0ub2Zmc2V0LGU9MTthPmU7ZSsrKXt2YXIgZj1jW2VdLm9mZnNldDtpZihudWxsIT1mKXtmb3IodmFyIGc9MTtlLWI+ZztnKyspY1tiK2ddLm9mZnNldD1kKyhmLWQpKmcvKGUtYik7Yj1lLGQ9Zn19fWlmKG51bGw9PWEpcmV0dXJuW107d2luZG93LlN5bWJvbCYmU3ltYm9sLml0ZXJhdG9yJiZBcnJheS5wcm90b3R5cGUuZnJvbSYmYVtTeW1ib2wuaXRlcmF0b3JdJiYoYT1BcnJheS5mcm9tKGEpKSxBcnJheS5pc0FycmF5KGEpfHwoYT1lKGEpKTtmb3IodmFyIGM9YS5tYXAoZnVuY3Rpb24oYSl7dmFyIGI9e307Zm9yKHZhciBjIGluIGEpe3ZhciBlPWFbY107aWYoIm9mZnNldCI9PWMpe2lmKG51bGwhPWUmJihlPU51bWJlcihlKSwhaXNGaW5pdGUoZSkpKXRocm93IG5ldyBUeXBlRXJyb3IoImtleWZyYW1lIG9mZnNldHMgbXVzdCBiZSBudW1iZXJzLiIpfWVsc2V7aWYoImNvbXBvc2l0ZSI9PWMpdGhyb3d7dHlwZTpET01FeGNlcHRpb24uTk9UX1NVUFBPUlRFRF9FUlIsbmFtZToiTm90U3VwcG9ydGVkRXJyb3IiLG1lc3NhZ2U6ImFkZCBjb21wb3NpdGluZyBpcyBub3Qgc3VwcG9ydGVkIn07ZT0iIitlfWQoYyxlLGIpfXJldHVybiB2b2lkIDA9PWIub2Zmc2V0JiYoYi5vZmZzZXQ9bnVsbCksYn0pLGY9ITAsZz0tKDEvMCksaD0wO2g8Yy5sZW5ndGg7aCsrKXt2YXIgaT1jW2hdLm9mZnNldDtpZihudWxsIT1pKXtpZihnPmkpdGhyb3d7Y29kZTpET01FeGNlcHRpb24uSU5WQUxJRF9NT0RJRklDQVRJT05fRVJSLG5hbWU6IkludmFsaWRNb2RpZmljYXRpb25FcnJvciIsbWVzc2FnZToiS2V5ZnJhbWVzIGFyZSBub3QgbG9vc2VseSBzb3J0ZWQgYnkgb2Zmc2V0LiBTb3J0IG9yIHNwZWNpZnkgb2Zmc2V0cy4ifTtnPWl9ZWxzZSBmPSExfXJldHVybiBjPWMuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLm9mZnNldD49MCYmYS5vZmZzZXQ8PTF9KSxmfHxiKCksY312YXIgZz17YmFja2dyb3VuZDpbImJhY2tncm91bmRJbWFnZSIsImJhY2tncm91bmRQb3NpdGlvbiIsImJhY2tncm91bmRTaXplIiwiYmFja2dyb3VuZFJlcGVhdCIsImJhY2tncm91bmRBdHRhY2htZW50IiwiYmFja2dyb3VuZE9yaWdpbiIsImJhY2tncm91bmRDbGlwIiwiYmFja2dyb3VuZENvbG9yIl0sYm9yZGVyOlsiYm9yZGVyVG9wQ29sb3IiLCJib3JkZXJUb3BTdHlsZSIsImJvcmRlclRvcFdpZHRoIiwiYm9yZGVyUmlnaHRDb2xvciIsImJvcmRlclJpZ2h0U3R5bGUiLCJib3JkZXJSaWdodFdpZHRoIiwiYm9yZGVyQm90dG9tQ29sb3IiLCJib3JkZXJCb3R0b21TdHlsZSIsImJvcmRlckJvdHRvbVdpZHRoIiwiYm9yZGVyTGVmdENvbG9yIiwiYm9yZGVyTGVmdFN0eWxlIiwiYm9yZGVyTGVmdFdpZHRoIl0sYm9yZGVyQm90dG9tOlsiYm9yZGVyQm90dG9tV2lkdGgiLCJib3JkZXJCb3R0b21TdHlsZSIsImJvcmRlckJvdHRvbUNvbG9yIl0sYm9yZGVyQ29sb3I6WyJib3JkZXJUb3BDb2xvciIsImJvcmRlclJpZ2h0Q29sb3IiLCJib3JkZXJCb3R0b21Db2xvciIsImJvcmRlckxlZnRDb2xvciJdLGJvcmRlckxlZnQ6WyJib3JkZXJMZWZ0V2lkdGgiLCJib3JkZXJMZWZ0U3R5bGUiLCJib3JkZXJMZWZ0Q29sb3IiXSxib3JkZXJSYWRpdXM6WyJib3JkZXJUb3BMZWZ0UmFkaXVzIiwiYm9yZGVyVG9wUmlnaHRSYWRpdXMiLCJib3JkZXJCb3R0b21SaWdodFJhZGl1cyIsImJvcmRlckJvdHRvbUxlZnRSYWRpdXMiXSxib3JkZXJSaWdodDpbImJvcmRlclJpZ2h0V2lkdGgiLCJib3JkZXJSaWdodFN0eWxlIiwiYm9yZGVyUmlnaHRDb2xvciJdLGJvcmRlclRvcDpbImJvcmRlclRvcFdpZHRoIiwiYm9yZGVyVG9wU3R5bGUiLCJib3JkZXJUb3BDb2xvciJdLGJvcmRlcldpZHRoOlsiYm9yZGVyVG9wV2lkdGgiLCJib3JkZXJSaWdodFdpZHRoIiwiYm9yZGVyQm90dG9tV2lkdGgiLCJib3JkZXJMZWZ0V2lkdGgiXSxmbGV4OlsiZmxleEdyb3ciLCJmbGV4U2hyaW5rIiwiZmxleEJhc2lzIl0sZm9udDpbImZvbnRGYW1pbHkiLCJmb250U2l6ZSIsImZvbnRTdHlsZSIsImZvbnRWYXJpYW50IiwiZm9udFdlaWdodCIsImxpbmVIZWlnaHQiXSxtYXJnaW46WyJtYXJnaW5Ub3AiLCJtYXJnaW5SaWdodCIsIm1hcmdpbkJvdHRvbSIsIm1hcmdpbkxlZnQiXSxvdXRsaW5lOlsib3V0bGluZUNvbG9yIiwib3V0bGluZVN0eWxlIiwib3V0bGluZVdpZHRoIl0scGFkZGluZzpbInBhZGRpbmdUb3AiLCJwYWRkaW5nUmlnaHQiLCJwYWRkaW5nQm90dG9tIiwicGFkZGluZ0xlZnQiXX0saD1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiLCJkaXYiKSxpPXt0aGluOiIxcHgiLG1lZGl1bToiM3B4Iix0aGljazoiNXB4In0saj17Ym9yZGVyQm90dG9tV2lkdGg6aSxib3JkZXJMZWZ0V2lkdGg6aSxib3JkZXJSaWdodFdpZHRoOmksYm9yZGVyVG9wV2lkdGg6aSxmb250U2l6ZTp7Inh4LXNtYWxsIjoiNjAlIiwieC1zbWFsbCI6Ijc1JSIsc21hbGw6Ijg5JSIsbWVkaXVtOiIxMDAlIixsYXJnZToiMTIwJSIsIngtbGFyZ2UiOiIxNTAlIiwieHgtbGFyZ2UiOiIyMDAlIn0sZm9udFdlaWdodDp7bm9ybWFsOiI0MDAiLGJvbGQ6IjcwMCJ9LG91dGxpbmVXaWR0aDppLHRleHRTaGFkb3c6e25vbmU6IjBweCAwcHggMHB4IHRyYW5zcGFyZW50In0sYm94U2hhZG93Ontub25lOiIwcHggMHB4IDBweCAwcHggdHJhbnNwYXJlbnQifX07YS5jb252ZXJ0VG9BcnJheUZvcm09ZSxhLm5vcm1hbGl6ZUtleWZyYW1lcz1mfShjLGYpLGZ1bmN0aW9uKGEpe3ZhciBiPXt9O2EuaXNEZXByZWNhdGVkPWZ1bmN0aW9uKGEsYyxkLGUpe3ZhciBmPWU/ImFyZSI6ImlzIixnPW5ldyBEYXRlLGg9bmV3IERhdGUoYyk7cmV0dXJuIGguc2V0TW9udGgoaC5nZXRNb250aCgpKzMpLGg+Zz8oYSBpbiBifHxjb25zb2xlLndhcm4oIldlYiBBbmltYXRpb25zOiAiK2ErIiAiK2YrIiBkZXByZWNhdGVkIGFuZCB3aWxsIHN0b3Agd29ya2luZyBvbiAiK2gudG9EYXRlU3RyaW5nKCkrIi4gIitkKSxiW2FdPSEwLCExKTohMH0sYS5kZXByZWNhdGVkPWZ1bmN0aW9uKGIsYyxkLGUpe3ZhciBmPWU/ImFyZSI6ImlzIjtpZihhLmlzRGVwcmVjYXRlZChiLGMsZCxlKSl0aHJvdyBuZXcgRXJyb3IoYisiICIrZisiIG5vIGxvbmdlciBzdXBwb3J0ZWQuICIrZCl9fShjKSxmdW5jdGlvbigpe2lmKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5hbmltYXRlKXt2YXIgYT1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuYW5pbWF0ZShbXSwwKSxiPSEwO2lmKGEmJihiPSExLCJwbGF5fGN1cnJlbnRUaW1lfHBhdXNlfHJldmVyc2V8cGxheWJhY2tSYXRlfGNhbmNlbHxmaW5pc2h8c3RhcnRUaW1lfHBsYXlTdGF0ZSIuc3BsaXQoInwiKS5mb3JFYWNoKGZ1bmN0aW9uKGMpe3ZvaWQgMD09PWFbY10mJihiPSEwKX0pKSwhYilyZXR1cm59IWZ1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBkKGEpe2Zvcih2YXIgYj17fSxjPTA7YzxhLmxlbmd0aDtjKyspZm9yKHZhciBkIGluIGFbY10paWYoIm9mZnNldCIhPWQmJiJlYXNpbmciIT1kJiYiY29tcG9zaXRlIiE9ZCl7dmFyIGU9e29mZnNldDphW2NdLm9mZnNldCxlYXNpbmc6YVtjXS5lYXNpbmcsdmFsdWU6YVtjXVtkXX07YltkXT1iW2RdfHxbXSxiW2RdLnB1c2goZSl9Zm9yKHZhciBmIGluIGIpe3ZhciBnPWJbZl07aWYoMCE9Z1swXS5vZmZzZXR8fDEhPWdbZy5sZW5ndGgtMV0ub2Zmc2V0KXRocm93e3R5cGU6RE9NRXhjZXB0aW9uLk5PVF9TVVBQT1JURURfRVJSLG5hbWU6Ik5vdFN1cHBvcnRlZEVycm9yIixtZXNzYWdlOiJQYXJ0aWFsIGtleWZyYW1lcyBhcmUgbm90IHN1cHBvcnRlZCJ9fXJldHVybiBifWZ1bmN0aW9uIGUoYyl7dmFyIGQ9W107Zm9yKHZhciBlIGluIGMpZm9yKHZhciBmPWNbZV0sZz0wO2c8Zi5sZW5ndGgtMTtnKyspe3ZhciBoPWZbZ10ub2Zmc2V0LGk9ZltnKzFdLm9mZnNldCxqPWZbZ10udmFsdWUsaz1mW2crMV0udmFsdWUsbD1mW2ddLmVhc2luZztoPT1pJiYoMT09aT9qPWs6az1qKSxkLnB1c2goe3N0YXJ0VGltZTpoLGVuZFRpbWU6aSxlYXNpbmc6YS50b1RpbWluZ0Z1bmN0aW9uKGw/bDoibGluZWFyIikscHJvcGVydHk6ZSxpbnRlcnBvbGF0aW9uOmIucHJvcGVydHlJbnRlcnBvbGF0aW9uKGUsaixrKX0pfXJldHVybiBkLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5zdGFydFRpbWUtYi5zdGFydFRpbWV9KSxkfWIuY29udmVydEVmZmVjdElucHV0PWZ1bmN0aW9uKGMpe3ZhciBmPWEubm9ybWFsaXplS2V5ZnJhbWVzKGMpLGc9ZChmKSxoPWUoZyk7cmV0dXJuIGZ1bmN0aW9uKGEsYyl7aWYobnVsbCE9YyloLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gMD49YyYmMD09YS5zdGFydFRpbWV8fGM+PTEmJjE9PWEuZW5kVGltZXx8Yz49YS5zdGFydFRpbWUmJmM8PWEuZW5kVGltZX0pLmZvckVhY2goZnVuY3Rpb24oZCl7dmFyIGU9Yy1kLnN0YXJ0VGltZSxmPWQuZW5kVGltZS1kLnN0YXJ0VGltZSxnPTA9PWY/MDpkLmVhc2luZyhlL2YpO2IuYXBwbHkoYSxkLnByb3BlcnR5LGQuaW50ZXJwb2xhdGlvbihnKSl9KTtlbHNlIGZvcih2YXIgZCBpbiBnKSJvZmZzZXQiIT1kJiYiZWFzaW5nIiE9ZCYmImNvbXBvc2l0ZSIhPWQmJmIuY2xlYXIoYSxkKX19fShjLGQsZiksZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGQoYSl7cmV0dXJuIGEucmVwbGFjZSgvLSguKS9nLGZ1bmN0aW9uKGEsYil7cmV0dXJuIGIudG9VcHBlckNhc2UoKX0pfWZ1bmN0aW9uIGUoYSxiLGMpe2hbY109aFtjXXx8W10saFtjXS5wdXNoKFthLGJdKX1mdW5jdGlvbiBmKGEsYixjKXtmb3IodmFyIGY9MDtmPGMubGVuZ3RoO2YrKyl7dmFyIGc9Y1tmXTtlKGEsYixkKGcpKX19ZnVuY3Rpb24gZyhjLGUsZil7dmFyIGc9YzsvLS8udGVzdChjKSYmIWEuaXNEZXByZWNhdGVkKCJIeXBoZW5hdGVkIHByb3BlcnR5IG5hbWVzIiwiMjAxNi0wMy0yMiIsIlVzZSBjYW1lbENhc2UgaW5zdGVhZC4iLCEwKSYmKGc9ZChjKSksImluaXRpYWwiIT1lJiYiaW5pdGlhbCIhPWZ8fCgiaW5pdGlhbCI9PWUmJihlPWlbZ10pLCJpbml0aWFsIj09ZiYmKGY9aVtnXSkpO2Zvcih2YXIgaj1lPT1mP1tdOmhbZ10saz0wO2omJms8ai5sZW5ndGg7aysrKXt2YXIgbD1qW2tdWzBdKGUpLG09altrXVswXShmKTtpZih2b2lkIDAhPT1sJiZ2b2lkIDAhPT1tKXt2YXIgbj1qW2tdWzFdKGwsbSk7aWYobil7dmFyIG89Yi5JbnRlcnBvbGF0aW9uLmFwcGx5KG51bGwsbik7cmV0dXJuIGZ1bmN0aW9uKGEpe3JldHVybiAwPT1hP2U6MT09YT9mOm8oYSl9fX19cmV0dXJuIGIuSW50ZXJwb2xhdGlvbighMSwhMCxmdW5jdGlvbihhKXtyZXR1cm4gYT9mOmV9KX12YXIgaD17fTtiLmFkZFByb3BlcnRpZXNIYW5kbGVyPWY7dmFyIGk9e2JhY2tncm91bmRDb2xvcjoidHJhbnNwYXJlbnQiLGJhY2tncm91bmRQb3NpdGlvbjoiMCUgMCUiLGJvcmRlckJvdHRvbUNvbG9yOiJjdXJyZW50Q29sb3IiLGJvcmRlckJvdHRvbUxlZnRSYWRpdXM6IjBweCIsYm9yZGVyQm90dG9tUmlnaHRSYWRpdXM6IjBweCIsYm9yZGVyQm90dG9tV2lkdGg6IjNweCIsYm9yZGVyTGVmdENvbG9yOiJjdXJyZW50Q29sb3IiLGJvcmRlckxlZnRXaWR0aDoiM3B4Iixib3JkZXJSaWdodENvbG9yOiJjdXJyZW50Q29sb3IiLGJvcmRlclJpZ2h0V2lkdGg6IjNweCIsYm9yZGVyU3BhY2luZzoiMnB4Iixib3JkZXJUb3BDb2xvcjoiY3VycmVudENvbG9yIixib3JkZXJUb3BMZWZ0UmFkaXVzOiIwcHgiLGJvcmRlclRvcFJpZ2h0UmFkaXVzOiIwcHgiLGJvcmRlclRvcFdpZHRoOiIzcHgiLGJvdHRvbToiYXV0byIsY2xpcDoicmVjdCgwcHgsIDBweCwgMHB4LCAwcHgpIixjb2xvcjoiYmxhY2siLGZvbnRTaXplOiIxMDAlIixmb250V2VpZ2h0OiI0MDAiLGhlaWdodDoiYXV0byIsbGVmdDoiYXV0byIsbGV0dGVyU3BhY2luZzoibm9ybWFsIixsaW5lSGVpZ2h0OiIxMjAlIixtYXJnaW5Cb3R0b206IjBweCIsbWFyZ2luTGVmdDoiMHB4IixtYXJnaW5SaWdodDoiMHB4IixtYXJnaW5Ub3A6IjBweCIsbWF4SGVpZ2h0OiJub25lIixtYXhXaWR0aDoibm9uZSIsbWluSGVpZ2h0OiIwcHgiLG1pbldpZHRoOiIwcHgiLG9wYWNpdHk6IjEuMCIsb3V0bGluZUNvbG9yOiJpbnZlcnQiLG91dGxpbmVPZmZzZXQ6IjBweCIsb3V0bGluZVdpZHRoOiIzcHgiLHBhZGRpbmdCb3R0b206IjBweCIscGFkZGluZ0xlZnQ6IjBweCIscGFkZGluZ1JpZ2h0OiIwcHgiLHBhZGRpbmdUb3A6IjBweCIscmlnaHQ6ImF1dG8iLHRleHRJbmRlbnQ6IjBweCIsdGV4dFNoYWRvdzoiMHB4IDBweCAwcHggdHJhbnNwYXJlbnQiLHRvcDoiYXV0byIsdHJhbnNmb3JtOiIiLHZlcnRpY2FsQWxpZ246IjBweCIsdmlzaWJpbGl0eToidmlzaWJsZSIsd2lkdGg6ImF1dG8iLHdvcmRTcGFjaW5nOiJub3JtYWwiLHpJbmRleDoiYXV0byJ9O2IucHJvcGVydHlJbnRlcnBvbGF0aW9uPWd9KGMsZCxmKSxmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZChiKXt2YXIgYz1hLmNhbGN1bGF0ZUFjdGl2ZUR1cmF0aW9uKGIpLGQ9ZnVuY3Rpb24oZCl7cmV0dXJuIGEuY2FsY3VsYXRlVGltZUZyYWN0aW9uKGMsZCxiKX07cmV0dXJuIGQuX3RvdGFsRHVyYXRpb249Yi5kZWxheStjK2IuZW5kRGVsYXksZC5faXNDdXJyZW50PWZ1bmN0aW9uKGQpe3ZhciBlPWEuY2FsY3VsYXRlUGhhc2UoYyxkLGIpO3JldHVybiBlPT09UGhhc2VBY3RpdmV8fGU9PT1QaGFzZUJlZm9yZX0sZH1iLktleWZyYW1lRWZmZWN0PWZ1bmN0aW9uKGMsZSxmLGcpe3ZhciBoLGk9ZChhLm5vcm1hbGl6ZVRpbWluZ0lucHV0KGYpKSxqPWIuY29udmVydEVmZmVjdElucHV0KGUpLGs9ZnVuY3Rpb24oKXtqKGMsaCl9O3JldHVybiBrLl91cGRhdGU9ZnVuY3Rpb24oYSl7cmV0dXJuIGg9aShhKSxudWxsIT09aH0say5fY2xlYXI9ZnVuY3Rpb24oKXtqKGMsbnVsbCl9LGsuX2hhc1NhbWVUYXJnZXQ9ZnVuY3Rpb24oYSl7cmV0dXJuIGM9PT1hfSxrLl9pc0N1cnJlbnQ9aS5faXNDdXJyZW50LGsuX3RvdGFsRHVyYXRpb249aS5fdG90YWxEdXJhdGlvbixrLl9pZD1nLGt9LGIuTnVsbEVmZmVjdD1mdW5jdGlvbihhKXt2YXIgYj1mdW5jdGlvbigpe2EmJihhKCksYT1udWxsKX07cmV0dXJuIGIuX3VwZGF0ZT1mdW5jdGlvbigpe3JldHVybiBudWxsfSxiLl90b3RhbER1cmF0aW9uPTAsYi5faXNDdXJyZW50PWZ1bmN0aW9uKCl7cmV0dXJuITF9LGIuX2hhc1NhbWVUYXJnZXQ9ZnVuY3Rpb24oKXtyZXR1cm4hMX0sYn19KGMsZCxmKSxmdW5jdGlvbihhLGIpe2EuYXBwbHk9ZnVuY3Rpb24oYixjLGQpe2Iuc3R5bGVbYS5wcm9wZXJ0eU5hbWUoYyldPWR9LGEuY2xlYXI9ZnVuY3Rpb24oYixjKXtiLnN0eWxlW2EucHJvcGVydHlOYW1lKGMpXT0iIn19KGQsZiksZnVuY3Rpb24oYSl7d2luZG93LkVsZW1lbnQucHJvdG90eXBlLmFuaW1hdGU9ZnVuY3Rpb24oYixjKXt2YXIgZD0iIjtyZXR1cm4gYyYmYy5pZCYmKGQ9Yy5pZCksYS50aW1lbGluZS5fcGxheShhLktleWZyYW1lRWZmZWN0KHRoaXMsYixjLGQpKX19KGQpLGZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYyhhLGIsZCl7aWYoIm51bWJlciI9PXR5cGVvZiBhJiYibnVtYmVyIj09dHlwZW9mIGIpcmV0dXJuIGEqKDEtZCkrYipkO2lmKCJib29sZWFuIj09dHlwZW9mIGEmJiJib29sZWFuIj09dHlwZW9mIGIpcmV0dXJuLjU+ZD9hOmI7aWYoYS5sZW5ndGg9PWIubGVuZ3RoKXtmb3IodmFyIGU9W10sZj0wO2Y8YS5sZW5ndGg7ZisrKWUucHVzaChjKGFbZl0sYltmXSxkKSk7cmV0dXJuIGV9dGhyb3ciTWlzbWF0Y2hlZCBpbnRlcnBvbGF0aW9uIGFyZ3VtZW50cyAiK2ErIjoiK2J9YS5JbnRlcnBvbGF0aW9uPWZ1bmN0aW9uKGEsYixkKXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIGQoYyhhLGIsZSkpfX19KGQsZiksZnVuY3Rpb24oYSxiLGMpe2Euc2VxdWVuY2VOdW1iZXI9MDt2YXIgZD1mdW5jdGlvbihhLGIsYyl7dGhpcy50YXJnZXQ9YSx0aGlzLmN1cnJlbnRUaW1lPWIsdGhpcy50aW1lbGluZVRpbWU9Yyx0aGlzLnR5cGU9ImZpbmlzaCIsdGhpcy5idWJibGVzPSExLHRoaXMuY2FuY2VsYWJsZT0hMSx0aGlzLmN1cnJlbnRUYXJnZXQ9YSx0aGlzLmRlZmF1bHRQcmV2ZW50ZWQ9ITEsdGhpcy5ldmVudFBoYXNlPUV2ZW50LkFUX1RBUkdFVCx0aGlzLnRpbWVTdGFtcD1EYXRlLm5vdygpfTtiLkFuaW1hdGlvbj1mdW5jdGlvbihiKXt0aGlzLmlkPSIiLGImJmIuX2lkJiYodGhpcy5pZD1iLl9pZCksdGhpcy5fc2VxdWVuY2VOdW1iZXI9YS5zZXF1ZW5jZU51bWJlcisrLHRoaXMuX2N1cnJlbnRUaW1lPTAsdGhpcy5fc3RhcnRUaW1lPW51bGwsdGhpcy5fcGF1c2VkPSExLHRoaXMuX3BsYXliYWNrUmF0ZT0xLHRoaXMuX2luVGltZWxpbmU9ITAsdGhpcy5fZmluaXNoZWRGbGFnPSEwLHRoaXMub25maW5pc2g9bnVsbCx0aGlzLl9maW5pc2hIYW5kbGVycz1bXSx0aGlzLl9lZmZlY3Q9Yix0aGlzLl9pbkVmZmVjdD10aGlzLl9lZmZlY3QuX3VwZGF0ZSgwKSx0aGlzLl9pZGxlPSEwLHRoaXMuX2N1cnJlbnRUaW1lUGVuZGluZz0hMX0sYi5BbmltYXRpb24ucHJvdG90eXBlPXtfZW5zdXJlQWxpdmU6ZnVuY3Rpb24oKXt0aGlzLnBsYXliYWNrUmF0ZTwwJiYwPT09dGhpcy5jdXJyZW50VGltZT90aGlzLl9pbkVmZmVjdD10aGlzLl9lZmZlY3QuX3VwZGF0ZSgtMSk6dGhpcy5faW5FZmZlY3Q9dGhpcy5fZWZmZWN0Ll91cGRhdGUodGhpcy5jdXJyZW50VGltZSksdGhpcy5faW5UaW1lbGluZXx8IXRoaXMuX2luRWZmZWN0JiZ0aGlzLl9maW5pc2hlZEZsYWd8fCh0aGlzLl9pblRpbWVsaW5lPSEwLGIudGltZWxpbmUuX2FuaW1hdGlvbnMucHVzaCh0aGlzKSl9LF90aWNrQ3VycmVudFRpbWU6ZnVuY3Rpb24oYSxiKXthIT10aGlzLl9jdXJyZW50VGltZSYmKHRoaXMuX2N1cnJlbnRUaW1lPWEsdGhpcy5faXNGaW5pc2hlZCYmIWImJih0aGlzLl9jdXJyZW50VGltZT10aGlzLl9wbGF5YmFja1JhdGU+MD90aGlzLl90b3RhbER1cmF0aW9uOjApLHRoaXMuX2Vuc3VyZUFsaXZlKCkpfSxnZXQgY3VycmVudFRpbWUoKXtyZXR1cm4gdGhpcy5faWRsZXx8dGhpcy5fY3VycmVudFRpbWVQZW5kaW5nP251bGw6dGhpcy5fY3VycmVudFRpbWV9LHNldCBjdXJyZW50VGltZShhKXthPSthLGlzTmFOKGEpfHwoYi5yZXN0YXJ0KCksdGhpcy5fcGF1c2VkfHxudWxsPT10aGlzLl9zdGFydFRpbWV8fCh0aGlzLl9zdGFydFRpbWU9dGhpcy5fdGltZWxpbmUuY3VycmVudFRpbWUtYS90aGlzLl9wbGF5YmFja1JhdGUpLHRoaXMuX2N1cnJlbnRUaW1lUGVuZGluZz0hMSx0aGlzLl9jdXJyZW50VGltZSE9YSYmKHRoaXMuX3RpY2tDdXJyZW50VGltZShhLCEwKSxiLmludmFsaWRhdGVFZmZlY3RzKCkpKX0sZ2V0IHN0YXJ0VGltZSgpe3JldHVybiB0aGlzLl9zdGFydFRpbWV9LHNldCBzdGFydFRpbWUoYSl7YT0rYSxpc05hTihhKXx8dGhpcy5fcGF1c2VkfHx0aGlzLl9pZGxlfHwodGhpcy5fc3RhcnRUaW1lPWEsdGhpcy5fdGlja0N1cnJlbnRUaW1lKCh0aGlzLl90aW1lbGluZS5jdXJyZW50VGltZS10aGlzLl9zdGFydFRpbWUpKnRoaXMucGxheWJhY2tSYXRlKSxiLmludmFsaWRhdGVFZmZlY3RzKCkpfSxnZXQgcGxheWJhY2tSYXRlKCl7cmV0dXJuIHRoaXMuX3BsYXliYWNrUmF0ZX0sc2V0IHBsYXliYWNrUmF0ZShhKXtpZihhIT10aGlzLl9wbGF5YmFja1JhdGUpe3ZhciBiPXRoaXMuY3VycmVudFRpbWU7dGhpcy5fcGxheWJhY2tSYXRlPWEsdGhpcy5fc3RhcnRUaW1lPW51bGwsInBhdXNlZCIhPXRoaXMucGxheVN0YXRlJiYiaWRsZSIhPXRoaXMucGxheVN0YXRlJiZ0aGlzLnBsYXkoKSxudWxsIT1iJiYodGhpcy5jdXJyZW50VGltZT1iKX19LGdldCBfaXNGaW5pc2hlZCgpe3JldHVybiF0aGlzLl9pZGxlJiYodGhpcy5fcGxheWJhY2tSYXRlPjAmJnRoaXMuX2N1cnJlbnRUaW1lPj10aGlzLl90b3RhbER1cmF0aW9ufHx0aGlzLl9wbGF5YmFja1JhdGU8MCYmdGhpcy5fY3VycmVudFRpbWU8PTApfSxnZXQgX3RvdGFsRHVyYXRpb24oKXtyZXR1cm4gdGhpcy5fZWZmZWN0Ll90b3RhbER1cmF0aW9ufSxnZXQgcGxheVN0YXRlKCl7cmV0dXJuIHRoaXMuX2lkbGU/ImlkbGUiOm51bGw9PXRoaXMuX3N0YXJ0VGltZSYmIXRoaXMuX3BhdXNlZCYmMCE9dGhpcy5wbGF5YmFja1JhdGV8fHRoaXMuX2N1cnJlbnRUaW1lUGVuZGluZz8icGVuZGluZyI6dGhpcy5fcGF1c2VkPyJwYXVzZWQiOnRoaXMuX2lzRmluaXNoZWQ/ImZpbmlzaGVkIjoicnVubmluZyJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLl9wYXVzZWQ9ITEsKHRoaXMuX2lzRmluaXNoZWR8fHRoaXMuX2lkbGUpJiYodGhpcy5fY3VycmVudFRpbWU9dGhpcy5fcGxheWJhY2tSYXRlPjA/MDp0aGlzLl90b3RhbER1cmF0aW9uLHRoaXMuX3N0YXJ0VGltZT1udWxsKSx0aGlzLl9maW5pc2hlZEZsYWc9ITEsdGhpcy5faWRsZT0hMSx0aGlzLl9lbnN1cmVBbGl2ZSgpLGIuaW52YWxpZGF0ZUVmZmVjdHMoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLl9pc0ZpbmlzaGVkfHx0aGlzLl9wYXVzZWR8fHRoaXMuX2lkbGV8fCh0aGlzLl9jdXJyZW50VGltZVBlbmRpbmc9ITApLHRoaXMuX3N0YXJ0VGltZT1udWxsLHRoaXMuX3BhdXNlZD0hMH0sZmluaXNoOmZ1bmN0aW9uKCl7dGhpcy5faWRsZXx8KHRoaXMuY3VycmVudFRpbWU9dGhpcy5fcGxheWJhY2tSYXRlPjA/dGhpcy5fdG90YWxEdXJhdGlvbjowLHRoaXMuX3N0YXJ0VGltZT10aGlzLl90b3RhbER1cmF0aW9uLXRoaXMuY3VycmVudFRpbWUsdGhpcy5fY3VycmVudFRpbWVQZW5kaW5nPSExLGIuaW52YWxpZGF0ZUVmZmVjdHMoKSl9LGNhbmNlbDpmdW5jdGlvbigpe3RoaXMuX2luRWZmZWN0JiYodGhpcy5faW5FZmZlY3Q9ITEsdGhpcy5faWRsZT0hMCx0aGlzLl9maW5pc2hlZEZsYWc9ITAsdGhpcy5jdXJyZW50VGltZT0wLHRoaXMuX3N0YXJ0VGltZT1udWxsLHRoaXMuX2VmZmVjdC5fdXBkYXRlKG51bGwpLGIuaW52YWxpZGF0ZUVmZmVjdHMoKSl9LHJldmVyc2U6ZnVuY3Rpb24oKXt0aGlzLnBsYXliYWNrUmF0ZSo9LTEsdGhpcy5wbGF5KCl9LGFkZEV2ZW50TGlzdGVuZXI6ZnVuY3Rpb24oYSxiKXsiZnVuY3Rpb24iPT10eXBlb2YgYiYmImZpbmlzaCI9PWEmJnRoaXMuX2ZpbmlzaEhhbmRsZXJzLnB1c2goYil9LHJlbW92ZUV2ZW50TGlzdGVuZXI6ZnVuY3Rpb24oYSxiKXtpZigiZmluaXNoIj09YSl7dmFyIGM9dGhpcy5fZmluaXNoSGFuZGxlcnMuaW5kZXhPZihiKTtjPj0wJiZ0aGlzLl9maW5pc2hIYW5kbGVycy5zcGxpY2UoYywxKX19LF9maXJlRXZlbnRzOmZ1bmN0aW9uKGEpe2lmKHRoaXMuX2lzRmluaXNoZWQpe2lmKCF0aGlzLl9maW5pc2hlZEZsYWcpe3ZhciBiPW5ldyBkKHRoaXMsdGhpcy5fY3VycmVudFRpbWUsYSksYz10aGlzLl9maW5pc2hIYW5kbGVycy5jb25jYXQodGhpcy5vbmZpbmlzaD9bdGhpcy5vbmZpbmlzaF06W10pO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtjLmZvckVhY2goZnVuY3Rpb24oYSl7YS5jYWxsKGIudGFyZ2V0LGIpfSl9LDApLHRoaXMuX2ZpbmlzaGVkRmxhZz0hMH19ZWxzZSB0aGlzLl9maW5pc2hlZEZsYWc9ITF9LF90aWNrOmZ1bmN0aW9uKGEsYil7dGhpcy5faWRsZXx8dGhpcy5fcGF1c2VkfHwobnVsbD09dGhpcy5fc3RhcnRUaW1lP2ImJih0aGlzLnN0YXJ0VGltZT1hLXRoaXMuX2N1cnJlbnRUaW1lL3RoaXMucGxheWJhY2tSYXRlKTp0aGlzLl9pc0ZpbmlzaGVkfHx0aGlzLl90aWNrQ3VycmVudFRpbWUoKGEtdGhpcy5fc3RhcnRUaW1lKSp0aGlzLnBsYXliYWNrUmF0ZSkpLGImJih0aGlzLl9jdXJyZW50VGltZVBlbmRpbmc9ITEsdGhpcy5fZmlyZUV2ZW50cyhhKSl9LGdldCBfbmVlZHNUaWNrKCl7cmV0dXJuIHRoaXMucGxheVN0YXRlIGlue3BlbmRpbmc6MSxydW5uaW5nOjF9fHwhdGhpcy5fZmluaXNoZWRGbGFnfX19KGMsZCxmKSxmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZChhKXt2YXIgYj1qO2o9W10sYTxwLmN1cnJlbnRUaW1lJiYoYT1wLmN1cnJlbnRUaW1lKSxoKGEsITApLGIuZm9yRWFjaChmdW5jdGlvbihiKXtiWzFdKGEpfSksZygpLGw9dm9pZCAwfWZ1bmN0aW9uIGUoYSxiKXtyZXR1cm4gYS5fc2VxdWVuY2VOdW1iZXItYi5fc2VxdWVuY2VOdW1iZXJ9ZnVuY3Rpb24gZigpe3RoaXMuX2FuaW1hdGlvbnM9W10sdGhpcy5jdXJyZW50VGltZT13aW5kb3cucGVyZm9ybWFuY2UmJnBlcmZvcm1hbmNlLm5vdz9wZXJmb3JtYW5jZS5ub3coKTowfWZ1bmN0aW9uIGcoKXtvLmZvckVhY2goZnVuY3Rpb24oYSl7YSgpfSksby5sZW5ndGg9MH1mdW5jdGlvbiBoKGEsYyl7bj0hMTt2YXIgZD1iLnRpbWVsaW5lO2QuY3VycmVudFRpbWU9YSxkLl9hbmltYXRpb25zLnNvcnQoZSksbT0hMTt2YXIgZj1kLl9hbmltYXRpb25zO2QuX2FuaW1hdGlvbnM9W107dmFyIGc9W10saD1bXTtmPWYuZmlsdGVyKGZ1bmN0aW9uKGIpe2IuX3RpY2soYSxjKSxiLl9pbkVmZmVjdD9oLnB1c2goYi5fZWZmZWN0KTpnLnB1c2goYi5fZWZmZWN0KSxiLl9uZWVkc1RpY2smJihtPSEwKTt2YXIgZD1iLl9pbkVmZmVjdHx8Yi5fbmVlZHNUaWNrO3JldHVybiBiLl9pblRpbWVsaW5lPWQsZH0pLG8ucHVzaC5hcHBseShvLGcpLG8ucHVzaC5hcHBseShvLGgpLGQuX2FuaW1hdGlvbnMucHVzaC5hcHBseShkLl9hbmltYXRpb25zLGYpLG0mJnJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbigpe30pfXZhciBpPXdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUsaj1bXSxrPTA7d2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZT1mdW5jdGlvbihhKXt2YXIgYj1rKys7cmV0dXJuIDA9PWoubGVuZ3RoJiZpKGQpLGoucHVzaChbYixhXSksYn0sd2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lPWZ1bmN0aW9uKGEpe2ouZm9yRWFjaChmdW5jdGlvbihiKXtiWzBdPT1hJiYoYlsxXT1mdW5jdGlvbigpe30pfSl9LGYucHJvdG90eXBlPXtfcGxheTpmdW5jdGlvbihjKXtjLl90aW1pbmc9YS5ub3JtYWxpemVUaW1pbmdJbnB1dChjLnRpbWluZyk7dmFyIGQ9bmV3IGIuQW5pbWF0aW9uKGMpO3JldHVybiBkLl9pZGxlPSExLGQuX3RpbWVsaW5lPXRoaXMsdGhpcy5fYW5pbWF0aW9ucy5wdXNoKGQpLGIucmVzdGFydCgpLGIuaW52YWxpZGF0ZUVmZmVjdHMoKSxkfX07dmFyIGw9dm9pZCAwLG09ITEsbj0hMTtiLnJlc3RhcnQ9ZnVuY3Rpb24oKXtyZXR1cm4gbXx8KG09ITAscmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uKCl7fSksbj0hMCksbn0sYi5pbnZhbGlkYXRlRWZmZWN0cz1mdW5jdGlvbigpe2goYi50aW1lbGluZS5jdXJyZW50VGltZSwhMSksZygpfTt2YXIgbz1bXSxwPW5ldyBmO2IudGltZWxpbmU9cH0oYyxkLGYpLGZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgYz1hLmV4ZWMoYik7cmV0dXJuIGM/KGM9YS5pZ25vcmVDYXNlP2NbMF0udG9Mb3dlckNhc2UoKTpjWzBdLFtjLGIuc3Vic3RyKGMubGVuZ3RoKV0pOnZvaWQgMH1mdW5jdGlvbiBjKGEsYil7Yj1iLnJlcGxhY2UoL15ccyovLCIiKTt2YXIgYz1hKGIpO3JldHVybiBjP1tjWzBdLGNbMV0ucmVwbGFjZSgvXlxzKi8sIiIpXTp2b2lkIDB9ZnVuY3Rpb24gZChhLGQsZSl7YT1jLmJpbmQobnVsbCxhKTtmb3IodmFyIGY9W107Oyl7dmFyIGc9YShlKTtpZighZylyZXR1cm5bZixlXTtpZihmLnB1c2goZ1swXSksZT1nWzFdLGc9YihkLGUpLCFnfHwiIj09Z1sxXSlyZXR1cm5bZixlXTtlPWdbMV19fWZ1bmN0aW9uIGUoYSxiKXtmb3IodmFyIGM9MCxkPTA7ZDxiLmxlbmd0aCYmKCEvXHN8LC8udGVzdChiW2RdKXx8MCE9Yyk7ZCsrKWlmKCIoIj09YltkXSljKys7ZWxzZSBpZigiKSI9PWJbZF0mJihjLS0sMD09YyYmZCsrLDA+PWMpKWJyZWFrO3ZhciBlPWEoYi5zdWJzdHIoMCxkKSk7cmV0dXJuIHZvaWQgMD09ZT92b2lkIDA6W2UsYi5zdWJzdHIoZCldfWZ1bmN0aW9uIGYoYSxiKXtmb3IodmFyIGM9YSxkPWI7YyYmZDspYz5kP2MlPWQ6ZCU9YztyZXR1cm4gYz1hKmIvKGMrZCl9ZnVuY3Rpb24gZyhhKXtyZXR1cm4gZnVuY3Rpb24oYil7dmFyIGM9YShiKTtyZXR1cm4gYyYmKGNbMF09dm9pZCAwKSxjfX1mdW5jdGlvbiBoKGEsYil7cmV0dXJuIGZ1bmN0aW9uKGMpe3ZhciBkPWEoYyk7cmV0dXJuIGQ/ZDpbYixjXX19ZnVuY3Rpb24gaShiLGMpe2Zvcih2YXIgZD1bXSxlPTA7ZTxiLmxlbmd0aDtlKyspe3ZhciBmPWEuY29uc3VtZVRyaW1tZWQoYltlXSxjKTtpZighZnx8IiI9PWZbMF0pcmV0dXJuO3ZvaWQgMCE9PWZbMF0mJmQucHVzaChmWzBdKSxjPWZbMV19cmV0dXJuIiI9PWM/ZDp2b2lkIDB9ZnVuY3Rpb24gaihhLGIsYyxkLGUpe2Zvcih2YXIgZz1bXSxoPVtdLGk9W10saj1mKGQubGVuZ3RoLGUubGVuZ3RoKSxrPTA7aj5rO2srKyl7dmFyIGw9YihkW2slZC5sZW5ndGhdLGVbayVlLmxlbmd0aF0pO2lmKCFsKXJldHVybjtnLnB1c2gobFswXSksaC5wdXNoKGxbMV0pLGkucHVzaChsWzJdKX1yZXR1cm5bZyxoLGZ1bmN0aW9uKGIpe3ZhciBkPWIubWFwKGZ1bmN0aW9uKGEsYil7cmV0dXJuIGlbYl0oYSl9KS5qb2luKGMpO3JldHVybiBhP2EoZCk6ZH1dfWZ1bmN0aW9uIGsoYSxiLGMpe2Zvcih2YXIgZD1bXSxlPVtdLGY9W10sZz0wLGg9MDtoPGMubGVuZ3RoO2grKylpZigiZnVuY3Rpb24iPT10eXBlb2YgY1toXSl7dmFyIGk9Y1toXShhW2ddLGJbZysrXSk7ZC5wdXNoKGlbMF0pLGUucHVzaChpWzFdKSxmLnB1c2goaVsyXSl9ZWxzZSFmdW5jdGlvbihhKXtkLnB1c2goITEpLGUucHVzaCghMSksZi5wdXNoKGZ1bmN0aW9uKCl7cmV0dXJuIGNbYV19KX0oaCk7cmV0dXJuW2QsZSxmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsYz0wO2M8YS5sZW5ndGg7YysrKWIrPWZbY10oYVtjXSk7cmV0dXJuIGJ9XX1hLmNvbnN1bWVUb2tlbj1iLGEuY29uc3VtZVRyaW1tZWQ9YyxhLmNvbnN1bWVSZXBlYXRlZD1kLGEuY29uc3VtZVBhcmVudGhlc2lzZWQ9ZSxhLmlnbm9yZT1nLGEub3B0aW9uYWw9aCxhLmNvbnN1bWVMaXN0PWksYS5tZXJnZU5lc3RlZFJlcGVhdGVkPWouYmluZChudWxsLG51bGwpLGEubWVyZ2VXcmFwcGVkTmVzdGVkUmVwZWF0ZWQ9aixhLm1lcmdlTGlzdD1rfShkKSxmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGIpe2Z1bmN0aW9uIGMoYil7dmFyIGM9YS5jb25zdW1lVG9rZW4oL15pbnNldC9pLGIpO2lmKGMpcmV0dXJuIGQuaW5zZXQ9ITAsYzt2YXIgYz1hLmNvbnN1bWVMZW5ndGhPclBlcmNlbnQoYik7aWYoYylyZXR1cm4gZC5sZW5ndGhzLnB1c2goY1swXSksYzt2YXIgYz1hLmNvbnN1bWVDb2xvcihiKTtyZXR1cm4gYz8oZC5jb2xvcj1jWzBdLGMpOnZvaWQgMH12YXIgZD17aW5zZXQ6ITEsbGVuZ3RoczpbXSxjb2xvcjpudWxsfSxlPWEuY29uc3VtZVJlcGVhdGVkKGMsL14vLGIpO3JldHVybiBlJiZlWzBdLmxlbmd0aD9bZCxlWzFdXTp2b2lkIDB9ZnVuY3Rpb24gYyhjKXt2YXIgZD1hLmNvbnN1bWVSZXBlYXRlZChiLC9eLC8sYyk7cmV0dXJuIGQmJiIiPT1kWzFdP2RbMF06dm9pZCAwfWZ1bmN0aW9uIGQoYixjKXtmb3IoO2IubGVuZ3Rocy5sZW5ndGg8TWF0aC5tYXgoYi5sZW5ndGhzLmxlbmd0aCxjLmxlbmd0aHMubGVuZ3RoKTspYi5sZW5ndGhzLnB1c2goe3B4OjB9KTtmb3IoO2MubGVuZ3Rocy5sZW5ndGg8TWF0aC5tYXgoYi5sZW5ndGhzLmxlbmd0aCxjLmxlbmd0aHMubGVuZ3RoKTspYy5sZW5ndGhzLnB1c2goe3B4OjB9KTtpZihiLmluc2V0PT1jLmluc2V0JiYhIWIuY29sb3I9PSEhYy5jb2xvcil7Zm9yKHZhciBkLGU9W10sZj1bW10sMF0sZz1bW10sMF0saD0wO2g8Yi5sZW5ndGhzLmxlbmd0aDtoKyspe3ZhciBpPWEubWVyZ2VEaW1lbnNpb25zKGIubGVuZ3Roc1toXSxjLmxlbmd0aHNbaF0sMj09aCk7ZlswXS5wdXNoKGlbMF0pLGdbMF0ucHVzaChpWzFdKSxlLnB1c2goaVsyXSl9aWYoYi5jb2xvciYmYy5jb2xvcil7dmFyIGo9YS5tZXJnZUNvbG9ycyhiLmNvbG9yLGMuY29sb3IpO2ZbMV09alswXSxnWzFdPWpbMV0sZD1qWzJdfXJldHVybltmLGcsZnVuY3Rpb24oYSl7Zm9yKHZhciBjPWIuaW5zZXQ/Imluc2V0ICI6IiAiLGY9MDtmPGUubGVuZ3RoO2YrKyljKz1lW2ZdKGFbMF1bZl0pKyIgIjtyZXR1cm4gZCYmKGMrPWQoYVsxXSkpLGN9XX19ZnVuY3Rpb24gZShiLGMsZCxlKXtmdW5jdGlvbiBmKGEpe3JldHVybntpbnNldDphLGNvbG9yOlswLDAsMCwwXSxsZW5ndGhzOlt7cHg6MH0se3B4OjB9LHtweDowfSx7cHg6MH1dfX1mb3IodmFyIGc9W10saD1bXSxpPTA7aTxkLmxlbmd0aHx8aTxlLmxlbmd0aDtpKyspe3ZhciBqPWRbaV18fGYoZVtpXS5pbnNldCksaz1lW2ldfHxmKGRbaV0uaW5zZXQpO2cucHVzaChqKSxoLnB1c2goayl9cmV0dXJuIGEubWVyZ2VOZXN0ZWRSZXBlYXRlZChiLGMsZyxoKX12YXIgZj1lLmJpbmQobnVsbCxkLCIsICIpO2EuYWRkUHJvcGVydGllc0hhbmRsZXIoYyxmLFsiYm94LXNoYWRvdyIsInRleHQtc2hhZG93Il0pfShkKSxmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoYSl7cmV0dXJuIGEudG9GaXhlZCgzKS5yZXBsYWNlKCIuMDAwIiwiIil9ZnVuY3Rpb24gZChhLGIsYyl7cmV0dXJuIE1hdGgubWluKGIsTWF0aC5tYXgoYSxjKSl9ZnVuY3Rpb24gZShhKXtyZXR1cm4vXlxzKlstK10/KFxkKlwuKT9cZCtccyokLy50ZXN0KGEpP051bWJlcihhKTp2b2lkIDB9ZnVuY3Rpb24gZihhLGIpe3JldHVyblthLGIsY119ZnVuY3Rpb24gZyhhLGIpe3JldHVybiAwIT1hP2koMCwxLzApKGEsYik6dm9pZCAwfWZ1bmN0aW9uIGgoYSxiKXtyZXR1cm5bYSxiLGZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLnJvdW5kKGQoMSwxLzAsYSkpfV19ZnVuY3Rpb24gaShhLGIpe3JldHVybiBmdW5jdGlvbihlLGYpe3JldHVybltlLGYsZnVuY3Rpb24oZSl7cmV0dXJuIGMoZChhLGIsZSkpfV19fWZ1bmN0aW9uIGooYSxiKXtyZXR1cm5bYSxiLE1hdGgucm91bmRdfWEuY2xhbXA9ZCxhLmFkZFByb3BlcnRpZXNIYW5kbGVyKGUsaSgwLDEvMCksWyJib3JkZXItaW1hZ2Utd2lkdGgiLCJsaW5lLWhlaWdodCJdKSxhLmFkZFByb3BlcnRpZXNIYW5kbGVyKGUsaSgwLDEpLFsib3BhY2l0eSIsInNoYXBlLWltYWdlLXRocmVzaG9sZCJdKSxhLmFkZFByb3BlcnRpZXNIYW5kbGVyKGUsZyxbImZsZXgtZ3JvdyIsImZsZXgtc2hyaW5rIl0pLGEuYWRkUHJvcGVydGllc0hhbmRsZXIoZSxoLFsib3JwaGFucyIsIndpZG93cyJdKSxhLmFkZFByb3BlcnRpZXNIYW5kbGVyKGUsaixbInotaW5kZXgiXSksYS5wYXJzZU51bWJlcj1lLGEubWVyZ2VOdW1iZXJzPWYsYS5udW1iZXJUb1N0cmluZz1jfShkLGYpLGZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYyhhLGIpe3JldHVybiJ2aXNpYmxlIj09YXx8InZpc2libGUiPT1iP1swLDEsZnVuY3Rpb24oYyl7cmV0dXJuIDA+PWM/YTpjPj0xP2I6InZpc2libGUifV06dm9pZCAwfWEuYWRkUHJvcGVydGllc0hhbmRsZXIoU3RyaW5nLGMsWyJ2aXNpYmlsaXR5Il0pfShkKSxmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoYSl7YT1hLnRyaW0oKSxmLmZpbGxTdHlsZT0iIzAwMCIsZi5maWxsU3R5bGU9YTt2YXIgYj1mLmZpbGxTdHlsZTtpZihmLmZpbGxTdHlsZT0iI2ZmZiIsZi5maWxsU3R5bGU9YSxiPT1mLmZpbGxTdHlsZSl7Zi5maWxsUmVjdCgwLDAsMSwxKTt2YXIgYz1mLmdldEltYWdlRGF0YSgwLDAsMSwxKS5kYXRhO2YuY2xlYXJSZWN0KDAsMCwxLDEpO3ZhciBkPWNbM10vMjU1O3JldHVybltjWzBdKmQsY1sxXSpkLGNbMl0qZCxkXX19ZnVuY3Rpb24gZChiLGMpe3JldHVybltiLGMsZnVuY3Rpb24oYil7ZnVuY3Rpb24gYyhhKXtyZXR1cm4gTWF0aC5tYXgoMCxNYXRoLm1pbigyNTUsYSkpfWlmKGJbM10pZm9yKHZhciBkPTA7Mz5kO2QrKyliW2RdPU1hdGgucm91bmQoYyhiW2RdL2JbM10pKTtyZXR1cm4gYlszXT1hLm51bWJlclRvU3RyaW5nKGEuY2xhbXAoMCwxLGJbM10pKSwicmdiYSgiK2Iuam9pbigiLCIpKyIpIn1dfXZhciBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIsImNhbnZhcyIpO2Uud2lkdGg9ZS5oZWlnaHQ9MTt2YXIgZj1lLmdldENvbnRleHQoIjJkIik7YS5hZGRQcm9wZXJ0aWVzSGFuZGxlcihjLGQsWyJiYWNrZ3JvdW5kLWNvbG9yIiwiYm9yZGVyLWJvdHRvbS1jb2xvciIsImJvcmRlci1sZWZ0LWNvbG9yIiwiYm9yZGVyLXJpZ2h0LWNvbG9yIiwiYm9yZGVyLXRvcC1jb2xvciIsImNvbG9yIiwib3V0bGluZS1jb2xvciIsInRleHQtZGVjb3JhdGlvbi1jb2xvciJdKSxhLmNvbnN1bWVDb2xvcj1hLmNvbnN1bWVQYXJlbnRoZXNpc2VkLmJpbmQobnVsbCxjKSxhLm1lcmdlQ29sb3JzPWR9KGQsZiksZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBjKGEsYil7aWYoYj1iLnRyaW0oKS50b0xvd2VyQ2FzZSgpLCIwIj09YiYmInB4Ii5zZWFyY2goYSk+PTApcmV0dXJue3B4OjB9O2lmKC9eW14oXSokfF5jYWxjLy50ZXN0KGIpKXtiPWIucmVwbGFjZSgvY2FsY1woL2csIigiKTt2YXIgYz17fTtiPWIucmVwbGFjZShhLGZ1bmN0aW9uKGEpe3JldHVybiBjW2FdPW51bGwsIlUiK2F9KTtmb3IodmFyIGQ9IlUoIithLnNvdXJjZSsiKSIsZT1iLnJlcGxhY2UoL1stK10/KFxkKlwuKT9cZCsvZywiTiIpLnJlcGxhY2UobmV3IFJlZ0V4cCgiTiIrZCwiZyIpLCJEIikucmVwbGFjZSgvXHNbKy1dXHMvZywiTyIpLnJlcGxhY2UoL1xzL2csIiIpLGY9Wy9OXCooRCkvZywvKE58RClbKlwvXU4vZywvKE58RClPXDEvZywvXCgoTnxEKVwpL2ddLGc9MDtnPGYubGVuZ3RoOylmW2ddLnRlc3QoZSk/KGU9ZS5yZXBsYWNlKGZbZ10sIiQxIiksZz0wKTpnKys7aWYoIkQiPT1lKXtmb3IodmFyIGggaW4gYyl7dmFyIGk9ZXZhbChiLnJlcGxhY2UobmV3IFJlZ0V4cCgiVSIraCwiZyIpLCIiKS5yZXBsYWNlKG5ldyBSZWdFeHAoZCwiZyIpLCIqMCIpKTtpZighaXNGaW5pdGUoaSkpcmV0dXJuO2NbaF09aX1yZXR1cm4gY319fWZ1bmN0aW9uIGQoYSxiKXtyZXR1cm4gZShhLGIsITApfWZ1bmN0aW9uIGUoYixjLGQpe3ZhciBlLGY9W107Zm9yKGUgaW4gYilmLnB1c2goZSk7Zm9yKGUgaW4gYylmLmluZGV4T2YoZSk8MCYmZi5wdXNoKGUpO3JldHVybiBiPWYubWFwKGZ1bmN0aW9uKGEpe3JldHVybiBiW2FdfHwwfSksYz1mLm1hcChmdW5jdGlvbihhKXtyZXR1cm4gY1thXXx8MH0pLFtiLGMsZnVuY3Rpb24oYil7dmFyIGM9Yi5tYXAoZnVuY3Rpb24oYyxlKXtyZXR1cm4gMT09Yi5sZW5ndGgmJmQmJihjPU1hdGgubWF4KGMsMCkpLGEubnVtYmVyVG9TdHJpbmcoYykrZltlXX0pLmpvaW4oIiArICIpO3JldHVybiBiLmxlbmd0aD4xPyJjYWxjKCIrYysiKSI6Y31dfXZhciBmPSJweHxlbXxleHxjaHxyZW18dnd8dmh8dm1pbnx2bWF4fGNtfG1tfGlufHB0fHBjIixnPWMuYmluZChudWxsLG5ldyBSZWdFeHAoZiwiZyIpKSxoPWMuYmluZChudWxsLG5ldyBSZWdFeHAoZisifCUiLCJnIikpLGk9Yy5iaW5kKG51bGwsL2RlZ3xyYWR8Z3JhZHx0dXJuL2cpO2EucGFyc2VMZW5ndGg9ZyxhLnBhcnNlTGVuZ3RoT3JQZXJjZW50PWgsYS5jb25zdW1lTGVuZ3RoT3JQZXJjZW50PWEuY29uc3VtZVBhcmVudGhlc2lzZWQuYmluZChudWxsLGgpLGEucGFyc2VBbmdsZT1pLGEubWVyZ2VEaW1lbnNpb25zPWU7dmFyIGo9YS5jb25zdW1lUGFyZW50aGVzaXNlZC5iaW5kKG51bGwsZyksaz1hLmNvbnN1bWVSZXBlYXRlZC5iaW5kKHZvaWQgMCxqLC9eLyksbD1hLmNvbnN1bWVSZXBlYXRlZC5iaW5kKHZvaWQgMCxrLC9eLC8pO2EuY29uc3VtZVNpemVQYWlyTGlzdD1sO3ZhciBtPWZ1bmN0aW9uKGEpe3ZhciBiPWwoYSk7cmV0dXJuIGImJiIiPT1iWzFdP2JbMF06dm9pZCAwfSxuPWEubWVyZ2VOZXN0ZWRSZXBlYXRlZC5iaW5kKHZvaWQgMCxkLCIgIiksbz1hLm1lcmdlTmVzdGVkUmVwZWF0ZWQuYmluZCh2b2lkIDAsbiwiLCIpO2EubWVyZ2VOb25OZWdhdGl2ZVNpemVQYWlyPW4sYS5hZGRQcm9wZXJ0aWVzSGFuZGxlcihtLG8sWyJiYWNrZ3JvdW5kLXNpemUiXSksYS5hZGRQcm9wZXJ0aWVzSGFuZGxlcihoLGQsWyJib3JkZXItYm90dG9tLXdpZHRoIiwiYm9yZGVyLWltYWdlLXdpZHRoIiwiYm9yZGVyLWxlZnQtd2lkdGgiLCJib3JkZXItcmlnaHQtd2lkdGgiLCJib3JkZXItdG9wLXdpZHRoIiwiZmxleC1iYXNpcyIsImZvbnQtc2l6ZSIsImhlaWdodCIsImxpbmUtaGVpZ2h0IiwibWF4LWhlaWdodCIsIm1heC13aWR0aCIsIm91dGxpbmUtd2lkdGgiLCJ3aWR0aCJdKSxhLmFkZFByb3BlcnRpZXNIYW5kbGVyKGgsZSxbImJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXMiLCJib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1cyIsImJvcmRlci10b3AtbGVmdC1yYWRpdXMiLCJib3JkZXItdG9wLXJpZ2h0LXJhZGl1cyIsImJvdHRvbSIsImxlZnQiLCJsZXR0ZXItc3BhY2luZyIsIm1hcmdpbi1ib3R0b20iLCJtYXJnaW4tbGVmdCIsIm1hcmdpbi1yaWdodCIsIm1hcmdpbi10b3AiLCJtaW4taGVpZ2h0IiwibWluLXdpZHRoIiwib3V0bGluZS1vZmZzZXQiLCJwYWRkaW5nLWJvdHRvbSIsInBhZGRpbmctbGVmdCIsInBhZGRpbmctcmlnaHQiLCJwYWRkaW5nLXRvcCIsInBlcnNwZWN0aXZlIiwicmlnaHQiLCJzaGFwZS1tYXJnaW4iLCJ0ZXh0LWluZGVudCIsInRvcCIsInZlcnRpY2FsLWFsaWduIiwid29yZC1zcGFjaW5nIl0pfShkLGYpLGZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYyhiKXtyZXR1cm4gYS5jb25zdW1lTGVuZ3RoT3JQZXJjZW50KGIpfHxhLmNvbnN1bWVUb2tlbigvXmF1dG8vLGIpfWZ1bmN0aW9uIGQoYil7dmFyIGQ9YS5jb25zdW1lTGlzdChbYS5pZ25vcmUoYS5jb25zdW1lVG9rZW4uYmluZChudWxsLC9ecmVjdC8pKSxhLmlnbm9yZShhLmNvbnN1bWVUb2tlbi5iaW5kKG51bGwsL15cKC8pKSxhLmNvbnN1bWVSZXBlYXRlZC5iaW5kKG51bGwsYywvXiwvKSxhLmlnbm9yZShhLmNvbnN1bWVUb2tlbi5iaW5kKG51bGwsL15cKS8pKV0sYik7cmV0dXJuIGQmJjQ9PWRbMF0ubGVuZ3RoP2RbMF06dm9pZCAwfWZ1bmN0aW9uIGUoYixjKXtyZXR1cm4iYXV0byI9PWJ8fCJhdXRvIj09Yz9bITAsITEsZnVuY3Rpb24oZCl7dmFyIGU9ZD9iOmM7aWYoImF1dG8iPT1lKXJldHVybiJhdXRvIjt2YXIgZj1hLm1lcmdlRGltZW5zaW9ucyhlLGUpO3JldHVybiBmWzJdKGZbMF0pfV06YS5tZXJnZURpbWVuc2lvbnMoYixjKX1mdW5jdGlvbiBmKGEpe3JldHVybiJyZWN0KCIrYSsiKSJ9dmFyIGc9YS5tZXJnZVdyYXBwZWROZXN0ZWRSZXBlYXRlZC5iaW5kKG51bGwsZixlLCIsICIpO2EucGFyc2VCb3g9ZCxhLm1lcmdlQm94ZXM9ZyxhLmFkZFByb3BlcnRpZXNIYW5kbGVyKGQsZyxbImNsaXAiXSl9KGQsZiksZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBjKGEpe3JldHVybiBmdW5jdGlvbihiKXt2YXIgYz0wO3JldHVybiBhLm1hcChmdW5jdGlvbihhKXtyZXR1cm4gYT09PWs/YltjKytdOmF9KX19ZnVuY3Rpb24gZChhKXtyZXR1cm4gYX1mdW5jdGlvbiBlKGIpe2lmKGI9Yi50b0xvd2VyQ2FzZSgpLnRyaW0oKSwibm9uZSI9PWIpcmV0dXJuW107Zm9yKHZhciBjLGQ9L1xzKihcdyspXCgoW14pXSopXCkvZyxlPVtdLGY9MDtjPWQuZXhlYyhiKTspe2lmKGMuaW5kZXghPWYpcmV0dXJuO2Y9Yy5pbmRleCtjWzBdLmxlbmd0aDt2YXIgZz1jWzFdLGg9bltnXTtpZighaClyZXR1cm47dmFyIGk9Y1syXS5zcGxpdCgiLCIpLGo9aFswXTtpZihqLmxlbmd0aDxpLmxlbmd0aClyZXR1cm47Zm9yKHZhciBrPVtdLG89MDtvPGoubGVuZ3RoO28rKyl7dmFyIHAscT1pW29dLHI9altvXTtpZihwPXE/e0E6ZnVuY3Rpb24oYil7cmV0dXJuIjAiPT1iLnRyaW0oKT9tOmEucGFyc2VBbmdsZShiKX0sTjphLnBhcnNlTnVtYmVyLFQ6YS5wYXJzZUxlbmd0aE9yUGVyY2VudCxMOmEucGFyc2VMZW5ndGh9W3IudG9VcHBlckNhc2UoKV0ocSk6e2E6bSxuOmtbMF0sdDpsfVtyXSx2b2lkIDA9PT1wKXJldHVybjtrLnB1c2gocCl9aWYoZS5wdXNoKHt0OmcsZDprfSksZC5sYXN0SW5kZXg9PWIubGVuZ3RoKXJldHVybiBlfX1mdW5jdGlvbiBmKGEpe3JldHVybiBhLnRvRml4ZWQoNikucmVwbGFjZSgiLjAwMDAwMCIsIiIpfWZ1bmN0aW9uIGcoYixjKXtpZihiLmRlY29tcG9zaXRpb25QYWlyIT09Yyl7Yi5kZWNvbXBvc2l0aW9uUGFpcj1jO3ZhciBkPWEubWFrZU1hdHJpeERlY29tcG9zaXRpb24oYil9aWYoYy5kZWNvbXBvc2l0aW9uUGFpciE9PWIpe2MuZGVjb21wb3NpdGlvblBhaXI9Yjt2YXIgZT1hLm1ha2VNYXRyaXhEZWNvbXBvc2l0aW9uKGMpfXJldHVybiBudWxsPT1kWzBdfHxudWxsPT1lWzBdP1tbITFdLFshMF0sZnVuY3Rpb24oYSl7cmV0dXJuIGE/Y1swXS5kOmJbMF0uZH1dOihkWzBdLnB1c2goMCksZVswXS5wdXNoKDEpLFtkLGUsZnVuY3Rpb24oYil7dmFyIGM9YS5xdWF0KGRbMF1bM10sZVswXVszXSxiWzVdKSxnPWEuY29tcG9zZU1hdHJpeChiWzBdLGJbMV0sYlsyXSxjLGJbNF0pLGg9Zy5tYXAoZikuam9pbigiLCIpO3JldHVybiBofV0pfWZ1bmN0aW9uIGgoYSl7cmV0dXJuIGEucmVwbGFjZSgvW3h5XS8sIiIpfWZ1bmN0aW9uIGkoYSl7cmV0dXJuIGEucmVwbGFjZSgvKHh8eXx6fDNkKT8kLywiM2QiKX1mdW5jdGlvbiBqKGIsYyl7dmFyIGQ9YS5tYWtlTWF0cml4RGVjb21wb3NpdGlvbiYmITAsZT0hMTtpZighYi5sZW5ndGh8fCFjLmxlbmd0aCl7Yi5sZW5ndGh8fChlPSEwLGI9YyxjPVtdKTtmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKyl7dmFyIGo9YltmXS50LGs9YltmXS5kLGw9InNjYWxlIj09ai5zdWJzdHIoMCw1KT8xOjA7Yy5wdXNoKHt0OmosZDprLm1hcChmdW5jdGlvbihhKXtpZigibnVtYmVyIj09dHlwZW9mIGEpcmV0dXJuIGw7dmFyIGI9e307Zm9yKHZhciBjIGluIGEpYltjXT1sO3JldHVybiBifSl9KX19dmFyIG09ZnVuY3Rpb24oYSxiKXtyZXR1cm4icGVyc3BlY3RpdmUiPT1hJiYicGVyc3BlY3RpdmUiPT1ifHwoIm1hdHJpeCI9PWF8fCJtYXRyaXgzZCI9PWEpJiYoIm1hdHJpeCI9PWJ8fCJtYXRyaXgzZCI9PWIpfSxvPVtdLHA9W10scT1bXTtpZihiLmxlbmd0aCE9Yy5sZW5ndGgpe2lmKCFkKXJldHVybjt2YXIgcj1nKGIsYyk7bz1bclswXV0scD1bclsxXV0scT1bWyJtYXRyaXgiLFtyWzJdXV1dfWVsc2UgZm9yKHZhciBmPTA7ZjxiLmxlbmd0aDtmKyspe3ZhciBqLHM9YltmXS50LHQ9Y1tmXS50LHU9YltmXS5kLHY9Y1tmXS5kLHc9bltzXSx4PW5bdF07aWYobShzLHQpKXtpZighZClyZXR1cm47dmFyIHI9ZyhbYltmXV0sW2NbZl1dKTtvLnB1c2goclswXSkscC5wdXNoKHJbMV0pLHEucHVzaChbIm1hdHJpeCIsW3JbMl1dXSl9ZWxzZXtpZihzPT10KWo9cztlbHNlIGlmKHdbMl0mJnhbMl0mJmgocyk9PWgodCkpaj1oKHMpLHU9d1syXSh1KSx2PXhbMl0odik7ZWxzZXtpZighd1sxXXx8IXhbMV18fGkocykhPWkodCkpe2lmKCFkKXJldHVybjt2YXIgcj1nKGIsYyk7bz1bclswXV0scD1bclsxXV0scT1bWyJtYXRyaXgiLFtyWzJdXV1dO2JyZWFrfWo9aShzKSx1PXdbMV0odSksdj14WzFdKHYpfWZvcih2YXIgeT1bXSx6PVtdLEE9W10sQj0wO0I8dS5sZW5ndGg7QisrKXt2YXIgQz0ibnVtYmVyIj09dHlwZW9mIHVbQl0/YS5tZXJnZU51bWJlcnM6YS5tZXJnZURpbWVuc2lvbnMscj1DKHVbQl0sdltCXSk7eVtCXT1yWzBdLHpbQl09clsxXSxBLnB1c2goclsyXSl9by5wdXNoKHkpLHAucHVzaCh6KSxxLnB1c2goW2osQV0pfX1pZihlKXt2YXIgRD1vO289cCxwPUR9cmV0dXJuW28scCxmdW5jdGlvbihhKXtyZXR1cm4gYS5tYXAoZnVuY3Rpb24oYSxiKXt2YXIgYz1hLm1hcChmdW5jdGlvbihhLGMpe3JldHVybiBxW2JdWzFdW2NdKGEpfSkuam9pbigiLCIpO3JldHVybiJtYXRyaXgiPT1xW2JdWzBdJiYxNj09Yy5zcGxpdCgiLCIpLmxlbmd0aCYmKHFbYl1bMF09Im1hdHJpeDNkIikscVtiXVswXSsiKCIrYysiKSJ9KS5qb2luKCIgIil9XX12YXIgaz1udWxsLGw9e3B4OjB9LG09e2RlZzowfSxuPXttYXRyaXg6WyJOTk5OTk4iLFtrLGssMCwwLGssaywwLDAsMCwwLDEsMCxrLGssMCwxXSxkXSxtYXRyaXgzZDpbIk5OTk5OTk5OTk5OTk5OTk4iLGRdLHJvdGF0ZTpbIkEiXSxyb3RhdGV4OlsiQSJdLHJvdGF0ZXk6WyJBIl0scm90YXRlejpbIkEiXSxyb3RhdGUzZDpbIk5OTkEiXSxwZXJzcGVjdGl2ZTpbIkwiXSxzY2FsZTpbIk5uIixjKFtrLGssMV0pLGRdLHNjYWxleDpbIk4iLGMoW2ssMSwxXSksYyhbaywxXSldLHNjYWxleTpbIk4iLGMoWzEsaywxXSksYyhbMSxrXSldLHNjYWxlejpbIk4iLGMoWzEsMSxrXSldLHNjYWxlM2Q6WyJOTk4iLGRdLHNrZXc6WyJBYSIsbnVsbCxkXSxza2V3eDpbIkEiLG51bGwsYyhbayxtXSldLHNrZXd5OlsiQSIsbnVsbCxjKFttLGtdKV0sdHJhbnNsYXRlOlsiVHQiLGMoW2ssayxsXSksZF0sdHJhbnNsYXRleDpbIlQiLGMoW2ssbCxsXSksYyhbayxsXSldLHRyYW5zbGF0ZXk6WyJUIixjKFtsLGssbF0pLGMoW2wsa10pXSx0cmFuc2xhdGV6OlsiTCIsYyhbbCxsLGtdKV0sdHJhbnNsYXRlM2Q6WyJUVEwiLGRdfTthLmFkZFByb3BlcnRpZXNIYW5kbGVyKGUsaixbInRyYW5zZm9ybSJdKX0oZCxmKSxmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoYSxiKXtiLmNvbmNhdChbYV0pLmZvckVhY2goZnVuY3Rpb24oYil7YiBpbiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUmJihkW2FdPWIpfSl9dmFyIGQ9e307YygidHJhbnNmb3JtIixbIndlYmtpdFRyYW5zZm9ybSIsIm1zVHJhbnNmb3JtIl0pLGMoInRyYW5zZm9ybU9yaWdpbiIsWyJ3ZWJraXRUcmFuc2Zvcm1PcmlnaW4iXSksYygicGVyc3BlY3RpdmUiLFsid2Via2l0UGVyc3BlY3RpdmUiXSksYygicGVyc3BlY3RpdmVPcmlnaW4iLFsid2Via2l0UGVyc3BlY3RpdmVPcmlnaW4iXSksYS5wcm9wZXJ0eU5hbWU9ZnVuY3Rpb24oYSl7cmV0dXJuIGRbYV18fGF9fShkLGYpfSgpLCFmdW5jdGlvbigpe2lmKHZvaWQgMD09PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLmFuaW1hdGUoW10pLm9uY2FuY2VsKXt2YXIgYTtpZih3aW5kb3cucGVyZm9ybWFuY2UmJnBlcmZvcm1hbmNlLm5vdyl2YXIgYT1mdW5jdGlvbigpe3JldHVybiBwZXJmb3JtYW5jZS5ub3coKX07ZWxzZSB2YXIgYT1mdW5jdGlvbigpe3JldHVybiBEYXRlLm5vdygpfTt2YXIgYj1mdW5jdGlvbihhLGIsYyl7dGhpcy50YXJnZXQ9YSx0aGlzLmN1cnJlbnRUaW1lPWIsdGhpcy50aW1lbGluZVRpbWU9Yyx0aGlzLnR5cGU9ImNhbmNlbCIsdGhpcy5idWJibGVzPSExLHRoaXMuY2FuY2VsYWJsZT0hMSx0aGlzLmN1cnJlbnRUYXJnZXQ9YSx0aGlzLmRlZmF1bHRQcmV2ZW50ZWQ9ITEsdGhpcy5ldmVudFBoYXNlPUV2ZW50LkFUX1RBUkdFVCx0aGlzLnRpbWVTdGFtcD1EYXRlLm5vdygpfSxjPXdpbmRvdy5FbGVtZW50LnByb3RvdHlwZS5hbmltYXRlO3dpbmRvdy5FbGVtZW50LnByb3RvdHlwZS5hbmltYXRlPWZ1bmN0aW9uKGQsZSl7dmFyIGY9Yy5jYWxsKHRoaXMsZCxlKTtmLl9jYW5jZWxIYW5kbGVycz1bXSxmLm9uY2FuY2VsPW51bGw7dmFyIGc9Zi5jYW5jZWw7Zi5jYW5jZWw9ZnVuY3Rpb24oKXtnLmNhbGwodGhpcyk7dmFyIGM9bmV3IGIodGhpcyxudWxsLGEoKSksZD10aGlzLl9jYW5jZWxIYW5kbGVycy5jb25jYXQodGhpcy5vbmNhbmNlbD9bdGhpcy5vbmNhbmNlbF06W10pO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtkLmZvckVhY2goZnVuY3Rpb24oYSl7YS5jYWxsKGMudGFyZ2V0LGMpfSl9LDApfTt2YXIgaD1mLmFkZEV2ZW50TGlzdGVuZXI7Zi5hZGRFdmVudExpc3RlbmVyPWZ1bmN0aW9uKGEsYil7ImZ1bmN0aW9uIj09dHlwZW9mIGImJiJjYW5jZWwiPT1hP3RoaXMuX2NhbmNlbEhhbmRsZXJzLnB1c2goYik6aC5jYWxsKHRoaXMsYSxiKX07dmFyIGk9Zi5yZW1vdmVFdmVudExpc3RlbmVyO3JldHVybiBmLnJlbW92ZUV2ZW50TGlzdGVuZXI9ZnVuY3Rpb24oYSxiKXtpZigiY2FuY2VsIj09YSl7dmFyIGM9dGhpcy5fY2FuY2VsSGFuZGxlcnMuaW5kZXhPZihiKTtjPj0wJiZ0aGlzLl9jYW5jZWxIYW5kbGVycy5zcGxpY2UoYywxKX1lbHNlIGkuY2FsbCh0aGlzLGEsYil9LGZ9fX0oKSxmdW5jdGlvbihhKXt2YXIgYj1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsYz1udWxsLGQ9ITE7dHJ5e3ZhciBlPWdldENvbXB1dGVkU3R5bGUoYikuZ2V0UHJvcGVydHlWYWx1ZSgib3BhY2l0eSIpLGY9IjAiPT1lPyIxIjoiMCI7Yz1iLmFuaW1hdGUoe29wYWNpdHk6W2YsZl19LHtkdXJhdGlvbjoxfSksYy5jdXJyZW50VGltZT0wLGQ9Z2V0Q29tcHV0ZWRTdHlsZShiKS5nZXRQcm9wZXJ0eVZhbHVlKCJvcGFjaXR5Iik9PWZ9Y2F0Y2goZyl7fWZpbmFsbHl7YyYmYy5jYW5jZWwoKX1pZighZCl7dmFyIGg9d2luZG93LkVsZW1lbnQucHJvdG90eXBlLmFuaW1hdGU7d2luZG93LkVsZW1lbnQucHJvdG90eXBlLmFuaW1hdGU9ZnVuY3Rpb24oYixjKXtyZXR1cm4gd2luZG93LlN5bWJvbCYmU3ltYm9sLml0ZXJhdG9yJiZBcnJheS5wcm90b3R5cGUuZnJvbSYmYltTeW1ib2wuaXRlcmF0b3JdJiYoYj1BcnJheS5mcm9tKGIpKSxBcnJheS5pc0FycmF5KGIpfHxudWxsPT09Ynx8KGI9YS5jb252ZXJ0VG9BcnJheUZvcm0oYikpLGguY2FsbCh0aGlzLGIsYyl9fX0oYyksIWZ1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBkKGEpe3ZhciBiPXdpbmRvdy5kb2N1bWVudC50aW1lbGluZTtiLmN1cnJlbnRUaW1lPWEsYi5fZGlzY2FyZEFuaW1hdGlvbnMoKSwwPT1iLl9hbmltYXRpb25zLmxlbmd0aD9mPSExOnJlcXVlc3RBbmltYXRpb25GcmFtZShkKTsKfXZhciBlPXdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWU7d2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZT1mdW5jdGlvbihhKXtyZXR1cm4gZShmdW5jdGlvbihiKXt3aW5kb3cuZG9jdW1lbnQudGltZWxpbmUuX3VwZGF0ZUFuaW1hdGlvbnNQcm9taXNlcygpLGEoYiksd2luZG93LmRvY3VtZW50LnRpbWVsaW5lLl91cGRhdGVBbmltYXRpb25zUHJvbWlzZXMoKX0pfSxiLkFuaW1hdGlvblRpbWVsaW5lPWZ1bmN0aW9uKCl7dGhpcy5fYW5pbWF0aW9ucz1bXSx0aGlzLmN1cnJlbnRUaW1lPXZvaWQgMH0sYi5BbmltYXRpb25UaW1lbGluZS5wcm90b3R5cGU9e2dldEFuaW1hdGlvbnM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZGlzY2FyZEFuaW1hdGlvbnMoKSx0aGlzLl9hbmltYXRpb25zLnNsaWNlKCl9LF91cGRhdGVBbmltYXRpb25zUHJvbWlzZXM6ZnVuY3Rpb24oKXtiLmFuaW1hdGlvbnNXaXRoUHJvbWlzZXM9Yi5hbmltYXRpb25zV2l0aFByb21pc2VzLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS5fdXBkYXRlUHJvbWlzZXMoKX0pfSxfZGlzY2FyZEFuaW1hdGlvbnM6ZnVuY3Rpb24oKXt0aGlzLl91cGRhdGVBbmltYXRpb25zUHJvbWlzZXMoKSx0aGlzLl9hbmltYXRpb25zPXRoaXMuX2FuaW1hdGlvbnMuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJmaW5pc2hlZCIhPWEucGxheVN0YXRlJiYiaWRsZSIhPWEucGxheVN0YXRlfSl9LF9wbGF5OmZ1bmN0aW9uKGEpe3ZhciBjPW5ldyBiLkFuaW1hdGlvbihhLHRoaXMpO3JldHVybiB0aGlzLl9hbmltYXRpb25zLnB1c2goYyksYi5yZXN0YXJ0V2ViQW5pbWF0aW9uc05leHRUaWNrKCksYy5fdXBkYXRlUHJvbWlzZXMoKSxjLl9hbmltYXRpb24ucGxheSgpLGMuX3VwZGF0ZVByb21pc2VzKCksY30scGxheTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5yZW1vdmUoKSx0aGlzLl9wbGF5KGEpfX07dmFyIGY9ITE7Yi5yZXN0YXJ0V2ViQW5pbWF0aW9uc05leHRUaWNrPWZ1bmN0aW9uKCl7Znx8KGY9ITAscmVxdWVzdEFuaW1hdGlvbkZyYW1lKGQpKX07dmFyIGc9bmV3IGIuQW5pbWF0aW9uVGltZWxpbmU7Yi50aW1lbGluZT1nO3RyeXtPYmplY3QuZGVmaW5lUHJvcGVydHkod2luZG93LmRvY3VtZW50LCJ0aW1lbGluZSIse2NvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gZ319KX1jYXRjaChoKXt9dHJ5e3dpbmRvdy5kb2N1bWVudC50aW1lbGluZT1nfWNhdGNoKGgpe319KGMsZSxmKSxmdW5jdGlvbihhLGIsYyl7Yi5hbmltYXRpb25zV2l0aFByb21pc2VzPVtdLGIuQW5pbWF0aW9uPWZ1bmN0aW9uKGIsYyl7aWYodGhpcy5pZD0iIixiJiZiLl9pZCYmKHRoaXMuaWQ9Yi5faWQpLHRoaXMuZWZmZWN0PWIsYiYmKGIuX2FuaW1hdGlvbj10aGlzKSwhYyl0aHJvdyBuZXcgRXJyb3IoIkFuaW1hdGlvbiB3aXRoIG51bGwgdGltZWxpbmUgaXMgbm90IHN1cHBvcnRlZCIpO3RoaXMuX3RpbWVsaW5lPWMsdGhpcy5fc2VxdWVuY2VOdW1iZXI9YS5zZXF1ZW5jZU51bWJlcisrLHRoaXMuX2hvbGRUaW1lPTAsdGhpcy5fcGF1c2VkPSExLHRoaXMuX2lzR3JvdXA9ITEsdGhpcy5fYW5pbWF0aW9uPW51bGwsdGhpcy5fY2hpbGRBbmltYXRpb25zPVtdLHRoaXMuX2NhbGxiYWNrPW51bGwsdGhpcy5fb2xkUGxheVN0YXRlPSJpZGxlIix0aGlzLl9yZWJ1aWxkVW5kZXJseWluZ0FuaW1hdGlvbigpLHRoaXMuX2FuaW1hdGlvbi5jYW5jZWwoKSx0aGlzLl91cGRhdGVQcm9taXNlcygpfSxiLkFuaW1hdGlvbi5wcm90b3R5cGU9e191cGRhdGVQcm9taXNlczpmdW5jdGlvbigpe3ZhciBhPXRoaXMuX29sZFBsYXlTdGF0ZSxiPXRoaXMucGxheVN0YXRlO3JldHVybiB0aGlzLl9yZWFkeVByb21pc2UmJmIhPT1hJiYoImlkbGUiPT1iPyh0aGlzLl9yZWplY3RSZWFkeVByb21pc2UoKSx0aGlzLl9yZWFkeVByb21pc2U9dm9pZCAwKToicGVuZGluZyI9PWE/dGhpcy5fcmVzb2x2ZVJlYWR5UHJvbWlzZSgpOiJwZW5kaW5nIj09YiYmKHRoaXMuX3JlYWR5UHJvbWlzZT12b2lkIDApKSx0aGlzLl9maW5pc2hlZFByb21pc2UmJmIhPT1hJiYoImlkbGUiPT1iPyh0aGlzLl9yZWplY3RGaW5pc2hlZFByb21pc2UoKSx0aGlzLl9maW5pc2hlZFByb21pc2U9dm9pZCAwKToiZmluaXNoZWQiPT1iP3RoaXMuX3Jlc29sdmVGaW5pc2hlZFByb21pc2UoKToiZmluaXNoZWQiPT1hJiYodGhpcy5fZmluaXNoZWRQcm9taXNlPXZvaWQgMCkpLHRoaXMuX29sZFBsYXlTdGF0ZT10aGlzLnBsYXlTdGF0ZSx0aGlzLl9yZWFkeVByb21pc2V8fHRoaXMuX2ZpbmlzaGVkUHJvbWlzZX0sX3JlYnVpbGRVbmRlcmx5aW5nQW5pbWF0aW9uOmZ1bmN0aW9uKCl7dGhpcy5fdXBkYXRlUHJvbWlzZXMoKTt2YXIgYSxjLGQsZSxmPSEhdGhpcy5fYW5pbWF0aW9uO2YmJihhPXRoaXMucGxheWJhY2tSYXRlLGM9dGhpcy5fcGF1c2VkLGQ9dGhpcy5zdGFydFRpbWUsZT10aGlzLmN1cnJlbnRUaW1lLHRoaXMuX2FuaW1hdGlvbi5jYW5jZWwoKSx0aGlzLl9hbmltYXRpb24uX3dyYXBwZXI9bnVsbCx0aGlzLl9hbmltYXRpb249bnVsbCksKCF0aGlzLmVmZmVjdHx8dGhpcy5lZmZlY3QgaW5zdGFuY2VvZiB3aW5kb3cuS2V5ZnJhbWVFZmZlY3QpJiYodGhpcy5fYW5pbWF0aW9uPWIubmV3VW5kZXJseWluZ0FuaW1hdGlvbkZvcktleWZyYW1lRWZmZWN0KHRoaXMuZWZmZWN0KSxiLmJpbmRBbmltYXRpb25Gb3JLZXlmcmFtZUVmZmVjdCh0aGlzKSksKHRoaXMuZWZmZWN0IGluc3RhbmNlb2Ygd2luZG93LlNlcXVlbmNlRWZmZWN0fHx0aGlzLmVmZmVjdCBpbnN0YW5jZW9mIHdpbmRvdy5Hcm91cEVmZmVjdCkmJih0aGlzLl9hbmltYXRpb249Yi5uZXdVbmRlcmx5aW5nQW5pbWF0aW9uRm9yR3JvdXAodGhpcy5lZmZlY3QpLGIuYmluZEFuaW1hdGlvbkZvckdyb3VwKHRoaXMpKSx0aGlzLmVmZmVjdCYmdGhpcy5lZmZlY3QuX29uc2FtcGxlJiZiLmJpbmRBbmltYXRpb25Gb3JDdXN0b21FZmZlY3QodGhpcyksZiYmKDEhPWEmJih0aGlzLnBsYXliYWNrUmF0ZT1hKSxudWxsIT09ZD90aGlzLnN0YXJ0VGltZT1kOm51bGwhPT1lP3RoaXMuY3VycmVudFRpbWU9ZTpudWxsIT09dGhpcy5faG9sZFRpbWUmJih0aGlzLmN1cnJlbnRUaW1lPXRoaXMuX2hvbGRUaW1lKSxjJiZ0aGlzLnBhdXNlKCkpLHRoaXMuX3VwZGF0ZVByb21pc2VzKCl9LF91cGRhdGVDaGlsZHJlbjpmdW5jdGlvbigpe2lmKHRoaXMuZWZmZWN0JiYiaWRsZSIhPXRoaXMucGxheVN0YXRlKXt2YXIgYT10aGlzLmVmZmVjdC5fdGltaW5nLmRlbGF5O3RoaXMuX2NoaWxkQW5pbWF0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uKGMpe3RoaXMuX2FycmFuZ2VDaGlsZHJlbihjLGEpLHRoaXMuZWZmZWN0IGluc3RhbmNlb2Ygd2luZG93LlNlcXVlbmNlRWZmZWN0JiYoYSs9Yi5ncm91cENoaWxkRHVyYXRpb24oYy5lZmZlY3QpKX0uYmluZCh0aGlzKSl9fSxfc2V0RXh0ZXJuYWxBbmltYXRpb246ZnVuY3Rpb24oYSl7aWYodGhpcy5lZmZlY3QmJnRoaXMuX2lzR3JvdXApZm9yKHZhciBiPTA7Yjx0aGlzLmVmZmVjdC5jaGlsZHJlbi5sZW5ndGg7YisrKXRoaXMuZWZmZWN0LmNoaWxkcmVuW2JdLl9hbmltYXRpb249YSx0aGlzLl9jaGlsZEFuaW1hdGlvbnNbYl0uX3NldEV4dGVybmFsQW5pbWF0aW9uKGEpfSxfY29uc3RydWN0Q2hpbGRBbmltYXRpb25zOmZ1bmN0aW9uKCl7aWYodGhpcy5lZmZlY3QmJnRoaXMuX2lzR3JvdXApe3ZhciBhPXRoaXMuZWZmZWN0Ll90aW1pbmcuZGVsYXk7dGhpcy5fcmVtb3ZlQ2hpbGRBbmltYXRpb25zKCksdGhpcy5lZmZlY3QuY2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbihjKXt2YXIgZD13aW5kb3cuZG9jdW1lbnQudGltZWxpbmUuX3BsYXkoYyk7dGhpcy5fY2hpbGRBbmltYXRpb25zLnB1c2goZCksZC5wbGF5YmFja1JhdGU9dGhpcy5wbGF5YmFja1JhdGUsdGhpcy5fcGF1c2VkJiZkLnBhdXNlKCksYy5fYW5pbWF0aW9uPXRoaXMuZWZmZWN0Ll9hbmltYXRpb24sdGhpcy5fYXJyYW5nZUNoaWxkcmVuKGQsYSksdGhpcy5lZmZlY3QgaW5zdGFuY2VvZiB3aW5kb3cuU2VxdWVuY2VFZmZlY3QmJihhKz1iLmdyb3VwQ2hpbGREdXJhdGlvbihjKSl9LmJpbmQodGhpcykpfX0sX2FycmFuZ2VDaGlsZHJlbjpmdW5jdGlvbihhLGIpe251bGw9PT10aGlzLnN0YXJ0VGltZT9hLmN1cnJlbnRUaW1lPXRoaXMuY3VycmVudFRpbWUtYi90aGlzLnBsYXliYWNrUmF0ZTphLnN0YXJ0VGltZSE9PXRoaXMuc3RhcnRUaW1lK2IvdGhpcy5wbGF5YmFja1JhdGUmJihhLnN0YXJ0VGltZT10aGlzLnN0YXJ0VGltZStiL3RoaXMucGxheWJhY2tSYXRlKX0sZ2V0IHRpbWVsaW5lKCl7cmV0dXJuIHRoaXMuX3RpbWVsaW5lfSxnZXQgcGxheVN0YXRlKCl7cmV0dXJuIHRoaXMuX2FuaW1hdGlvbj90aGlzLl9hbmltYXRpb24ucGxheVN0YXRlOiJpZGxlIn0sZ2V0IGZpbmlzaGVkKCl7cmV0dXJuIHdpbmRvdy5Qcm9taXNlPyh0aGlzLl9maW5pc2hlZFByb21pc2V8fCgtMT09Yi5hbmltYXRpb25zV2l0aFByb21pc2VzLmluZGV4T2YodGhpcykmJmIuYW5pbWF0aW9uc1dpdGhQcm9taXNlcy5wdXNoKHRoaXMpLHRoaXMuX2ZpbmlzaGVkUHJvbWlzZT1uZXcgUHJvbWlzZShmdW5jdGlvbihhLGIpe3RoaXMuX3Jlc29sdmVGaW5pc2hlZFByb21pc2U9ZnVuY3Rpb24oKXthKHRoaXMpfSx0aGlzLl9yZWplY3RGaW5pc2hlZFByb21pc2U9ZnVuY3Rpb24oKXtiKHt0eXBlOkRPTUV4Y2VwdGlvbi5BQk9SVF9FUlIsbmFtZToiQWJvcnRFcnJvciJ9KX19LmJpbmQodGhpcykpLCJmaW5pc2hlZCI9PXRoaXMucGxheVN0YXRlJiZ0aGlzLl9yZXNvbHZlRmluaXNoZWRQcm9taXNlKCkpLHRoaXMuX2ZpbmlzaGVkUHJvbWlzZSk6KGNvbnNvbGUud2FybigiQW5pbWF0aW9uIFByb21pc2VzIHJlcXVpcmUgSmF2YVNjcmlwdCBQcm9taXNlIGNvbnN0cnVjdG9yIiksbnVsbCl9LGdldCByZWFkeSgpe3JldHVybiB3aW5kb3cuUHJvbWlzZT8odGhpcy5fcmVhZHlQcm9taXNlfHwoLTE9PWIuYW5pbWF0aW9uc1dpdGhQcm9taXNlcy5pbmRleE9mKHRoaXMpJiZiLmFuaW1hdGlvbnNXaXRoUHJvbWlzZXMucHVzaCh0aGlzKSx0aGlzLl9yZWFkeVByb21pc2U9bmV3IFByb21pc2UoZnVuY3Rpb24oYSxiKXt0aGlzLl9yZXNvbHZlUmVhZHlQcm9taXNlPWZ1bmN0aW9uKCl7YSh0aGlzKX0sdGhpcy5fcmVqZWN0UmVhZHlQcm9taXNlPWZ1bmN0aW9uKCl7Yih7dHlwZTpET01FeGNlcHRpb24uQUJPUlRfRVJSLG5hbWU6IkFib3J0RXJyb3IifSl9fS5iaW5kKHRoaXMpKSwicGVuZGluZyIhPT10aGlzLnBsYXlTdGF0ZSYmdGhpcy5fcmVzb2x2ZVJlYWR5UHJvbWlzZSgpKSx0aGlzLl9yZWFkeVByb21pc2UpOihjb25zb2xlLndhcm4oIkFuaW1hdGlvbiBQcm9taXNlcyByZXF1aXJlIEphdmFTY3JpcHQgUHJvbWlzZSBjb25zdHJ1Y3RvciIpLG51bGwpfSxnZXQgb25maW5pc2goKXtyZXR1cm4gdGhpcy5fYW5pbWF0aW9uLm9uZmluaXNofSxzZXQgb25maW5pc2goYSl7ImZ1bmN0aW9uIj09dHlwZW9mIGE/dGhpcy5fYW5pbWF0aW9uLm9uZmluaXNoPWZ1bmN0aW9uKGIpe2IudGFyZ2V0PXRoaXMsYS5jYWxsKHRoaXMsYil9LmJpbmQodGhpcyk6dGhpcy5fYW5pbWF0aW9uLm9uZmluaXNoPWF9LGdldCBvbmNhbmNlbCgpe3JldHVybiB0aGlzLl9hbmltYXRpb24ub25jYW5jZWx9LHNldCBvbmNhbmNlbChhKXsiZnVuY3Rpb24iPT10eXBlb2YgYT90aGlzLl9hbmltYXRpb24ub25jYW5jZWw9ZnVuY3Rpb24oYil7Yi50YXJnZXQ9dGhpcyxhLmNhbGwodGhpcyxiKX0uYmluZCh0aGlzKTp0aGlzLl9hbmltYXRpb24ub25jYW5jZWw9YX0sZ2V0IGN1cnJlbnRUaW1lKCl7dGhpcy5fdXBkYXRlUHJvbWlzZXMoKTt2YXIgYT10aGlzLl9hbmltYXRpb24uY3VycmVudFRpbWU7cmV0dXJuIHRoaXMuX3VwZGF0ZVByb21pc2VzKCksYX0sc2V0IGN1cnJlbnRUaW1lKGEpe3RoaXMuX3VwZGF0ZVByb21pc2VzKCksdGhpcy5fYW5pbWF0aW9uLmN1cnJlbnRUaW1lPWlzRmluaXRlKGEpP2E6TWF0aC5zaWduKGEpKk51bWJlci5NQVhfVkFMVUUsdGhpcy5fcmVnaXN0ZXIoKSx0aGlzLl9mb3JFYWNoQ2hpbGQoZnVuY3Rpb24oYixjKXtiLmN1cnJlbnRUaW1lPWEtY30pLHRoaXMuX3VwZGF0ZVByb21pc2VzKCl9LGdldCBzdGFydFRpbWUoKXtyZXR1cm4gdGhpcy5fYW5pbWF0aW9uLnN0YXJ0VGltZX0sc2V0IHN0YXJ0VGltZShhKXt0aGlzLl91cGRhdGVQcm9taXNlcygpLHRoaXMuX2FuaW1hdGlvbi5zdGFydFRpbWU9aXNGaW5pdGUoYSk/YTpNYXRoLnNpZ24oYSkqTnVtYmVyLk1BWF9WQUxVRSx0aGlzLl9yZWdpc3RlcigpLHRoaXMuX2ZvckVhY2hDaGlsZChmdW5jdGlvbihiLGMpe2Iuc3RhcnRUaW1lPWErY30pLHRoaXMuX3VwZGF0ZVByb21pc2VzKCl9LGdldCBwbGF5YmFja1JhdGUoKXtyZXR1cm4gdGhpcy5fYW5pbWF0aW9uLnBsYXliYWNrUmF0ZX0sc2V0IHBsYXliYWNrUmF0ZShhKXt0aGlzLl91cGRhdGVQcm9taXNlcygpO3ZhciBiPXRoaXMuY3VycmVudFRpbWU7dGhpcy5fYW5pbWF0aW9uLnBsYXliYWNrUmF0ZT1hLHRoaXMuX2ZvckVhY2hDaGlsZChmdW5jdGlvbihiKXtiLnBsYXliYWNrUmF0ZT1hfSksInBhdXNlZCIhPXRoaXMucGxheVN0YXRlJiYiaWRsZSIhPXRoaXMucGxheVN0YXRlJiZ0aGlzLnBsYXkoKSxudWxsIT09YiYmKHRoaXMuY3VycmVudFRpbWU9YiksdGhpcy5fdXBkYXRlUHJvbWlzZXMoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuX3VwZGF0ZVByb21pc2VzKCksdGhpcy5fcGF1c2VkPSExLHRoaXMuX2FuaW1hdGlvbi5wbGF5KCksLTE9PXRoaXMuX3RpbWVsaW5lLl9hbmltYXRpb25zLmluZGV4T2YodGhpcykmJnRoaXMuX3RpbWVsaW5lLl9hbmltYXRpb25zLnB1c2godGhpcyksdGhpcy5fcmVnaXN0ZXIoKSxiLmF3YWl0U3RhcnRUaW1lKHRoaXMpLHRoaXMuX2ZvckVhY2hDaGlsZChmdW5jdGlvbihhKXt2YXIgYj1hLmN1cnJlbnRUaW1lO2EucGxheSgpLGEuY3VycmVudFRpbWU9Yn0pLHRoaXMuX3VwZGF0ZVByb21pc2VzKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5fdXBkYXRlUHJvbWlzZXMoKSx0aGlzLmN1cnJlbnRUaW1lJiYodGhpcy5faG9sZFRpbWU9dGhpcy5jdXJyZW50VGltZSksdGhpcy5fYW5pbWF0aW9uLnBhdXNlKCksdGhpcy5fcmVnaXN0ZXIoKSx0aGlzLl9mb3JFYWNoQ2hpbGQoZnVuY3Rpb24oYSl7YS5wYXVzZSgpfSksdGhpcy5fcGF1c2VkPSEwLHRoaXMuX3VwZGF0ZVByb21pc2VzKCl9LGZpbmlzaDpmdW5jdGlvbigpe3RoaXMuX3VwZGF0ZVByb21pc2VzKCksdGhpcy5fYW5pbWF0aW9uLmZpbmlzaCgpLHRoaXMuX3JlZ2lzdGVyKCksdGhpcy5fdXBkYXRlUHJvbWlzZXMoKX0sY2FuY2VsOmZ1bmN0aW9uKCl7dGhpcy5fdXBkYXRlUHJvbWlzZXMoKSx0aGlzLl9hbmltYXRpb24uY2FuY2VsKCksdGhpcy5fcmVnaXN0ZXIoKSx0aGlzLl9yZW1vdmVDaGlsZEFuaW1hdGlvbnMoKSx0aGlzLl91cGRhdGVQcm9taXNlcygpfSxyZXZlcnNlOmZ1bmN0aW9uKCl7dGhpcy5fdXBkYXRlUHJvbWlzZXMoKTt2YXIgYT10aGlzLmN1cnJlbnRUaW1lO3RoaXMuX2FuaW1hdGlvbi5yZXZlcnNlKCksdGhpcy5fZm9yRWFjaENoaWxkKGZ1bmN0aW9uKGEpe2EucmV2ZXJzZSgpfSksbnVsbCE9PWEmJih0aGlzLmN1cnJlbnRUaW1lPWEpLHRoaXMuX3VwZGF0ZVByb21pc2VzKCl9LGFkZEV2ZW50TGlzdGVuZXI6ZnVuY3Rpb24oYSxiKXt2YXIgYz1iOyJmdW5jdGlvbiI9PXR5cGVvZiBiJiYoYz1mdW5jdGlvbihhKXthLnRhcmdldD10aGlzLGIuY2FsbCh0aGlzLGEpfS5iaW5kKHRoaXMpLGIuX3dyYXBwZXI9YyksdGhpcy5fYW5pbWF0aW9uLmFkZEV2ZW50TGlzdGVuZXIoYSxjKX0scmVtb3ZlRXZlbnRMaXN0ZW5lcjpmdW5jdGlvbihhLGIpe3RoaXMuX2FuaW1hdGlvbi5yZW1vdmVFdmVudExpc3RlbmVyKGEsYiYmYi5fd3JhcHBlcnx8Yil9LF9yZW1vdmVDaGlsZEFuaW1hdGlvbnM6ZnVuY3Rpb24oKXtmb3IoO3RoaXMuX2NoaWxkQW5pbWF0aW9ucy5sZW5ndGg7KXRoaXMuX2NoaWxkQW5pbWF0aW9ucy5wb3AoKS5jYW5jZWwoKX0sX2ZvckVhY2hDaGlsZDpmdW5jdGlvbihiKXt2YXIgYz0wO2lmKHRoaXMuZWZmZWN0LmNoaWxkcmVuJiZ0aGlzLl9jaGlsZEFuaW1hdGlvbnMubGVuZ3RoPHRoaXMuZWZmZWN0LmNoaWxkcmVuLmxlbmd0aCYmdGhpcy5fY29uc3RydWN0Q2hpbGRBbmltYXRpb25zKCksdGhpcy5fY2hpbGRBbmltYXRpb25zLmZvckVhY2goZnVuY3Rpb24oYSl7Yi5jYWxsKHRoaXMsYSxjKSx0aGlzLmVmZmVjdCBpbnN0YW5jZW9mIHdpbmRvdy5TZXF1ZW5jZUVmZmVjdCYmKGMrPWEuZWZmZWN0LmFjdGl2ZUR1cmF0aW9uKX0uYmluZCh0aGlzKSksInBlbmRpbmciIT10aGlzLnBsYXlTdGF0ZSl7dmFyIGQ9dGhpcy5lZmZlY3QuX3RpbWluZyxlPXRoaXMuY3VycmVudFRpbWU7bnVsbCE9PWUmJihlPWEuY2FsY3VsYXRlVGltZUZyYWN0aW9uKGEuY2FsY3VsYXRlQWN0aXZlRHVyYXRpb24oZCksZSxkKSksKG51bGw9PWV8fGlzTmFOKGUpKSYmdGhpcy5fcmVtb3ZlQ2hpbGRBbmltYXRpb25zKCl9fX0sd2luZG93LkFuaW1hdGlvbj1iLkFuaW1hdGlvbn0oYyxlLGYpLGZ1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBkKGIpe3RoaXMuX2ZyYW1lcz1hLm5vcm1hbGl6ZUtleWZyYW1lcyhiKX1mdW5jdGlvbiBlKCl7Zm9yKHZhciBhPSExO2kubGVuZ3RoOyl7dmFyIGI9aS5zaGlmdCgpO2IuX3VwZGF0ZUNoaWxkcmVuKCksYT0hMH1yZXR1cm4gYX12YXIgZj1mdW5jdGlvbihhKXtpZihhLl9hbmltYXRpb249dm9pZCAwLGEgaW5zdGFuY2VvZiB3aW5kb3cuU2VxdWVuY2VFZmZlY3R8fGEgaW5zdGFuY2VvZiB3aW5kb3cuR3JvdXBFZmZlY3QpZm9yKHZhciBiPTA7YjxhLmNoaWxkcmVuLmxlbmd0aDtiKyspZihhLmNoaWxkcmVuW2JdKX07Yi5yZW1vdmVNdWx0aT1mdW5jdGlvbihhKXtmb3IodmFyIGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKXt2YXIgZD1hW2NdO2QuX3BhcmVudD8oLTE9PWIuaW5kZXhPZihkLl9wYXJlbnQpJiZiLnB1c2goZC5fcGFyZW50KSxkLl9wYXJlbnQuY2hpbGRyZW4uc3BsaWNlKGQuX3BhcmVudC5jaGlsZHJlbi5pbmRleE9mKGQpLDEpLGQuX3BhcmVudD1udWxsLGYoZCkpOmQuX2FuaW1hdGlvbiYmZC5fYW5pbWF0aW9uLmVmZmVjdD09ZCYmKGQuX2FuaW1hdGlvbi5jYW5jZWwoKSxkLl9hbmltYXRpb24uZWZmZWN0PW5ldyBLZXlmcmFtZUVmZmVjdChudWxsLFtdKSxkLl9hbmltYXRpb24uX2NhbGxiYWNrJiYoZC5fYW5pbWF0aW9uLl9jYWxsYmFjay5fYW5pbWF0aW9uPW51bGwpLGQuX2FuaW1hdGlvbi5fcmVidWlsZFVuZGVybHlpbmdBbmltYXRpb24oKSxmKGQpKX1mb3IoYz0wO2M8Yi5sZW5ndGg7YysrKWJbY10uX3JlYnVpbGQoKX0sYi5LZXlmcmFtZUVmZmVjdD1mdW5jdGlvbihiLGMsZSxmKXtyZXR1cm4gdGhpcy50YXJnZXQ9Yix0aGlzLl9wYXJlbnQ9bnVsbCxlPWEubnVtZXJpY1RpbWluZ1RvT2JqZWN0KGUpLHRoaXMuX3RpbWluZ0lucHV0PWEuY2xvbmVUaW1pbmdJbnB1dChlKSx0aGlzLl90aW1pbmc9YS5ub3JtYWxpemVUaW1pbmdJbnB1dChlKSx0aGlzLnRpbWluZz1hLm1ha2VUaW1pbmcoZSwhMSx0aGlzKSx0aGlzLnRpbWluZy5fZWZmZWN0PXRoaXMsImZ1bmN0aW9uIj09dHlwZW9mIGM/KGEuZGVwcmVjYXRlZCgiQ3VzdG9tIEtleWZyYW1lRWZmZWN0IiwiMjAxNS0wNi0yMiIsIlVzZSBLZXlmcmFtZUVmZmVjdC5vbnNhbXBsZSBpbnN0ZWFkLiIpLHRoaXMuX25vcm1hbGl6ZWRLZXlmcmFtZXM9Yyk6dGhpcy5fbm9ybWFsaXplZEtleWZyYW1lcz1uZXcgZChjKSx0aGlzLl9rZXlmcmFtZXM9Yyx0aGlzLmFjdGl2ZUR1cmF0aW9uPWEuY2FsY3VsYXRlQWN0aXZlRHVyYXRpb24odGhpcy5fdGltaW5nKSx0aGlzLl9pZD1mLHRoaXN9LGIuS2V5ZnJhbWVFZmZlY3QucHJvdG90eXBlPXtnZXRGcmFtZXM6ZnVuY3Rpb24oKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5fbm9ybWFsaXplZEtleWZyYW1lcz90aGlzLl9ub3JtYWxpemVkS2V5ZnJhbWVzOnRoaXMuX25vcm1hbGl6ZWRLZXlmcmFtZXMuX2ZyYW1lc30sc2V0IG9uc2FtcGxlKGEpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmdldEZyYW1lcygpKXRocm93IG5ldyBFcnJvcigiU2V0dGluZyBvbnNhbXBsZSBvbiBjdXN0b20gZWZmZWN0IEtleWZyYW1lRWZmZWN0IGlzIG5vdCBzdXBwb3J0ZWQuIik7dGhpcy5fb25zYW1wbGU9YSx0aGlzLl9hbmltYXRpb24mJnRoaXMuX2FuaW1hdGlvbi5fcmVidWlsZFVuZGVybHlpbmdBbmltYXRpb24oKX0sZ2V0IHBhcmVudCgpe3JldHVybiB0aGlzLl9wYXJlbnR9LGNsb25lOmZ1bmN0aW9uKCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZ2V0RnJhbWVzKCkpdGhyb3cgbmV3IEVycm9yKCJDbG9uaW5nIGN1c3RvbSBlZmZlY3RzIGlzIG5vdCBzdXBwb3J0ZWQuIik7dmFyIGI9bmV3IEtleWZyYW1lRWZmZWN0KHRoaXMudGFyZ2V0LFtdLGEuY2xvbmVUaW1pbmdJbnB1dCh0aGlzLl90aW1pbmdJbnB1dCksdGhpcy5faWQpO3JldHVybiBiLl9ub3JtYWxpemVkS2V5ZnJhbWVzPXRoaXMuX25vcm1hbGl6ZWRLZXlmcmFtZXMsYi5fa2V5ZnJhbWVzPXRoaXMuX2tleWZyYW1lcyxifSxyZW1vdmU6ZnVuY3Rpb24oKXtiLnJlbW92ZU11bHRpKFt0aGlzXSl9fTt2YXIgZz1FbGVtZW50LnByb3RvdHlwZS5hbmltYXRlO0VsZW1lbnQucHJvdG90eXBlLmFuaW1hdGU9ZnVuY3Rpb24oYSxjKXt2YXIgZD0iIjtyZXR1cm4gYyYmYy5pZCYmKGQ9Yy5pZCksYi50aW1lbGluZS5fcGxheShuZXcgYi5LZXlmcmFtZUVmZmVjdCh0aGlzLGEsYyxkKSl9O3ZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIsImRpdiIpO2IubmV3VW5kZXJseWluZ0FuaW1hdGlvbkZvcktleWZyYW1lRWZmZWN0PWZ1bmN0aW9uKGEpe2lmKGEpe3ZhciBiPWEudGFyZ2V0fHxoLGM9YS5fa2V5ZnJhbWVzOyJmdW5jdGlvbiI9PXR5cGVvZiBjJiYoYz1bXSk7dmFyIGQ9YS5fdGltaW5nSW5wdXQ7ZC5pZD1hLl9pZH1lbHNlIHZhciBiPWgsYz1bXSxkPTA7cmV0dXJuIGcuYXBwbHkoYixbYyxkXSl9LGIuYmluZEFuaW1hdGlvbkZvcktleWZyYW1lRWZmZWN0PWZ1bmN0aW9uKGEpe2EuZWZmZWN0JiYiZnVuY3Rpb24iPT10eXBlb2YgYS5lZmZlY3QuX25vcm1hbGl6ZWRLZXlmcmFtZXMmJmIuYmluZEFuaW1hdGlvbkZvckN1c3RvbUVmZmVjdChhKX07dmFyIGk9W107Yi5hd2FpdFN0YXJ0VGltZT1mdW5jdGlvbihhKXtudWxsPT09YS5zdGFydFRpbWUmJmEuX2lzR3JvdXAmJigwPT1pLmxlbmd0aCYmcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGUpLGkucHVzaChhKSl9O3ZhciBqPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csImdldENvbXB1dGVkU3R5bGUiLHtjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx2YWx1ZTpmdW5jdGlvbigpe3dpbmRvdy5kb2N1bWVudC50aW1lbGluZS5fdXBkYXRlQW5pbWF0aW9uc1Byb21pc2VzKCk7dmFyIGE9ai5hcHBseSh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIGUoKSYmKGE9ai5hcHBseSh0aGlzLGFyZ3VtZW50cykpLHdpbmRvdy5kb2N1bWVudC50aW1lbGluZS5fdXBkYXRlQW5pbWF0aW9uc1Byb21pc2VzKCksYX19KSx3aW5kb3cuS2V5ZnJhbWVFZmZlY3Q9Yi5LZXlmcmFtZUVmZmVjdCx3aW5kb3cuRWxlbWVudC5wcm90b3R5cGUuZ2V0QW5pbWF0aW9ucz1mdW5jdGlvbigpe3JldHVybiBkb2N1bWVudC50aW1lbGluZS5nZXRBbmltYXRpb25zKCkuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBudWxsIT09YS5lZmZlY3QmJmEuZWZmZWN0LnRhcmdldD09dGhpc30uYmluZCh0aGlzKSl9fShjLGUsZiksZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGQoYSl7YS5fcmVnaXN0ZXJlZHx8KGEuX3JlZ2lzdGVyZWQ9ITAsZy5wdXNoKGEpLGh8fChoPSEwLHJlcXVlc3RBbmltYXRpb25GcmFtZShlKSkpfWZ1bmN0aW9uIGUoYSl7dmFyIGI9ZztnPVtdLGIuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBhLl9zZXF1ZW5jZU51bWJlci1iLl9zZXF1ZW5jZU51bWJlcn0pLGI9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7YSgpO3ZhciBiPWEuX2FuaW1hdGlvbj9hLl9hbmltYXRpb24ucGxheVN0YXRlOiJpZGxlIjtyZXR1cm4icnVubmluZyIhPWImJiJwZW5kaW5nIiE9YiYmKGEuX3JlZ2lzdGVyZWQ9ITEpLGEuX3JlZ2lzdGVyZWR9KSxnLnB1c2guYXBwbHkoZyxiKSxnLmxlbmd0aD8oaD0hMCxyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZSkpOmg9ITF9dmFyIGY9KGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIsImRpdiIpLDApO2IuYmluZEFuaW1hdGlvbkZvckN1c3RvbUVmZmVjdD1mdW5jdGlvbihiKXt2YXIgYyxlPWIuZWZmZWN0LnRhcmdldCxnPSJmdW5jdGlvbiI9PXR5cGVvZiBiLmVmZmVjdC5nZXRGcmFtZXMoKTtjPWc/Yi5lZmZlY3QuZ2V0RnJhbWVzKCk6Yi5lZmZlY3QuX29uc2FtcGxlO3ZhciBoPWIuZWZmZWN0LnRpbWluZyxpPW51bGw7aD1hLm5vcm1hbGl6ZVRpbWluZ0lucHV0KGgpO3ZhciBqPWZ1bmN0aW9uKCl7dmFyIGQ9ai5fYW5pbWF0aW9uP2ouX2FuaW1hdGlvbi5jdXJyZW50VGltZTpudWxsO251bGwhPT1kJiYoZD1hLmNhbGN1bGF0ZVRpbWVGcmFjdGlvbihhLmNhbGN1bGF0ZUFjdGl2ZUR1cmF0aW9uKGgpLGQsaCksaXNOYU4oZCkmJihkPW51bGwpKSxkIT09aSYmKGc/YyhkLGUsYi5lZmZlY3QpOmMoZCxiLmVmZmVjdCxiLmVmZmVjdC5fYW5pbWF0aW9uKSksaT1kfTtqLl9hbmltYXRpb249YixqLl9yZWdpc3RlcmVkPSExLGouX3NlcXVlbmNlTnVtYmVyPWYrKyxiLl9jYWxsYmFjaz1qLGQoail9O3ZhciBnPVtdLGg9ITE7Yi5BbmltYXRpb24ucHJvdG90eXBlLl9yZWdpc3Rlcj1mdW5jdGlvbigpe3RoaXMuX2NhbGxiYWNrJiZkKHRoaXMuX2NhbGxiYWNrKX19KGMsZSxmKSxmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZChhKXtyZXR1cm4gYS5fdGltaW5nLmRlbGF5K2EuYWN0aXZlRHVyYXRpb24rYS5fdGltaW5nLmVuZERlbGF5fWZ1bmN0aW9uIGUoYixjLGQpe3RoaXMuX2lkPWQsdGhpcy5fcGFyZW50PW51bGwsdGhpcy5jaGlsZHJlbj1ifHxbXSx0aGlzLl9yZXBhcmVudCh0aGlzLmNoaWxkcmVuKSxjPWEubnVtZXJpY1RpbWluZ1RvT2JqZWN0KGMpLHRoaXMuX3RpbWluZ0lucHV0PWEuY2xvbmVUaW1pbmdJbnB1dChjKSx0aGlzLl90aW1pbmc9YS5ub3JtYWxpemVUaW1pbmdJbnB1dChjLCEwKSx0aGlzLnRpbWluZz1hLm1ha2VUaW1pbmcoYywhMCx0aGlzKSx0aGlzLnRpbWluZy5fZWZmZWN0PXRoaXMsImF1dG8iPT09dGhpcy5fdGltaW5nLmR1cmF0aW9uJiYodGhpcy5fdGltaW5nLmR1cmF0aW9uPXRoaXMuYWN0aXZlRHVyYXRpb24pfXdpbmRvdy5TZXF1ZW5jZUVmZmVjdD1mdW5jdGlvbigpe2UuYXBwbHkodGhpcyxhcmd1bWVudHMpfSx3aW5kb3cuR3JvdXBFZmZlY3Q9ZnVuY3Rpb24oKXtlLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sZS5wcm90b3R5cGU9e19pc0FuY2VzdG9yOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj10aGlzO251bGwhPT1iOyl7aWYoYj09YSlyZXR1cm4hMDtiPWIuX3BhcmVudH1yZXR1cm4hMX0sX3JlYnVpbGQ6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpczthOykiYXV0byI9PT1hLnRpbWluZy5kdXJhdGlvbiYmKGEuX3RpbWluZy5kdXJhdGlvbj1hLmFjdGl2ZUR1cmF0aW9uKSxhPWEuX3BhcmVudDt0aGlzLl9hbmltYXRpb24mJnRoaXMuX2FuaW1hdGlvbi5fcmVidWlsZFVuZGVybHlpbmdBbmltYXRpb24oKX0sX3JlcGFyZW50OmZ1bmN0aW9uKGEpe2IucmVtb3ZlTXVsdGkoYSk7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspYVtjXS5fcGFyZW50PXRoaXN9LF9wdXRDaGlsZDpmdW5jdGlvbihhLGIpe2Zvcih2YXIgYz1iPyJDYW5ub3QgYXBwZW5kIGFuIGFuY2VzdG9yIG9yIHNlbGYiOiJDYW5ub3QgcHJlcGVuZCBhbiBhbmNlc3RvciBvciBzZWxmIixkPTA7ZDxhLmxlbmd0aDtkKyspaWYodGhpcy5faXNBbmNlc3RvcihhW2RdKSl0aHJvd3t0eXBlOkRPTUV4Y2VwdGlvbi5ISUVSQVJDSFlfUkVRVUVTVF9FUlIsbmFtZToiSGllcmFyY2h5UmVxdWVzdEVycm9yIixtZXNzYWdlOmN9O2Zvcih2YXIgZD0wO2Q8YS5sZW5ndGg7ZCsrKWI/dGhpcy5jaGlsZHJlbi5wdXNoKGFbZF0pOnRoaXMuY2hpbGRyZW4udW5zaGlmdChhW2RdKTt0aGlzLl9yZXBhcmVudChhKSx0aGlzLl9yZWJ1aWxkKCl9LGFwcGVuZDpmdW5jdGlvbigpe3RoaXMuX3B1dENoaWxkKGFyZ3VtZW50cywhMCl9LHByZXBlbmQ6ZnVuY3Rpb24oKXt0aGlzLl9wdXRDaGlsZChhcmd1bWVudHMsITEpfSxnZXQgcGFyZW50KCl7cmV0dXJuIHRoaXMuX3BhcmVudH0sZ2V0IGZpcnN0Q2hpbGQoKXtyZXR1cm4gdGhpcy5jaGlsZHJlbi5sZW5ndGg/dGhpcy5jaGlsZHJlblswXTpudWxsfSxnZXQgbGFzdENoaWxkKCl7cmV0dXJuIHRoaXMuY2hpbGRyZW4ubGVuZ3RoP3RoaXMuY2hpbGRyZW5bdGhpcy5jaGlsZHJlbi5sZW5ndGgtMV06bnVsbH0sY2xvbmU6ZnVuY3Rpb24oKXtmb3IodmFyIGI9YS5jbG9uZVRpbWluZ0lucHV0KHRoaXMuX3RpbWluZ0lucHV0KSxjPVtdLGQ9MDtkPHRoaXMuY2hpbGRyZW4ubGVuZ3RoO2QrKyljLnB1c2godGhpcy5jaGlsZHJlbltkXS5jbG9uZSgpKTtyZXR1cm4gdGhpcyBpbnN0YW5jZW9mIEdyb3VwRWZmZWN0P25ldyBHcm91cEVmZmVjdChjLGIpOm5ldyBTZXF1ZW5jZUVmZmVjdChjLGIpfSxyZW1vdmU6ZnVuY3Rpb24oKXtiLnJlbW92ZU11bHRpKFt0aGlzXSl9fSx3aW5kb3cuU2VxdWVuY2VFZmZlY3QucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoZS5wcm90b3R5cGUpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh3aW5kb3cuU2VxdWVuY2VFZmZlY3QucHJvdG90eXBlLCJhY3RpdmVEdXJhdGlvbiIse2dldDpmdW5jdGlvbigpe3ZhciBhPTA7cmV0dXJuIHRoaXMuY2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbihiKXthKz1kKGIpfSksTWF0aC5tYXgoYSwwKX19KSx3aW5kb3cuR3JvdXBFZmZlY3QucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoZS5wcm90b3R5cGUpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh3aW5kb3cuR3JvdXBFZmZlY3QucHJvdG90eXBlLCJhY3RpdmVEdXJhdGlvbiIse2dldDpmdW5jdGlvbigpe3ZhciBhPTA7cmV0dXJuIHRoaXMuY2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbihiKXthPU1hdGgubWF4KGEsZChiKSl9KSxhfX0pLGIubmV3VW5kZXJseWluZ0FuaW1hdGlvbkZvckdyb3VwPWZ1bmN0aW9uKGMpe3ZhciBkLGU9bnVsbCxmPWZ1bmN0aW9uKGIpe3ZhciBjPWQuX3dyYXBwZXI7cmV0dXJuIGMmJiJwZW5kaW5nIiE9Yy5wbGF5U3RhdGUmJmMuZWZmZWN0P251bGw9PWI/dm9pZCBjLl9yZW1vdmVDaGlsZEFuaW1hdGlvbnMoKTowPT1iJiZjLnBsYXliYWNrUmF0ZTwwJiYoZXx8KGU9YS5ub3JtYWxpemVUaW1pbmdJbnB1dChjLmVmZmVjdC50aW1pbmcpKSxiPWEuY2FsY3VsYXRlVGltZUZyYWN0aW9uKGEuY2FsY3VsYXRlQWN0aXZlRHVyYXRpb24oZSksLTEsZSksaXNOYU4oYil8fG51bGw9PWIpPyhjLl9mb3JFYWNoQ2hpbGQoZnVuY3Rpb24oYSl7YS5jdXJyZW50VGltZT0tMX0pLHZvaWQgYy5fcmVtb3ZlQ2hpbGRBbmltYXRpb25zKCkpOnZvaWQgMDp2b2lkIDB9LGc9bmV3IEtleWZyYW1lRWZmZWN0KG51bGwsW10sYy5fdGltaW5nLGMuX2lkKTtyZXR1cm4gZy5vbnNhbXBsZT1mLGQ9Yi50aW1lbGluZS5fcGxheShnKX0sYi5iaW5kQW5pbWF0aW9uRm9yR3JvdXA9ZnVuY3Rpb24oYSl7YS5fYW5pbWF0aW9uLl93cmFwcGVyPWEsYS5faXNHcm91cD0hMCxiLmF3YWl0U3RhcnRUaW1lKGEpLGEuX2NvbnN0cnVjdENoaWxkQW5pbWF0aW9ucygpLGEuX3NldEV4dGVybmFsQW5pbWF0aW9uKGEpfSxiLmdyb3VwQ2hpbGREdXJhdGlvbj1kfShjLGUsZiksYlsidHJ1ZSJdPWF9KHt9LGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9KCkpOwo8L3NjcmlwdD48c2NyaXB0Pi8vIGh0dHBzOi8vZDNqcy5vcmcgdjUuNy4wIENvcHlyaWdodCAyMDE4IE1pa2UgQm9zdG9jawohZnVuY3Rpb24odCxuKXsib2JqZWN0Ij09dHlwZW9mIGV4cG9ydHMmJiJ1bmRlZmluZWQiIT10eXBlb2YgbW9kdWxlP24oZXhwb3J0cyk6ImZ1bmN0aW9uIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoWyJleHBvcnRzIl0sbik6bih0LmQzPXQuZDN8fHt9KX0odGhpcyxmdW5jdGlvbih0KXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0LG4pe3JldHVybiB0PG4/LTE6dD5uPzE6dD49bj8wOk5hTn1mdW5jdGlvbiBlKHQpe3ZhciBlO3JldHVybiAxPT09dC5sZW5ndGgmJihlPXQsdD1mdW5jdGlvbih0LHIpe3JldHVybiBuKGUodCkscil9KSx7bGVmdDpmdW5jdGlvbihuLGUscixpKXtmb3IobnVsbD09ciYmKHI9MCksbnVsbD09aSYmKGk9bi5sZW5ndGgpO3I8aTspe3ZhciBvPXIraT4+PjE7dChuW29dLGUpPDA/cj1vKzE6aT1vfXJldHVybiByfSxyaWdodDpmdW5jdGlvbihuLGUscixpKXtmb3IobnVsbD09ciYmKHI9MCksbnVsbD09aSYmKGk9bi5sZW5ndGgpO3I8aTspe3ZhciBvPXIraT4+PjE7dChuW29dLGUpPjA/aT1vOnI9bysxfXJldHVybiByfX19dmFyIHI9ZShuKSxpPXIucmlnaHQsbz1yLmxlZnQ7ZnVuY3Rpb24gYSh0LG4pe3JldHVyblt0LG5dfWZ1bmN0aW9uIHUodCl7cmV0dXJuIG51bGw9PT10P05hTjordH1mdW5jdGlvbiBmKHQsbil7dmFyIGUscixpPXQubGVuZ3RoLG89MCxhPS0xLGY9MCxjPTA7aWYobnVsbD09bilmb3IoOysrYTxpOylpc05hTihlPXUodFthXSkpfHwoYys9KHI9ZS1mKSooZS0oZis9ci8rK28pKSk7ZWxzZSBmb3IoOysrYTxpOylpc05hTihlPXUobih0W2FdLGEsdCkpKXx8KGMrPShyPWUtZikqKGUtKGYrPXIvKytvKSkpO2lmKG8+MSlyZXR1cm4gYy8oby0xKX1mdW5jdGlvbiBjKHQsbil7dmFyIGU9Zih0LG4pO3JldHVybiBlP01hdGguc3FydChlKTplfWZ1bmN0aW9uIHModCxuKXt2YXIgZSxyLGksbz10Lmxlbmd0aCxhPS0xO2lmKG51bGw9PW4pe2Zvcig7KythPG87KWlmKG51bGwhPShlPXRbYV0pJiZlPj1lKWZvcihyPWk9ZTsrK2E8bzspbnVsbCE9KGU9dFthXSkmJihyPmUmJihyPWUpLGk8ZSYmKGk9ZSkpfWVsc2UgZm9yKDsrK2E8bzspaWYobnVsbCE9KGU9bih0W2FdLGEsdCkpJiZlPj1lKWZvcihyPWk9ZTsrK2E8bzspbnVsbCE9KGU9bih0W2FdLGEsdCkpJiYocj5lJiYocj1lKSxpPGUmJihpPWUpKTtyZXR1cm5bcixpXX12YXIgbD1BcnJheS5wcm90b3R5cGUsaD1sLnNsaWNlLGQ9bC5tYXA7ZnVuY3Rpb24gcCh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19ZnVuY3Rpb24gdih0KXtyZXR1cm4gdH1mdW5jdGlvbiBnKHQsbixlKXt0PSt0LG49K24sZT0oaT1hcmd1bWVudHMubGVuZ3RoKTwyPyhuPXQsdD0wLDEpOmk8Mz8xOitlO2Zvcih2YXIgcj0tMSxpPTB8TWF0aC5tYXgoMCxNYXRoLmNlaWwoKG4tdCkvZSkpLG89bmV3IEFycmF5KGkpOysrcjxpOylvW3JdPXQrciplO3JldHVybiBvfXZhciB5PU1hdGguc3FydCg1MCksXz1NYXRoLnNxcnQoMTApLGI9TWF0aC5zcXJ0KDIpO2Z1bmN0aW9uIG0odCxuLGUpe3ZhciByLGksbyxhLHU9LTE7aWYoZT0rZSwodD0rdCk9PT0obj0rbikmJmU+MClyZXR1cm5bdF07aWYoKHI9bjx0KSYmKGk9dCx0PW4sbj1pKSwwPT09KGE9eCh0LG4sZSkpfHwhaXNGaW5pdGUoYSkpcmV0dXJuW107aWYoYT4wKWZvcih0PU1hdGguY2VpbCh0L2EpLG49TWF0aC5mbG9vcihuL2EpLG89bmV3IEFycmF5KGk9TWF0aC5jZWlsKG4tdCsxKSk7Kyt1PGk7KW9bdV09KHQrdSkqYTtlbHNlIGZvcih0PU1hdGguZmxvb3IodCphKSxuPU1hdGguY2VpbChuKmEpLG89bmV3IEFycmF5KGk9TWF0aC5jZWlsKHQtbisxKSk7Kyt1PGk7KW9bdV09KHQtdSkvYTtyZXR1cm4gciYmby5yZXZlcnNlKCksb31mdW5jdGlvbiB4KHQsbixlKXt2YXIgcj0obi10KS9NYXRoLm1heCgwLGUpLGk9TWF0aC5mbG9vcihNYXRoLmxvZyhyKS9NYXRoLkxOMTApLG89ci9NYXRoLnBvdygxMCxpKTtyZXR1cm4gaT49MD8obz49eT8xMDpvPj1fPzU6bz49Yj8yOjEpKk1hdGgucG93KDEwLGkpOi1NYXRoLnBvdygxMCwtaSkvKG8+PXk/MTA6bz49Xz81Om8+PWI/MjoxKX1mdW5jdGlvbiB3KHQsbixlKXt2YXIgcj1NYXRoLmFicyhuLXQpL01hdGgubWF4KDAsZSksaT1NYXRoLnBvdygxMCxNYXRoLmZsb29yKE1hdGgubG9nKHIpL01hdGguTE4xMCkpLG89ci9pO3JldHVybiBvPj15P2kqPTEwOm8+PV8/aSo9NTpvPj1iJiYoaSo9Miksbjx0Py1pOml9ZnVuY3Rpb24gTSh0KXtyZXR1cm4gTWF0aC5jZWlsKE1hdGgubG9nKHQubGVuZ3RoKS9NYXRoLkxOMikrMX1mdW5jdGlvbiBBKHQsbixlKXtpZihudWxsPT1lJiYoZT11KSxyPXQubGVuZ3RoKXtpZigobj0rbik8PTB8fHI8MilyZXR1cm4rZSh0WzBdLDAsdCk7aWYobj49MSlyZXR1cm4rZSh0W3ItMV0sci0xLHQpO3ZhciByLGk9KHItMSkqbixvPU1hdGguZmxvb3IoaSksYT0rZSh0W29dLG8sdCk7cmV0dXJuIGErKCtlKHRbbysxXSxvKzEsdCktYSkqKGktbyl9fWZ1bmN0aW9uIFQodCxuKXt2YXIgZSxyLGk9dC5sZW5ndGgsbz0tMTtpZihudWxsPT1uKXtmb3IoOysrbzxpOylpZihudWxsIT0oZT10W29dKSYmZT49ZSlmb3Iocj1lOysrbzxpOyludWxsIT0oZT10W29dKSYmZT5yJiYocj1lKX1lbHNlIGZvcig7KytvPGk7KWlmKG51bGwhPShlPW4odFtvXSxvLHQpKSYmZT49ZSlmb3Iocj1lOysrbzxpOyludWxsIT0oZT1uKHRbb10sbyx0KSkmJmU+ciYmKHI9ZSk7cmV0dXJuIHJ9ZnVuY3Rpb24gTih0KXtmb3IodmFyIG4sZSxyLGk9dC5sZW5ndGgsbz0tMSxhPTA7KytvPGk7KWErPXRbb10ubGVuZ3RoO2ZvcihlPW5ldyBBcnJheShhKTstLWk+PTA7KWZvcihuPShyPXRbaV0pLmxlbmd0aDstLW4+PTA7KWVbLS1hXT1yW25dO3JldHVybiBlfWZ1bmN0aW9uIFModCxuKXt2YXIgZSxyLGk9dC5sZW5ndGgsbz0tMTtpZihudWxsPT1uKXtmb3IoOysrbzxpOylpZihudWxsIT0oZT10W29dKSYmZT49ZSlmb3Iocj1lOysrbzxpOyludWxsIT0oZT10W29dKSYmcj5lJiYocj1lKX1lbHNlIGZvcig7KytvPGk7KWlmKG51bGwhPShlPW4odFtvXSxvLHQpKSYmZT49ZSlmb3Iocj1lOysrbzxpOyludWxsIT0oZT1uKHRbb10sbyx0KSkmJnI+ZSYmKHI9ZSk7cmV0dXJuIHJ9ZnVuY3Rpb24gRSh0KXtpZighKGk9dC5sZW5ndGgpKXJldHVybltdO2Zvcih2YXIgbj0tMSxlPVModCxrKSxyPW5ldyBBcnJheShlKTsrK248ZTspZm9yKHZhciBpLG89LTEsYT1yW25dPW5ldyBBcnJheShpKTsrK288aTspYVtvXT10W29dW25dO3JldHVybiByfWZ1bmN0aW9uIGsodCl7cmV0dXJuIHQubGVuZ3RofXZhciBDPUFycmF5LnByb3RvdHlwZS5zbGljZTtmdW5jdGlvbiBQKHQpe3JldHVybiB0fXZhciB6PTEsUj0yLEw9MyxEPTQsVT0xZS02O2Z1bmN0aW9uIHEodCl7cmV0dXJuInRyYW5zbGF0ZSgiKyh0Ky41KSsiLDApIn1mdW5jdGlvbiBPKHQpe3JldHVybiJ0cmFuc2xhdGUoMCwiKyh0Ky41KSsiKSJ9ZnVuY3Rpb24gWSgpe3JldHVybiF0aGlzLl9fYXhpc31mdW5jdGlvbiBCKHQsbil7dmFyIGU9W10scj1udWxsLGk9bnVsbCxvPTYsYT02LHU9MyxmPXQ9PT16fHx0PT09RD8tMToxLGM9dD09PUR8fHQ9PT1SPyJ4IjoieSIscz10PT09enx8dD09PUw/cTpPO2Z1bmN0aW9uIGwobCl7dmFyIGg9bnVsbD09cj9uLnRpY2tzP24udGlja3MuYXBwbHkobixlKTpuLmRvbWFpbigpOnIsZD1udWxsPT1pP24udGlja0Zvcm1hdD9uLnRpY2tGb3JtYXQuYXBwbHkobixlKTpQOmkscD1NYXRoLm1heChvLDApK3Usdj1uLnJhbmdlKCksZz0rdlswXSsuNSx5PSt2W3YubGVuZ3RoLTFdKy41LF89KG4uYmFuZHdpZHRoP2Z1bmN0aW9uKHQpe3ZhciBuPU1hdGgubWF4KDAsdC5iYW5kd2lkdGgoKS0xKS8yO3JldHVybiB0LnJvdW5kKCkmJihuPU1hdGgucm91bmQobikpLGZ1bmN0aW9uKGUpe3JldHVybit0KGUpK259fTpmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuK3Qobil9fSkobi5jb3B5KCkpLGI9bC5zZWxlY3Rpb24/bC5zZWxlY3Rpb24oKTpsLG09Yi5zZWxlY3RBbGwoIi5kb21haW4iKS5kYXRhKFtudWxsXSkseD1iLnNlbGVjdEFsbCgiLnRpY2siKS5kYXRhKGgsbikub3JkZXIoKSx3PXguZXhpdCgpLE09eC5lbnRlcigpLmFwcGVuZCgiZyIpLmF0dHIoImNsYXNzIiwidGljayIpLEE9eC5zZWxlY3QoImxpbmUiKSxUPXguc2VsZWN0KCJ0ZXh0Iik7bT1tLm1lcmdlKG0uZW50ZXIoKS5pbnNlcnQoInBhdGgiLCIudGljayIpLmF0dHIoImNsYXNzIiwiZG9tYWluIikuYXR0cigic3Ryb2tlIiwiY3VycmVudENvbG9yIikpLHg9eC5tZXJnZShNKSxBPUEubWVyZ2UoTS5hcHBlbmQoImxpbmUiKS5hdHRyKCJzdHJva2UiLCJjdXJyZW50Q29sb3IiKS5hdHRyKGMrIjIiLGYqbykpLFQ9VC5tZXJnZShNLmFwcGVuZCgidGV4dCIpLmF0dHIoImZpbGwiLCJjdXJyZW50Q29sb3IiKS5hdHRyKGMsZipwKS5hdHRyKCJkeSIsdD09PXo/IjBlbSI6dD09PUw/IjAuNzFlbSI6IjAuMzJlbSIpKSxsIT09YiYmKG09bS50cmFuc2l0aW9uKGwpLHg9eC50cmFuc2l0aW9uKGwpLEE9QS50cmFuc2l0aW9uKGwpLFQ9VC50cmFuc2l0aW9uKGwpLHc9dy50cmFuc2l0aW9uKGwpLmF0dHIoIm9wYWNpdHkiLFUpLmF0dHIoInRyYW5zZm9ybSIsZnVuY3Rpb24odCl7cmV0dXJuIGlzRmluaXRlKHQ9Xyh0KSk/cyh0KTp0aGlzLmdldEF0dHJpYnV0ZSgidHJhbnNmb3JtIil9KSxNLmF0dHIoIm9wYWNpdHkiLFUpLmF0dHIoInRyYW5zZm9ybSIsZnVuY3Rpb24odCl7dmFyIG49dGhpcy5wYXJlbnROb2RlLl9fYXhpcztyZXR1cm4gcyhuJiZpc0Zpbml0ZShuPW4odCkpP246Xyh0KSl9KSksdy5yZW1vdmUoKSxtLmF0dHIoImQiLHQ9PT1EfHx0PT1SP2E/Ik0iK2YqYSsiLCIrZysiSDAuNVYiK3krIkgiK2YqYToiTTAuNSwiK2crIlYiK3k6YT8iTSIrZysiLCIrZiphKyJWMC41SCIreSsiViIrZiphOiJNIitnKyIsMC41SCIreSkseC5hdHRyKCJvcGFjaXR5IiwxKS5hdHRyKCJ0cmFuc2Zvcm0iLGZ1bmN0aW9uKHQpe3JldHVybiBzKF8odCkpfSksQS5hdHRyKGMrIjIiLGYqbyksVC5hdHRyKGMsZipwKS50ZXh0KGQpLGIuZmlsdGVyKFkpLmF0dHIoImZpbGwiLCJub25lIikuYXR0cigiZm9udC1zaXplIiwxMCkuYXR0cigiZm9udC1mYW1pbHkiLCJzYW5zLXNlcmlmIikuYXR0cigidGV4dC1hbmNob3IiLHQ9PT1SPyJzdGFydCI6dD09PUQ/ImVuZCI6Im1pZGRsZSIpLGIuZWFjaChmdW5jdGlvbigpe3RoaXMuX19heGlzPV99KX1yZXR1cm4gbC5zY2FsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj10LGwpOm59LGwudGlja3M9ZnVuY3Rpb24oKXtyZXR1cm4gZT1DLmNhbGwoYXJndW1lbnRzKSxsfSxsLnRpY2tBcmd1bWVudHM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9bnVsbD09dD9bXTpDLmNhbGwodCksbCk6ZS5zbGljZSgpfSxsLnRpY2tWYWx1ZXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9bnVsbD09dD9udWxsOkMuY2FsbCh0KSxsKTpyJiZyLnNsaWNlKCl9LGwudGlja0Zvcm1hdD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT10LGwpOml9LGwudGlja1NpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89YT0rdCxsKTpvfSxsLnRpY2tTaXplSW5uZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89K3QsbCk6b30sbC50aWNrU2l6ZU91dGVyPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPSt0LGwpOmF9LGwudGlja1BhZGRpbmc9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9K3QsbCk6dX0sbH12YXIgRj17dmFsdWU6ZnVuY3Rpb24oKXt9fTtmdW5jdGlvbiBJKCl7Zm9yKHZhciB0LG49MCxlPWFyZ3VtZW50cy5sZW5ndGgscj17fTtuPGU7KytuKXtpZighKHQ9YXJndW1lbnRzW25dKyIiKXx8dCBpbiByKXRocm93IG5ldyBFcnJvcigiaWxsZWdhbCB0eXBlOiAiK3QpO3JbdF09W119cmV0dXJuIG5ldyBIKHIpfWZ1bmN0aW9uIEgodCl7dGhpcy5fPXR9ZnVuY3Rpb24gaih0LG4pe2Zvcih2YXIgZSxyPTAsaT10Lmxlbmd0aDtyPGk7KytyKWlmKChlPXRbcl0pLm5hbWU9PT1uKXJldHVybiBlLnZhbHVlfWZ1bmN0aW9uIFgodCxuLGUpe2Zvcih2YXIgcj0wLGk9dC5sZW5ndGg7cjxpOysrcilpZih0W3JdLm5hbWU9PT1uKXt0W3JdPUYsdD10LnNsaWNlKDAscikuY29uY2F0KHQuc2xpY2UocisxKSk7YnJlYWt9cmV0dXJuIG51bGwhPWUmJnQucHVzaCh7bmFtZTpuLHZhbHVlOmV9KSx0fUgucHJvdG90eXBlPUkucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpILG9uOmZ1bmN0aW9uKHQsbil7dmFyIGUscixpPXRoaXMuXyxvPShyPWksKHQrIiIpLnRyaW0oKS5zcGxpdCgvXnxccysvKS5tYXAoZnVuY3Rpb24odCl7dmFyIG49IiIsZT10LmluZGV4T2YoIi4iKTtpZihlPj0wJiYobj10LnNsaWNlKGUrMSksdD10LnNsaWNlKDAsZSkpLHQmJiFyLmhhc093blByb3BlcnR5KHQpKXRocm93IG5ldyBFcnJvcigidW5rbm93biB0eXBlOiAiK3QpO3JldHVybnt0eXBlOnQsbmFtZTpufX0pKSxhPS0xLHU9by5sZW5ndGg7aWYoIShhcmd1bWVudHMubGVuZ3RoPDIpKXtpZihudWxsIT1uJiYiZnVuY3Rpb24iIT10eXBlb2Ygbil0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgY2FsbGJhY2s6ICIrbik7Zm9yKDsrK2E8dTspaWYoZT0odD1vW2FdKS50eXBlKWlbZV09WChpW2VdLHQubmFtZSxuKTtlbHNlIGlmKG51bGw9PW4pZm9yKGUgaW4gaSlpW2VdPVgoaVtlXSx0Lm5hbWUsbnVsbCk7cmV0dXJuIHRoaXN9Zm9yKDsrK2E8dTspaWYoKGU9KHQ9b1thXSkudHlwZSkmJihlPWooaVtlXSx0Lm5hbWUpKSlyZXR1cm4gZX0sY29weTpmdW5jdGlvbigpe3ZhciB0PXt9LG49dGhpcy5fO2Zvcih2YXIgZSBpbiBuKXRbZV09bltlXS5zbGljZSgpO3JldHVybiBuZXcgSCh0KX0sY2FsbDpmdW5jdGlvbih0LG4pe2lmKChlPWFyZ3VtZW50cy5sZW5ndGgtMik+MClmb3IodmFyIGUscixpPW5ldyBBcnJheShlKSxvPTA7bzxlOysrbylpW29dPWFyZ3VtZW50c1tvKzJdO2lmKCF0aGlzLl8uaGFzT3duUHJvcGVydHkodCkpdGhyb3cgbmV3IEVycm9yKCJ1bmtub3duIHR5cGU6ICIrdCk7Zm9yKG89MCxlPShyPXRoaXMuX1t0XSkubGVuZ3RoO288ZTsrK28pcltvXS52YWx1ZS5hcHBseShuLGkpfSxhcHBseTpmdW5jdGlvbih0LG4sZSl7aWYoIXRoaXMuXy5oYXNPd25Qcm9wZXJ0eSh0KSl0aHJvdyBuZXcgRXJyb3IoInVua25vd24gdHlwZTogIit0KTtmb3IodmFyIHI9dGhpcy5fW3RdLGk9MCxvPXIubGVuZ3RoO2k8bzsrK2kpcltpXS52YWx1ZS5hcHBseShuLGUpfX07dmFyIEc9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiLFY9e3N2ZzoiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLHhodG1sOkcseGxpbms6Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiLHhtbDoiaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIix4bWxuczoiaHR0cDovL3d3dy53My5vcmcvMjAwMC94bWxucy8ifTtmdW5jdGlvbiAkKHQpe3ZhciBuPXQrPSIiLGU9bi5pbmRleE9mKCI6Iik7cmV0dXJuIGU+PTAmJiJ4bWxucyIhPT0obj10LnNsaWNlKDAsZSkpJiYodD10LnNsaWNlKGUrMSkpLFYuaGFzT3duUHJvcGVydHkobik/e3NwYWNlOlZbbl0sbG9jYWw6dH06dH1mdW5jdGlvbiBXKHQpe3ZhciBuPSQodCk7cmV0dXJuKG4ubG9jYWw/ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50TlModC5zcGFjZSx0LmxvY2FsKX19OmZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciBuPXRoaXMub3duZXJEb2N1bWVudCxlPXRoaXMubmFtZXNwYWNlVVJJO3JldHVybiBlPT09RyYmbi5kb2N1bWVudEVsZW1lbnQubmFtZXNwYWNlVVJJPT09Rz9uLmNyZWF0ZUVsZW1lbnQodCk6bi5jcmVhdGVFbGVtZW50TlMoZSx0KX19KShuKX1mdW5jdGlvbiBaKCl7fWZ1bmN0aW9uIFEodCl7cmV0dXJuIG51bGw9PXQ/WjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnF1ZXJ5U2VsZWN0b3IodCl9fWZ1bmN0aW9uIEooKXtyZXR1cm5bXX1mdW5jdGlvbiBLKHQpe3JldHVybiBudWxsPT10P0o6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5xdWVyeVNlbGVjdG9yQWxsKHQpfX12YXIgdHQ9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWF0Y2hlcyh0KX19O2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgZG9jdW1lbnQpe3ZhciBudD1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7aWYoIW50Lm1hdGNoZXMpe3ZhciBldD1udC53ZWJraXRNYXRjaGVzU2VsZWN0b3J8fG50Lm1zTWF0Y2hlc1NlbGVjdG9yfHxudC5tb3pNYXRjaGVzU2VsZWN0b3J8fG50Lm9NYXRjaGVzU2VsZWN0b3I7dHQ9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGV0LmNhbGwodGhpcyx0KX19fX12YXIgcnQ9dHQ7ZnVuY3Rpb24gaXQodCl7cmV0dXJuIG5ldyBBcnJheSh0Lmxlbmd0aCl9ZnVuY3Rpb24gb3QodCxuKXt0aGlzLm93bmVyRG9jdW1lbnQ9dC5vd25lckRvY3VtZW50LHRoaXMubmFtZXNwYWNlVVJJPXQubmFtZXNwYWNlVVJJLHRoaXMuX25leHQ9bnVsbCx0aGlzLl9wYXJlbnQ9dCx0aGlzLl9fZGF0YV9fPW59b3QucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpvdCxhcHBlbmRDaGlsZDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcGFyZW50Lmluc2VydEJlZm9yZSh0LHRoaXMuX25leHQpfSxpbnNlcnRCZWZvcmU6ZnVuY3Rpb24odCxuKXtyZXR1cm4gdGhpcy5fcGFyZW50Lmluc2VydEJlZm9yZSh0LG4pfSxxdWVyeVNlbGVjdG9yOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9wYXJlbnQucXVlcnlTZWxlY3Rvcih0KX0scXVlcnlTZWxlY3RvckFsbDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcGFyZW50LnF1ZXJ5U2VsZWN0b3JBbGwodCl9fTt2YXIgYXQ9IiQiO2Z1bmN0aW9uIHV0KHQsbixlLHIsaSxvKXtmb3IodmFyIGEsdT0wLGY9bi5sZW5ndGgsYz1vLmxlbmd0aDt1PGM7Kyt1KShhPW5bdV0pPyhhLl9fZGF0YV9fPW9bdV0sclt1XT1hKTplW3VdPW5ldyBvdCh0LG9bdV0pO2Zvcig7dTxmOysrdSkoYT1uW3VdKSYmKGlbdV09YSl9ZnVuY3Rpb24gZnQodCxuLGUscixpLG8sYSl7dmFyIHUsZixjLHM9e30sbD1uLmxlbmd0aCxoPW8ubGVuZ3RoLGQ9bmV3IEFycmF5KGwpO2Zvcih1PTA7dTxsOysrdSkoZj1uW3VdKSYmKGRbdV09Yz1hdCthLmNhbGwoZixmLl9fZGF0YV9fLHUsbiksYyBpbiBzP2lbdV09ZjpzW2NdPWYpO2Zvcih1PTA7dTxoOysrdSkoZj1zW2M9YXQrYS5jYWxsKHQsb1t1XSx1LG8pXSk/KHJbdV09ZixmLl9fZGF0YV9fPW9bdV0sc1tjXT1udWxsKTplW3VdPW5ldyBvdCh0LG9bdV0pO2Zvcih1PTA7dTxsOysrdSkoZj1uW3VdKSYmc1tkW3VdXT09PWYmJihpW3VdPWYpfWZ1bmN0aW9uIGN0KHQsbil7cmV0dXJuIHQ8bj8tMTp0Pm4/MTp0Pj1uPzA6TmFOfWZ1bmN0aW9uIHN0KHQpe3JldHVybiB0Lm93bmVyRG9jdW1lbnQmJnQub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlld3x8dC5kb2N1bWVudCYmdHx8dC5kZWZhdWx0Vmlld31mdW5jdGlvbiBsdCh0LG4pe3JldHVybiB0LnN0eWxlLmdldFByb3BlcnR5VmFsdWUobil8fHN0KHQpLmdldENvbXB1dGVkU3R5bGUodCxudWxsKS5nZXRQcm9wZXJ0eVZhbHVlKG4pfWZ1bmN0aW9uIGh0KHQpe3JldHVybiB0LnRyaW0oKS5zcGxpdCgvXnxccysvKX1mdW5jdGlvbiBkdCh0KXtyZXR1cm4gdC5jbGFzc0xpc3R8fG5ldyBwdCh0KX1mdW5jdGlvbiBwdCh0KXt0aGlzLl9ub2RlPXQsdGhpcy5fbmFtZXM9aHQodC5nZXRBdHRyaWJ1dGUoImNsYXNzIil8fCIiKX1mdW5jdGlvbiB2dCh0LG4pe2Zvcih2YXIgZT1kdCh0KSxyPS0xLGk9bi5sZW5ndGg7KytyPGk7KWUuYWRkKG5bcl0pfWZ1bmN0aW9uIGd0KHQsbil7Zm9yKHZhciBlPWR0KHQpLHI9LTEsaT1uLmxlbmd0aDsrK3I8aTspZS5yZW1vdmUobltyXSl9ZnVuY3Rpb24geXQoKXt0aGlzLnRleHRDb250ZW50PSIifWZ1bmN0aW9uIF90KCl7dGhpcy5pbm5lckhUTUw9IiJ9ZnVuY3Rpb24gYnQoKXt0aGlzLm5leHRTaWJsaW5nJiZ0aGlzLnBhcmVudE5vZGUuYXBwZW5kQ2hpbGQodGhpcyl9ZnVuY3Rpb24gbXQoKXt0aGlzLnByZXZpb3VzU2libGluZyYmdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0aGlzLHRoaXMucGFyZW50Tm9kZS5maXJzdENoaWxkKX1mdW5jdGlvbiB4dCgpe3JldHVybiBudWxsfWZ1bmN0aW9uIHd0KCl7dmFyIHQ9dGhpcy5wYXJlbnROb2RlO3QmJnQucmVtb3ZlQ2hpbGQodGhpcyl9ZnVuY3Rpb24gTXQoKXtyZXR1cm4gdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0aGlzLmNsb25lTm9kZSghMSksdGhpcy5uZXh0U2libGluZyl9ZnVuY3Rpb24gQXQoKXtyZXR1cm4gdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0aGlzLmNsb25lTm9kZSghMCksdGhpcy5uZXh0U2libGluZyl9cHQucHJvdG90eXBlPXthZGQ6ZnVuY3Rpb24odCl7dGhpcy5fbmFtZXMuaW5kZXhPZih0KTwwJiYodGhpcy5fbmFtZXMucHVzaCh0KSx0aGlzLl9ub2RlLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuX25hbWVzLmpvaW4oIiAiKSkpfSxyZW1vdmU6ZnVuY3Rpb24odCl7dmFyIG49dGhpcy5fbmFtZXMuaW5kZXhPZih0KTtuPj0wJiYodGhpcy5fbmFtZXMuc3BsaWNlKG4sMSksdGhpcy5fbm9kZS5zZXRBdHRyaWJ1dGUoImNsYXNzIix0aGlzLl9uYW1lcy5qb2luKCIgIikpKX0sY29udGFpbnM6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX25hbWVzLmluZGV4T2YodCk+PTB9fTt2YXIgVHQ9e307KHQuZXZlbnQ9bnVsbCwidW5kZWZpbmVkIiE9dHlwZW9mIGRvY3VtZW50KSYmKCJvbm1vdXNlZW50ZXIiaW4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHwoVHQ9e21vdXNlZW50ZXI6Im1vdXNlb3ZlciIsbW91c2VsZWF2ZToibW91c2VvdXQifSkpO2Z1bmN0aW9uIE50KHQsbixlKXtyZXR1cm4gdD1TdCh0LG4sZSksZnVuY3Rpb24obil7dmFyIGU9bi5yZWxhdGVkVGFyZ2V0O2UmJihlPT09dGhpc3x8OCZlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHRoaXMpKXx8dC5jYWxsKHRoaXMsbil9fWZ1bmN0aW9uIFN0KG4sZSxyKXtyZXR1cm4gZnVuY3Rpb24oaSl7dmFyIG89dC5ldmVudDt0LmV2ZW50PWk7dHJ5e24uY2FsbCh0aGlzLHRoaXMuX19kYXRhX18sZSxyKX1maW5hbGx5e3QuZXZlbnQ9b319fWZ1bmN0aW9uIEV0KHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciBuPXRoaXMuX19vbjtpZihuKXtmb3IodmFyIGUscj0wLGk9LTEsbz1uLmxlbmd0aDtyPG87KytyKWU9bltyXSx0LnR5cGUmJmUudHlwZSE9PXQudHlwZXx8ZS5uYW1lIT09dC5uYW1lP25bKytpXT1lOnRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihlLnR5cGUsZS5saXN0ZW5lcixlLmNhcHR1cmUpOysraT9uLmxlbmd0aD1pOmRlbGV0ZSB0aGlzLl9fb259fX1mdW5jdGlvbiBrdCh0LG4sZSl7dmFyIHI9VHQuaGFzT3duUHJvcGVydHkodC50eXBlKT9OdDpTdDtyZXR1cm4gZnVuY3Rpb24oaSxvLGEpe3ZhciB1LGY9dGhpcy5fX29uLGM9cihuLG8sYSk7aWYoZilmb3IodmFyIHM9MCxsPWYubGVuZ3RoO3M8bDsrK3MpaWYoKHU9ZltzXSkudHlwZT09PXQudHlwZSYmdS5uYW1lPT09dC5uYW1lKXJldHVybiB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIodS50eXBlLHUubGlzdGVuZXIsdS5jYXB0dXJlKSx0aGlzLmFkZEV2ZW50TGlzdGVuZXIodS50eXBlLHUubGlzdGVuZXI9Yyx1LmNhcHR1cmU9ZSksdm9pZCh1LnZhbHVlPW4pO3RoaXMuYWRkRXZlbnRMaXN0ZW5lcih0LnR5cGUsYyxlKSx1PXt0eXBlOnQudHlwZSxuYW1lOnQubmFtZSx2YWx1ZTpuLGxpc3RlbmVyOmMsY2FwdHVyZTplfSxmP2YucHVzaCh1KTp0aGlzLl9fb249W3VdfX1mdW5jdGlvbiBDdChuLGUscixpKXt2YXIgbz10LmV2ZW50O24uc291cmNlRXZlbnQ9dC5ldmVudCx0LmV2ZW50PW47dHJ5e3JldHVybiBlLmFwcGx5KHIsaSl9ZmluYWxseXt0LmV2ZW50PW99fWZ1bmN0aW9uIFB0KHQsbixlKXt2YXIgcj1zdCh0KSxpPXIuQ3VzdG9tRXZlbnQ7ImZ1bmN0aW9uIj09dHlwZW9mIGk/aT1uZXcgaShuLGUpOihpPXIuZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksZT8oaS5pbml0RXZlbnQobixlLmJ1YmJsZXMsZS5jYW5jZWxhYmxlKSxpLmRldGFpbD1lLmRldGFpbCk6aS5pbml0RXZlbnQobiwhMSwhMSkpLHQuZGlzcGF0Y2hFdmVudChpKX12YXIgenQ9W251bGxdO2Z1bmN0aW9uIFJ0KHQsbil7dGhpcy5fZ3JvdXBzPXQsdGhpcy5fcGFyZW50cz1ufWZ1bmN0aW9uIEx0KCl7cmV0dXJuIG5ldyBSdChbW2RvY3VtZW50LmRvY3VtZW50RWxlbWVudF1dLHp0KX1mdW5jdGlvbiBEdCh0KXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQ/bmV3IFJ0KFtbZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih0KV1dLFtkb2N1bWVudC5kb2N1bWVudEVsZW1lbnRdKTpuZXcgUnQoW1t0XV0senQpfVJ0LnByb3RvdHlwZT1MdC5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOlJ0LHNlbGVjdDpmdW5jdGlvbih0KXsiZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9USh0KSk7Zm9yKHZhciBuPXRoaXMuX2dyb3VwcyxlPW4ubGVuZ3RoLHI9bmV3IEFycmF5KGUpLGk9MDtpPGU7KytpKWZvcih2YXIgbyxhLHU9bltpXSxmPXUubGVuZ3RoLGM9cltpXT1uZXcgQXJyYXkoZikscz0wO3M8ZjsrK3MpKG89dVtzXSkmJihhPXQuY2FsbChvLG8uX19kYXRhX18scyx1KSkmJigiX19kYXRhX18iaW4gbyYmKGEuX19kYXRhX189by5fX2RhdGFfXyksY1tzXT1hKTtyZXR1cm4gbmV3IFJ0KHIsdGhpcy5fcGFyZW50cyl9LHNlbGVjdEFsbDpmdW5jdGlvbih0KXsiZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9Syh0KSk7Zm9yKHZhciBuPXRoaXMuX2dyb3VwcyxlPW4ubGVuZ3RoLHI9W10saT1bXSxvPTA7bzxlOysrbylmb3IodmFyIGEsdT1uW29dLGY9dS5sZW5ndGgsYz0wO2M8ZjsrK2MpKGE9dVtjXSkmJihyLnB1c2godC5jYWxsKGEsYS5fX2RhdGFfXyxjLHUpKSxpLnB1c2goYSkpO3JldHVybiBuZXcgUnQocixpKX0sZmlsdGVyOmZ1bmN0aW9uKHQpeyJmdW5jdGlvbiIhPXR5cGVvZiB0JiYodD1ydCh0KSk7Zm9yKHZhciBuPXRoaXMuX2dyb3VwcyxlPW4ubGVuZ3RoLHI9bmV3IEFycmF5KGUpLGk9MDtpPGU7KytpKWZvcih2YXIgbyxhPW5baV0sdT1hLmxlbmd0aCxmPXJbaV09W10sYz0wO2M8dTsrK2MpKG89YVtjXSkmJnQuY2FsbChvLG8uX19kYXRhX18sYyxhKSYmZi5wdXNoKG8pO3JldHVybiBuZXcgUnQocix0aGlzLl9wYXJlbnRzKX0sZGF0YTpmdW5jdGlvbih0LG4pe2lmKCF0KXJldHVybiBwPW5ldyBBcnJheSh0aGlzLnNpemUoKSkscz0tMSx0aGlzLmVhY2goZnVuY3Rpb24odCl7cFsrK3NdPXR9KSxwO3ZhciBlLHI9bj9mdDp1dCxpPXRoaXMuX3BhcmVudHMsbz10aGlzLl9ncm91cHM7ImZ1bmN0aW9uIiE9dHlwZW9mIHQmJihlPXQsdD1mdW5jdGlvbigpe3JldHVybiBlfSk7Zm9yKHZhciBhPW8ubGVuZ3RoLHU9bmV3IEFycmF5KGEpLGY9bmV3IEFycmF5KGEpLGM9bmV3IEFycmF5KGEpLHM9MDtzPGE7KytzKXt2YXIgbD1pW3NdLGg9b1tzXSxkPWgubGVuZ3RoLHA9dC5jYWxsKGwsbCYmbC5fX2RhdGFfXyxzLGkpLHY9cC5sZW5ndGgsZz1mW3NdPW5ldyBBcnJheSh2KSx5PXVbc109bmV3IEFycmF5KHYpO3IobCxoLGcseSxjW3NdPW5ldyBBcnJheShkKSxwLG4pO2Zvcih2YXIgXyxiLG09MCx4PTA7bTx2OysrbSlpZihfPWdbbV0pe2ZvcihtPj14JiYoeD1tKzEpOyEoYj15W3hdKSYmKyt4PHY7KTtfLl9uZXh0PWJ8fG51bGx9fXJldHVybih1PW5ldyBSdCh1LGkpKS5fZW50ZXI9Zix1Ll9leGl0PWMsdX0sZW50ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFJ0KHRoaXMuX2VudGVyfHx0aGlzLl9ncm91cHMubWFwKGl0KSx0aGlzLl9wYXJlbnRzKX0sZXhpdDpmdW5jdGlvbigpe3JldHVybiBuZXcgUnQodGhpcy5fZXhpdHx8dGhpcy5fZ3JvdXBzLm1hcChpdCksdGhpcy5fcGFyZW50cyl9LG1lcmdlOmZ1bmN0aW9uKHQpe2Zvcih2YXIgbj10aGlzLl9ncm91cHMsZT10Ll9ncm91cHMscj1uLmxlbmd0aCxpPWUubGVuZ3RoLG89TWF0aC5taW4ocixpKSxhPW5ldyBBcnJheShyKSx1PTA7dTxvOysrdSlmb3IodmFyIGYsYz1uW3VdLHM9ZVt1XSxsPWMubGVuZ3RoLGg9YVt1XT1uZXcgQXJyYXkobCksZD0wO2Q8bDsrK2QpKGY9Y1tkXXx8c1tkXSkmJihoW2RdPWYpO2Zvcig7dTxyOysrdSlhW3VdPW5bdV07cmV0dXJuIG5ldyBSdChhLHRoaXMuX3BhcmVudHMpfSxvcmRlcjpmdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLl9ncm91cHMsbj0tMSxlPXQubGVuZ3RoOysrbjxlOylmb3IodmFyIHIsaT10W25dLG89aS5sZW5ndGgtMSxhPWlbb107LS1vPj0wOykocj1pW29dKSYmKGEmJmEhPT1yLm5leHRTaWJsaW5nJiZhLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHIsYSksYT1yKTtyZXR1cm4gdGhpc30sc29ydDpmdW5jdGlvbih0KXtmdW5jdGlvbiBuKG4sZSl7cmV0dXJuIG4mJmU/dChuLl9fZGF0YV9fLGUuX19kYXRhX18pOiFuLSFlfXR8fCh0PWN0KTtmb3IodmFyIGU9dGhpcy5fZ3JvdXBzLHI9ZS5sZW5ndGgsaT1uZXcgQXJyYXkociksbz0wO288cjsrK28pe2Zvcih2YXIgYSx1PWVbb10sZj11Lmxlbmd0aCxjPWlbb109bmV3IEFycmF5KGYpLHM9MDtzPGY7KytzKShhPXVbc10pJiYoY1tzXT1hKTtjLnNvcnQobil9cmV0dXJuIG5ldyBSdChpLHRoaXMuX3BhcmVudHMpLm9yZGVyKCl9LGNhbGw6ZnVuY3Rpb24oKXt2YXIgdD1hcmd1bWVudHNbMF07cmV0dXJuIGFyZ3VtZW50c1swXT10aGlzLHQuYXBwbHkobnVsbCxhcmd1bWVudHMpLHRoaXN9LG5vZGVzOmZ1bmN0aW9uKCl7dmFyIHQ9bmV3IEFycmF5KHRoaXMuc2l6ZSgpKSxuPS0xO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt0Wysrbl09dGhpc30pLHR9LG5vZGU6ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcy5fZ3JvdXBzLG49MCxlPXQubGVuZ3RoO248ZTsrK24pZm9yKHZhciByPXRbbl0saT0wLG89ci5sZW5ndGg7aTxvOysraSl7dmFyIGE9cltpXTtpZihhKXJldHVybiBhfXJldHVybiBudWxsfSxzaXplOmZ1bmN0aW9uKCl7dmFyIHQ9MDtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Kyt0fSksdH0sZW1wdHk6ZnVuY3Rpb24oKXtyZXR1cm4hdGhpcy5ub2RlKCl9LGVhY2g6ZnVuY3Rpb24odCl7Zm9yKHZhciBuPXRoaXMuX2dyb3VwcyxlPTAscj1uLmxlbmd0aDtlPHI7KytlKWZvcih2YXIgaSxvPW5bZV0sYT0wLHU9by5sZW5ndGg7YTx1OysrYSkoaT1vW2FdKSYmdC5jYWxsKGksaS5fX2RhdGFfXyxhLG8pO3JldHVybiB0aGlzfSxhdHRyOmZ1bmN0aW9uKHQsbil7dmFyIGU9JCh0KTtpZihhcmd1bWVudHMubGVuZ3RoPDIpe3ZhciByPXRoaXMubm9kZSgpO3JldHVybiBlLmxvY2FsP3IuZ2V0QXR0cmlidXRlTlMoZS5zcGFjZSxlLmxvY2FsKTpyLmdldEF0dHJpYnV0ZShlKX1yZXR1cm4gdGhpcy5lYWNoKChudWxsPT1uP2UubG9jYWw/ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyh0LnNwYWNlLHQubG9jYWwpfX06ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5yZW1vdmVBdHRyaWJ1dGUodCl9fToiZnVuY3Rpb24iPT10eXBlb2Ygbj9lLmxvY2FsP2Z1bmN0aW9uKHQsbil7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGU9bi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7bnVsbD09ZT90aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKHQuc3BhY2UsdC5sb2NhbCk6dGhpcy5zZXRBdHRyaWJ1dGVOUyh0LnNwYWNlLHQubG9jYWwsZSl9fTpmdW5jdGlvbih0LG4pe3JldHVybiBmdW5jdGlvbigpe3ZhciBlPW4uYXBwbHkodGhpcyxhcmd1bWVudHMpO251bGw9PWU/dGhpcy5yZW1vdmVBdHRyaWJ1dGUodCk6dGhpcy5zZXRBdHRyaWJ1dGUodCxlKX19OmUubG9jYWw/ZnVuY3Rpb24odCxuKXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnNldEF0dHJpYnV0ZU5TKHQuc3BhY2UsdC5sb2NhbCxuKX19OmZ1bmN0aW9uKHQsbil7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5zZXRBdHRyaWJ1dGUodCxuKX19KShlLG4pKX0sc3R5bGU6ZnVuY3Rpb24odCxuLGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPjE/dGhpcy5lYWNoKChudWxsPT1uP2Z1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3RoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkodCl9fToiZnVuY3Rpb24iPT10eXBlb2Ygbj9mdW5jdGlvbih0LG4sZSl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHI9bi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7bnVsbD09cj90aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KHQpOnRoaXMuc3R5bGUuc2V0UHJvcGVydHkodCxyLGUpfX06ZnVuY3Rpb24odCxuLGUpe3JldHVybiBmdW5jdGlvbigpe3RoaXMuc3R5bGUuc2V0UHJvcGVydHkodCxuLGUpfX0pKHQsbixudWxsPT1lPyIiOmUpKTpsdCh0aGlzLm5vZGUoKSx0KX0scHJvcGVydHk6ZnVuY3Rpb24odCxuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD4xP3RoaXMuZWFjaCgobnVsbD09bj9mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXtkZWxldGUgdGhpc1t0XX19OiJmdW5jdGlvbiI9PXR5cGVvZiBuP2Z1bmN0aW9uKHQsbil7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGU9bi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7bnVsbD09ZT9kZWxldGUgdGhpc1t0XTp0aGlzW3RdPWV9fTpmdW5jdGlvbih0LG4pe3JldHVybiBmdW5jdGlvbigpe3RoaXNbdF09bn19KSh0LG4pKTp0aGlzLm5vZGUoKVt0XX0sY2xhc3NlZDpmdW5jdGlvbih0LG4pe3ZhciBlPWh0KHQrIiIpO2lmKGFyZ3VtZW50cy5sZW5ndGg8Mil7Zm9yKHZhciByPWR0KHRoaXMubm9kZSgpKSxpPS0xLG89ZS5sZW5ndGg7KytpPG87KWlmKCFyLmNvbnRhaW5zKGVbaV0pKXJldHVybiExO3JldHVybiEwfXJldHVybiB0aGlzLmVhY2goKCJmdW5jdGlvbiI9PXR5cGVvZiBuP2Z1bmN0aW9uKHQsbil7cmV0dXJuIGZ1bmN0aW9uKCl7KG4uYXBwbHkodGhpcyxhcmd1bWVudHMpP3Z0Omd0KSh0aGlzLHQpfX06bj9mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXt2dCh0aGlzLHQpfX06ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7Z3QodGhpcyx0KX19KShlLG4pKX0sdGV4dDpmdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90aGlzLmVhY2gobnVsbD09dD95dDooImZ1bmN0aW9uIj09dHlwZW9mIHQ/ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG49dC5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy50ZXh0Q29udGVudD1udWxsPT1uPyIiOm59fTpmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnRleHRDb250ZW50PXR9fSkodCkpOnRoaXMubm9kZSgpLnRleHRDb250ZW50fSxodG1sOmZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3RoaXMuZWFjaChudWxsPT10P190OigiZnVuY3Rpb24iPT10eXBlb2YgdD9mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbj10LmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmlubmVySFRNTD1udWxsPT1uPyIiOm59fTpmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLmlubmVySFRNTD10fX0pKHQpKTp0aGlzLm5vZGUoKS5pbm5lckhUTUx9LHJhaXNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWFjaChidCl9LGxvd2VyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWFjaChtdCl9LGFwcGVuZDpmdW5jdGlvbih0KXt2YXIgbj0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlcodCk7cmV0dXJuIHRoaXMuc2VsZWN0KGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYXBwZW5kQ2hpbGQobi5hcHBseSh0aGlzLGFyZ3VtZW50cykpfSl9LGluc2VydDpmdW5jdGlvbih0LG4pe3ZhciBlPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6Vyh0KSxyPW51bGw9PW4/eHQ6ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpRKG4pO3JldHVybiB0aGlzLnNlbGVjdChmdW5jdGlvbigpe3JldHVybiB0aGlzLmluc2VydEJlZm9yZShlLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxyLmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8bnVsbCl9KX0scmVtb3ZlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWFjaCh3dCl9LGNsb25lOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnNlbGVjdCh0P0F0Ok10KX0sZGF0dW06ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dGhpcy5wcm9wZXJ0eSgiX19kYXRhX18iLHQpOnRoaXMubm9kZSgpLl9fZGF0YV9ffSxvbjpmdW5jdGlvbih0LG4sZSl7dmFyIHIsaSxvPWZ1bmN0aW9uKHQpe3JldHVybiB0LnRyaW0oKS5zcGxpdCgvXnxccysvKS5tYXAoZnVuY3Rpb24odCl7dmFyIG49IiIsZT10LmluZGV4T2YoIi4iKTtyZXR1cm4gZT49MCYmKG49dC5zbGljZShlKzEpLHQ9dC5zbGljZSgwLGUpKSx7dHlwZTp0LG5hbWU6bn19KX0odCsiIiksYT1vLmxlbmd0aDtpZighKGFyZ3VtZW50cy5sZW5ndGg8Mikpe2Zvcih1PW4/a3Q6RXQsbnVsbD09ZSYmKGU9ITEpLHI9MDtyPGE7KytyKXRoaXMuZWFjaCh1KG9bcl0sbixlKSk7cmV0dXJuIHRoaXN9dmFyIHU9dGhpcy5ub2RlKCkuX19vbjtpZih1KWZvcih2YXIgZixjPTAscz11Lmxlbmd0aDtjPHM7KytjKWZvcihyPTAsZj11W2NdO3I8YTsrK3IpaWYoKGk9b1tyXSkudHlwZT09PWYudHlwZSYmaS5uYW1lPT09Zi5uYW1lKXJldHVybiBmLnZhbHVlfSxkaXNwYXRjaDpmdW5jdGlvbih0LG4pe3JldHVybiB0aGlzLmVhY2goKCJmdW5jdGlvbiI9PXR5cGVvZiBuP2Z1bmN0aW9uKHQsbil7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIFB0KHRoaXMsdCxuLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl9fTpmdW5jdGlvbih0LG4pe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBQdCh0aGlzLHQsbil9fSkodCxuKSl9fTt2YXIgVXQ9MDtmdW5jdGlvbiBxdCgpe3JldHVybiBuZXcgT3R9ZnVuY3Rpb24gT3QoKXt0aGlzLl89IkAiKygrK1V0KS50b1N0cmluZygzNil9ZnVuY3Rpb24gWXQoKXtmb3IodmFyIG4sZT10LmV2ZW50O249ZS5zb3VyY2VFdmVudDspZT1uO3JldHVybiBlfWZ1bmN0aW9uIEJ0KHQsbil7dmFyIGU9dC5vd25lclNWR0VsZW1lbnR8fHQ7aWYoZS5jcmVhdGVTVkdQb2ludCl7dmFyIHI9ZS5jcmVhdGVTVkdQb2ludCgpO3JldHVybiByLng9bi5jbGllbnRYLHIueT1uLmNsaWVudFksWyhyPXIubWF0cml4VHJhbnNmb3JtKHQuZ2V0U2NyZWVuQ1RNKCkuaW52ZXJzZSgpKSkueCxyLnldfXZhciBpPXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7cmV0dXJuW24uY2xpZW50WC1pLmxlZnQtdC5jbGllbnRMZWZ0LG4uY2xpZW50WS1pLnRvcC10LmNsaWVudFRvcF19ZnVuY3Rpb24gRnQodCl7dmFyIG49WXQoKTtyZXR1cm4gbi5jaGFuZ2VkVG91Y2hlcyYmKG49bi5jaGFuZ2VkVG91Y2hlc1swXSksQnQodCxuKX1mdW5jdGlvbiBJdCh0LG4sZSl7YXJndW1lbnRzLmxlbmd0aDwzJiYoZT1uLG49WXQoKS5jaGFuZ2VkVG91Y2hlcyk7Zm9yKHZhciByLGk9MCxvPW4/bi5sZW5ndGg6MDtpPG87KytpKWlmKChyPW5baV0pLmlkZW50aWZpZXI9PT1lKXJldHVybiBCdCh0LHIpO3JldHVybiBudWxsfWZ1bmN0aW9uIEh0KCl7dC5ldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKX1mdW5jdGlvbiBqdCgpe3QuZXZlbnQucHJldmVudERlZmF1bHQoKSx0LmV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpfWZ1bmN0aW9uIFh0KHQpe3ZhciBuPXQuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LGU9RHQodCkub24oImRyYWdzdGFydC5kcmFnIixqdCwhMCk7Im9uc2VsZWN0c3RhcnQiaW4gbj9lLm9uKCJzZWxlY3RzdGFydC5kcmFnIixqdCwhMCk6KG4uX19ub3NlbGVjdD1uLnN0eWxlLk1velVzZXJTZWxlY3Qsbi5zdHlsZS5Nb3pVc2VyU2VsZWN0PSJub25lIil9ZnVuY3Rpb24gR3QodCxuKXt2YXIgZT10LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudCxyPUR0KHQpLm9uKCJkcmFnc3RhcnQuZHJhZyIsbnVsbCk7biYmKHIub24oImNsaWNrLmRyYWciLGp0LCEwKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ci5vbigiY2xpY2suZHJhZyIsbnVsbCl9LDApKSwib25zZWxlY3RzdGFydCJpbiBlP3Iub24oInNlbGVjdHN0YXJ0LmRyYWciLG51bGwpOihlLnN0eWxlLk1velVzZXJTZWxlY3Q9ZS5fX25vc2VsZWN0LGRlbGV0ZSBlLl9fbm9zZWxlY3QpfWZ1bmN0aW9uIFZ0KHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fX1mdW5jdGlvbiAkdCh0LG4sZSxyLGksbyxhLHUsZixjKXt0aGlzLnRhcmdldD10LHRoaXMudHlwZT1uLHRoaXMuc3ViamVjdD1lLHRoaXMuaWRlbnRpZmllcj1yLHRoaXMuYWN0aXZlPWksdGhpcy54PW8sdGhpcy55PWEsdGhpcy5keD11LHRoaXMuZHk9Zix0aGlzLl89Y31mdW5jdGlvbiBXdCgpe3JldHVybiF0LmV2ZW50LmJ1dHRvbn1mdW5jdGlvbiBadCgpe3JldHVybiB0aGlzLnBhcmVudE5vZGV9ZnVuY3Rpb24gUXQobil7cmV0dXJuIG51bGw9PW4/e3g6dC5ldmVudC54LHk6dC5ldmVudC55fTpufWZ1bmN0aW9uIEp0KCl7cmV0dXJuIm9udG91Y2hzdGFydCJpbiB0aGlzfWZ1bmN0aW9uIEt0KHQsbixlKXt0LnByb3RvdHlwZT1uLnByb3RvdHlwZT1lLGUuY29uc3RydWN0b3I9dH1mdW5jdGlvbiB0bih0LG4pe3ZhciBlPU9iamVjdC5jcmVhdGUodC5wcm90b3R5cGUpO2Zvcih2YXIgciBpbiBuKWVbcl09bltyXTtyZXR1cm4gZX1mdW5jdGlvbiBubigpe31PdC5wcm90b3R5cGU9cXQucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpPdCxnZXQ6ZnVuY3Rpb24odCl7Zm9yKHZhciBuPXRoaXMuXzshKG4gaW4gdCk7KWlmKCEodD10LnBhcmVudE5vZGUpKXJldHVybjtyZXR1cm4gdFtuXX0sc2V0OmZ1bmN0aW9uKHQsbil7cmV0dXJuIHRbdGhpcy5fXT1ufSxyZW1vdmU6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuXyBpbiB0JiZkZWxldGUgdFt0aGlzLl9dfSx0b1N0cmluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLl99fSwkdC5wcm90b3R5cGUub249ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl8ub24uYXBwbHkodGhpcy5fLGFyZ3VtZW50cyk7cmV0dXJuIHQ9PT10aGlzLl8/dGhpczp0fTt2YXIgZW49IlxccyooWystXT9cXGQrKVxccyoiLHJuPSJcXHMqKFsrLV0/XFxkKlxcLj9cXGQrKD86W2VFXVsrLV0/XFxkKyk/KVxccyoiLG9uPSJcXHMqKFsrLV0/XFxkKlxcLj9cXGQrKD86W2VFXVsrLV0/XFxkKyk/KSVcXHMqIixhbj0vXiMoWzAtOWEtZl17M30pJC8sdW49L14jKFswLTlhLWZdezZ9KSQvLGZuPW5ldyBSZWdFeHAoIl5yZ2JcXCgiK1tlbixlbixlbl0rIlxcKSQiKSxjbj1uZXcgUmVnRXhwKCJecmdiXFwoIitbb24sb24sb25dKyJcXCkkIiksc249bmV3IFJlZ0V4cCgiXnJnYmFcXCgiK1tlbixlbixlbixybl0rIlxcKSQiKSxsbj1uZXcgUmVnRXhwKCJecmdiYVxcKCIrW29uLG9uLG9uLHJuXSsiXFwpJCIpLGhuPW5ldyBSZWdFeHAoIl5oc2xcXCgiK1tybixvbixvbl0rIlxcKSQiKSxkbj1uZXcgUmVnRXhwKCJeaHNsYVxcKCIrW3JuLG9uLG9uLHJuXSsiXFwpJCIpLHBuPXthbGljZWJsdWU6MTU3OTIzODMsYW50aXF1ZXdoaXRlOjE2NDQ0Mzc1LGFxdWE6NjU1MzUsYXF1YW1hcmluZTo4Mzg4NTY0LGF6dXJlOjE1Nzk0MTc1LGJlaWdlOjE2MTE5MjYwLGJpc3F1ZToxNjc3MDI0NCxibGFjazowLGJsYW5jaGVkYWxtb25kOjE2NzcyMDQ1LGJsdWU6MjU1LGJsdWV2aW9sZXQ6OTA1NTIwMixicm93bjoxMDgyNDIzNCxidXJseXdvb2Q6MTQ1OTYyMzEsY2FkZXRibHVlOjYyNjY1MjgsY2hhcnRyZXVzZTo4Mzg4MzUyLGNob2NvbGF0ZToxMzc4OTQ3MCxjb3JhbDoxNjc0NDI3Mixjb3JuZmxvd2VyYmx1ZTo2NTkxOTgxLGNvcm5zaWxrOjE2Nzc1Mzg4LGNyaW1zb246MTQ0MjMxMDAsY3lhbjo2NTUzNSxkYXJrYmx1ZToxMzksZGFya2N5YW46MzU3MjMsZGFya2dvbGRlbnJvZDoxMjA5MjkzOSxkYXJrZ3JheToxMTExOTAxNyxkYXJrZ3JlZW46MjU2MDAsZGFya2dyZXk6MTExMTkwMTcsZGFya2toYWtpOjEyNDMzMjU5LGRhcmttYWdlbnRhOjkxMDk2NDMsZGFya29saXZlZ3JlZW46NTU5Nzk5OSxkYXJrb3JhbmdlOjE2NzQ3NTIwLGRhcmtvcmNoaWQ6MTAwNDAwMTIsZGFya3JlZDo5MTA5NTA0LGRhcmtzYWxtb246MTUzMDg0MTAsZGFya3NlYWdyZWVuOjk0MTk5MTksZGFya3NsYXRlYmx1ZTo0NzM0MzQ3LGRhcmtzbGF0ZWdyYXk6MzEwMDQ5NSxkYXJrc2xhdGVncmV5OjMxMDA0OTUsZGFya3R1cnF1b2lzZTo1Mjk0NSxkYXJrdmlvbGV0Ojk2OTk1MzksZGVlcHBpbms6MTY3MTY5NDcsZGVlcHNreWJsdWU6NDkxNTEsZGltZ3JheTo2OTA4MjY1LGRpbWdyZXk6NjkwODI2NSxkb2RnZXJibHVlOjIwMDMxOTksZmlyZWJyaWNrOjExNjc0MTQ2LGZsb3JhbHdoaXRlOjE2Nzc1OTIwLGZvcmVzdGdyZWVuOjIyNjM4NDIsZnVjaHNpYToxNjcxMTkzNSxnYWluc2Jvcm86MTQ0NzQ0NjAsZ2hvc3R3aGl0ZToxNjMxNjY3MSxnb2xkOjE2NzY2NzIwLGdvbGRlbnJvZDoxNDMyOTEyMCxncmF5Ojg0MjE1MDQsZ3JlZW46MzI3NjgsZ3JlZW55ZWxsb3c6MTE0MDMwNTUsZ3JleTo4NDIxNTA0LGhvbmV5ZGV3OjE1Nzk0MTYwLGhvdHBpbms6MTY3Mzg3NDAsaW5kaWFucmVkOjEzNDU4NTI0LGluZGlnbzo0OTE1MzMwLGl2b3J5OjE2Nzc3MjAwLGtoYWtpOjE1Nzg3NjYwLGxhdmVuZGVyOjE1MTMyNDEwLGxhdmVuZGVyYmx1c2g6MTY3NzMzNjUsbGF3bmdyZWVuOjgxOTA5NzYsbGVtb25jaGlmZm9uOjE2Nzc1ODg1LGxpZ2h0Ymx1ZToxMTM5MzI1NCxsaWdodGNvcmFsOjE1NzYxNTM2LGxpZ2h0Y3lhbjoxNDc0NTU5OSxsaWdodGdvbGRlbnJvZHllbGxvdzoxNjQ0ODIxMCxsaWdodGdyYXk6MTM4ODIzMjMsbGlnaHRncmVlbjo5NDk4MjU2LGxpZ2h0Z3JleToxMzg4MjMyMyxsaWdodHBpbms6MTY3NTg0NjUsbGlnaHRzYWxtb246MTY3NTI3NjIsbGlnaHRzZWFncmVlbjoyMTQyODkwLGxpZ2h0c2t5Ymx1ZTo4OTAwMzQ2LGxpZ2h0c2xhdGVncmF5Ojc4MzM3NTMsbGlnaHRzbGF0ZWdyZXk6NzgzMzc1MyxsaWdodHN0ZWVsYmx1ZToxMTU4NDczNCxsaWdodHllbGxvdzoxNjc3NzE4NCxsaW1lOjY1MjgwLGxpbWVncmVlbjozMzI5MzMwLGxpbmVuOjE2NDQ1NjcwLG1hZ2VudGE6MTY3MTE5MzUsbWFyb29uOjgzODg2MDgsbWVkaXVtYXF1YW1hcmluZTo2NzM3MzIyLG1lZGl1bWJsdWU6MjA1LG1lZGl1bW9yY2hpZDoxMjIxMTY2NyxtZWRpdW1wdXJwbGU6OTY2MjY4MyxtZWRpdW1zZWFncmVlbjozOTc4MDk3LG1lZGl1bXNsYXRlYmx1ZTo4MDg3NzkwLG1lZGl1bXNwcmluZ2dyZWVuOjY0MTU0LG1lZGl1bXR1cnF1b2lzZTo0NzcyMzAwLG1lZGl1bXZpb2xldHJlZDoxMzA0NzE3MyxtaWRuaWdodGJsdWU6MTY0NDkxMixtaW50Y3JlYW06MTYxMjE4NTAsbWlzdHlyb3NlOjE2NzcwMjczLG1vY2Nhc2luOjE2NzcwMjI5LG5hdmFqb3doaXRlOjE2NzY4Njg1LG5hdnk6MTI4LG9sZGxhY2U6MTY2NDM1NTgsb2xpdmU6ODQyMTM3NixvbGl2ZWRyYWI6NzA0ODczOSxvcmFuZ2U6MTY3NTM5MjAsb3JhbmdlcmVkOjE2NzI5MzQ0LG9yY2hpZDoxNDMxNTczNCxwYWxlZ29sZGVucm9kOjE1NjU3MTMwLHBhbGVncmVlbjoxMDAyNTg4MCxwYWxldHVycXVvaXNlOjExNTI5OTY2LHBhbGV2aW9sZXRyZWQ6MTQzODEyMDMscGFwYXlhd2hpcDoxNjc3MzA3NyxwZWFjaHB1ZmY6MTY3Njc2NzMscGVydToxMzQ2ODk5MSxwaW5rOjE2NzYxMDM1LHBsdW06MTQ1MjQ2MzcscG93ZGVyYmx1ZToxMTU5MTkxMCxwdXJwbGU6ODM4ODczNixyZWJlY2NhcHVycGxlOjY2OTc4ODEscmVkOjE2NzExNjgwLHJvc3licm93bjoxMjM1NzUxOSxyb3lhbGJsdWU6NDI4Njk0NSxzYWRkbGVicm93bjo5MTI3MTg3LHNhbG1vbjoxNjQxNjg4MixzYW5keWJyb3duOjE2MDMyODY0LHNlYWdyZWVuOjMwNTAzMjcsc2Vhc2hlbGw6MTY3NzQ2Mzgsc2llbm5hOjEwNTA2Nzk3LHNpbHZlcjoxMjYzMjI1Nixza3libHVlOjg5MDAzMzEsc2xhdGVibHVlOjY5NzAwNjEsc2xhdGVncmF5OjczNzI5NDQsc2xhdGVncmV5OjczNzI5NDQsc25vdzoxNjc3NTkzMCxzcHJpbmdncmVlbjo2NTQwNyxzdGVlbGJsdWU6NDYyMDk4MCx0YW46MTM4MDg3ODAsdGVhbDozMjg5Nix0aGlzdGxlOjE0MjA0ODg4LHRvbWF0bzoxNjczNzA5NSx0dXJxdW9pc2U6NDI1MTg1Nix2aW9sZXQ6MTU2MzEwODYsd2hlYXQ6MTYxMTMzMzEsd2hpdGU6MTY3NzcyMTUsd2hpdGVzbW9rZToxNjExOTI4NSx5ZWxsb3c6MTY3NzY5NjAseWVsbG93Z3JlZW46MTAxNDUwNzR9O2Z1bmN0aW9uIHZuKHQpe3ZhciBuO3JldHVybiB0PSh0KyIiKS50cmltKCkudG9Mb3dlckNhc2UoKSwobj1hbi5leGVjKHQpKT9uZXcgbW4oKG49cGFyc2VJbnQoblsxXSwxNikpPj44JjE1fG4+PjQmMjQwLG4+PjQmMTV8MjQwJm4sKDE1Jm4pPDw0fDE1Jm4sMSk6KG49dW4uZXhlYyh0KSk/Z24ocGFyc2VJbnQoblsxXSwxNikpOihuPWZuLmV4ZWModCkpP25ldyBtbihuWzFdLG5bMl0sblszXSwxKToobj1jbi5leGVjKHQpKT9uZXcgbW4oMjU1Km5bMV0vMTAwLDI1NSpuWzJdLzEwMCwyNTUqblszXS8xMDAsMSk6KG49c24uZXhlYyh0KSk/eW4oblsxXSxuWzJdLG5bM10sbls0XSk6KG49bG4uZXhlYyh0KSk/eW4oMjU1Km5bMV0vMTAwLDI1NSpuWzJdLzEwMCwyNTUqblszXS8xMDAsbls0XSk6KG49aG4uZXhlYyh0KSk/d24oblsxXSxuWzJdLzEwMCxuWzNdLzEwMCwxKToobj1kbi5leGVjKHQpKT93bihuWzFdLG5bMl0vMTAwLG5bM10vMTAwLG5bNF0pOnBuLmhhc093blByb3BlcnR5KHQpP2duKHBuW3RdKToidHJhbnNwYXJlbnQiPT09dD9uZXcgbW4oTmFOLE5hTixOYU4sMCk6bnVsbH1mdW5jdGlvbiBnbih0KXtyZXR1cm4gbmV3IG1uKHQ+PjE2JjI1NSx0Pj44JjI1NSwyNTUmdCwxKX1mdW5jdGlvbiB5bih0LG4sZSxyKXtyZXR1cm4gcjw9MCYmKHQ9bj1lPU5hTiksbmV3IG1uKHQsbixlLHIpfWZ1bmN0aW9uIF9uKHQpe3JldHVybiB0IGluc3RhbmNlb2Ygbm58fCh0PXZuKHQpKSx0P25ldyBtbigodD10LnJnYigpKS5yLHQuZyx0LmIsdC5vcGFjaXR5KTpuZXcgbW59ZnVuY3Rpb24gYm4odCxuLGUscil7cmV0dXJuIDE9PT1hcmd1bWVudHMubGVuZ3RoP19uKHQpOm5ldyBtbih0LG4sZSxudWxsPT1yPzE6cil9ZnVuY3Rpb24gbW4odCxuLGUscil7dGhpcy5yPSt0LHRoaXMuZz0rbix0aGlzLmI9K2UsdGhpcy5vcGFjaXR5PStyfWZ1bmN0aW9uIHhuKHQpe3JldHVybigodD1NYXRoLm1heCgwLE1hdGgubWluKDI1NSxNYXRoLnJvdW5kKHQpfHwwKSkpPDE2PyIwIjoiIikrdC50b1N0cmluZygxNil9ZnVuY3Rpb24gd24odCxuLGUscil7cmV0dXJuIHI8PTA/dD1uPWU9TmFOOmU8PTB8fGU+PTE/dD1uPU5hTjpuPD0wJiYodD1OYU4pLG5ldyBBbih0LG4sZSxyKX1mdW5jdGlvbiBNbih0LG4sZSxyKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGg/ZnVuY3Rpb24odCl7aWYodCBpbnN0YW5jZW9mIEFuKXJldHVybiBuZXcgQW4odC5oLHQucyx0LmwsdC5vcGFjaXR5KTtpZih0IGluc3RhbmNlb2Ygbm58fCh0PXZuKHQpKSwhdClyZXR1cm4gbmV3IEFuO2lmKHQgaW5zdGFuY2VvZiBBbilyZXR1cm4gdDt2YXIgbj0odD10LnJnYigpKS5yLzI1NSxlPXQuZy8yNTUscj10LmIvMjU1LGk9TWF0aC5taW4obixlLHIpLG89TWF0aC5tYXgobixlLHIpLGE9TmFOLHU9by1pLGY9KG8raSkvMjtyZXR1cm4gdT8oYT1uPT09bz8oZS1yKS91KzYqKGU8cik6ZT09PW8/KHItbikvdSsyOihuLWUpL3UrNCx1Lz1mPC41P28raToyLW8taSxhKj02MCk6dT1mPjAmJmY8MT8wOmEsbmV3IEFuKGEsdSxmLHQub3BhY2l0eSl9KHQpOm5ldyBBbih0LG4sZSxudWxsPT1yPzE6cil9ZnVuY3Rpb24gQW4odCxuLGUscil7dGhpcy5oPSt0LHRoaXMucz0rbix0aGlzLmw9K2UsdGhpcy5vcGFjaXR5PStyfWZ1bmN0aW9uIFRuKHQsbixlKXtyZXR1cm4gMjU1Kih0PDYwP24rKGUtbikqdC82MDp0PDE4MD9lOnQ8MjQwP24rKGUtbikqKDI0MC10KS82MDpuKX1LdChubix2bix7ZGlzcGxheWFibGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZ2IoKS5kaXNwbGF5YWJsZSgpfSxoZXg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZ2IoKS5oZXgoKX0sdG9TdHJpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZ2IoKSsiIn19KSxLdChtbixibix0bihubix7YnJpZ2h0ZXI6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9bnVsbD09dD8xLy43Ok1hdGgucG93KDEvLjcsdCksbmV3IG1uKHRoaXMucip0LHRoaXMuZyp0LHRoaXMuYip0LHRoaXMub3BhY2l0eSl9LGRhcmtlcjpmdW5jdGlvbih0KXtyZXR1cm4gdD1udWxsPT10Py43Ok1hdGgucG93KC43LHQpLG5ldyBtbih0aGlzLnIqdCx0aGlzLmcqdCx0aGlzLmIqdCx0aGlzLm9wYWNpdHkpfSxyZ2I6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30sZGlzcGxheWFibGU6ZnVuY3Rpb24oKXtyZXR1cm4gMDw9dGhpcy5yJiZ0aGlzLnI8PTI1NSYmMDw9dGhpcy5nJiZ0aGlzLmc8PTI1NSYmMDw9dGhpcy5iJiZ0aGlzLmI8PTI1NSYmMDw9dGhpcy5vcGFjaXR5JiZ0aGlzLm9wYWNpdHk8PTF9LGhleDpmdW5jdGlvbigpe3JldHVybiIjIit4bih0aGlzLnIpK3huKHRoaXMuZykreG4odGhpcy5iKX0sdG9TdHJpbmc6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLm9wYWNpdHk7cmV0dXJuKDE9PT0odD1pc05hTih0KT8xOk1hdGgubWF4KDAsTWF0aC5taW4oMSx0KSkpPyJyZ2IoIjoicmdiYSgiKStNYXRoLm1heCgwLE1hdGgubWluKDI1NSxNYXRoLnJvdW5kKHRoaXMucil8fDApKSsiLCAiK01hdGgubWF4KDAsTWF0aC5taW4oMjU1LE1hdGgucm91bmQodGhpcy5nKXx8MCkpKyIsICIrTWF0aC5tYXgoMCxNYXRoLm1pbigyNTUsTWF0aC5yb3VuZCh0aGlzLmIpfHwwKSkrKDE9PT10PyIpIjoiLCAiK3QrIikiKX19KSksS3QoQW4sTW4sdG4obm4se2JyaWdodGVyOmZ1bmN0aW9uKHQpe3JldHVybiB0PW51bGw9PXQ/MS8uNzpNYXRoLnBvdygxLy43LHQpLG5ldyBBbih0aGlzLmgsdGhpcy5zLHRoaXMubCp0LHRoaXMub3BhY2l0eSl9LGRhcmtlcjpmdW5jdGlvbih0KXtyZXR1cm4gdD1udWxsPT10Py43Ok1hdGgucG93KC43LHQpLG5ldyBBbih0aGlzLmgsdGhpcy5zLHRoaXMubCp0LHRoaXMub3BhY2l0eSl9LHJnYjpmdW5jdGlvbigpe3ZhciB0PXRoaXMuaCUzNjArMzYwKih0aGlzLmg8MCksbj1pc05hTih0KXx8aXNOYU4odGhpcy5zKT8wOnRoaXMucyxlPXRoaXMubCxyPWUrKGU8LjU/ZToxLWUpKm4saT0yKmUtcjtyZXR1cm4gbmV3IG1uKFRuKHQ+PTI0MD90LTI0MDp0KzEyMCxpLHIpLFRuKHQsaSxyKSxUbih0PDEyMD90KzI0MDp0LTEyMCxpLHIpLHRoaXMub3BhY2l0eSl9LGRpc3BsYXlhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuKDA8PXRoaXMucyYmdGhpcy5zPD0xfHxpc05hTih0aGlzLnMpKSYmMDw9dGhpcy5sJiZ0aGlzLmw8PTEmJjA8PXRoaXMub3BhY2l0eSYmdGhpcy5vcGFjaXR5PD0xfX0pKTt2YXIgTm49TWF0aC5QSS8xODAsU249MTgwL01hdGguUEksRW49Ljk2NDIyLGtuPTEsQ249LjgyNTIxLFBuPTQvMjksem49Ni8yOSxSbj0zKnpuKnpuLExuPXpuKnpuKnpuO2Z1bmN0aW9uIERuKHQpe2lmKHQgaW5zdGFuY2VvZiBxbilyZXR1cm4gbmV3IHFuKHQubCx0LmEsdC5iLHQub3BhY2l0eSk7aWYodCBpbnN0YW5jZW9mIGpuKXtpZihpc05hTih0LmgpKXJldHVybiBuZXcgcW4odC5sLDAsMCx0Lm9wYWNpdHkpO3ZhciBuPXQuaCpObjtyZXR1cm4gbmV3IHFuKHQubCxNYXRoLmNvcyhuKSp0LmMsTWF0aC5zaW4obikqdC5jLHQub3BhY2l0eSl9dCBpbnN0YW5jZW9mIG1ufHwodD1fbih0KSk7dmFyIGUscixpPUZuKHQuciksbz1Gbih0LmcpLGE9Rm4odC5iKSx1PU9uKCguMjIyNTA0NSppKy43MTY4Nzg2Km8rLjA2MDYxNjkqYSkva24pO3JldHVybiBpPT09byYmbz09PWE/ZT1yPXU6KGU9T24oKC40MzYwNzQ3KmkrLjM4NTA2NDkqbysuMTQzMDgwNCphKS9Fbikscj1PbigoLjAxMzkzMjIqaSsuMDk3MTA0NSpvKy43MTQxNzMzKmEpL0NuKSksbmV3IHFuKDExNip1LTE2LDUwMCooZS11KSwyMDAqKHUtciksdC5vcGFjaXR5KX1mdW5jdGlvbiBVbih0LG4sZSxyKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGg/RG4odCk6bmV3IHFuKHQsbixlLG51bGw9PXI/MTpyKX1mdW5jdGlvbiBxbih0LG4sZSxyKXt0aGlzLmw9K3QsdGhpcy5hPStuLHRoaXMuYj0rZSx0aGlzLm9wYWNpdHk9K3J9ZnVuY3Rpb24gT24odCl7cmV0dXJuIHQ+TG4/TWF0aC5wb3codCwxLzMpOnQvUm4rUG59ZnVuY3Rpb24gWW4odCl7cmV0dXJuIHQ+em4/dCp0KnQ6Um4qKHQtUG4pfWZ1bmN0aW9uIEJuKHQpe3JldHVybiAyNTUqKHQ8PS4wMDMxMzA4PzEyLjkyKnQ6MS4wNTUqTWF0aC5wb3codCwxLzIuNCktLjA1NSl9ZnVuY3Rpb24gRm4odCl7cmV0dXJuKHQvPTI1NSk8PS4wNDA0NT90LzEyLjkyOk1hdGgucG93KCh0Ky4wNTUpLzEuMDU1LDIuNCl9ZnVuY3Rpb24gSW4odCl7aWYodCBpbnN0YW5jZW9mIGpuKXJldHVybiBuZXcgam4odC5oLHQuYyx0LmwsdC5vcGFjaXR5KTtpZih0IGluc3RhbmNlb2YgcW58fCh0PURuKHQpKSwwPT09dC5hJiYwPT09dC5iKXJldHVybiBuZXcgam4oTmFOLDAsdC5sLHQub3BhY2l0eSk7dmFyIG49TWF0aC5hdGFuMih0LmIsdC5hKSpTbjtyZXR1cm4gbmV3IGpuKG48MD9uKzM2MDpuLE1hdGguc3FydCh0LmEqdC5hK3QuYip0LmIpLHQubCx0Lm9wYWNpdHkpfWZ1bmN0aW9uIEhuKHQsbixlLHIpe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD9Jbih0KTpuZXcgam4odCxuLGUsbnVsbD09cj8xOnIpfWZ1bmN0aW9uIGpuKHQsbixlLHIpe3RoaXMuaD0rdCx0aGlzLmM9K24sdGhpcy5sPStlLHRoaXMub3BhY2l0eT0rcn1LdChxbixVbix0bihubix7YnJpZ2h0ZXI6ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBxbih0aGlzLmwrMTgqKG51bGw9PXQ/MTp0KSx0aGlzLmEsdGhpcy5iLHRoaXMub3BhY2l0eSl9LGRhcmtlcjpmdW5jdGlvbih0KXtyZXR1cm4gbmV3IHFuKHRoaXMubC0xOCoobnVsbD09dD8xOnQpLHRoaXMuYSx0aGlzLmIsdGhpcy5vcGFjaXR5KX0scmdiOmZ1bmN0aW9uKCl7dmFyIHQ9KHRoaXMubCsxNikvMTE2LG49aXNOYU4odGhpcy5hKT90OnQrdGhpcy5hLzUwMCxlPWlzTmFOKHRoaXMuYik/dDp0LXRoaXMuYi8yMDA7cmV0dXJuIG5ldyBtbihCbigzLjEzMzg1NjEqKG49RW4qWW4obikpLTEuNjE2ODY2NyoodD1rbipZbih0KSktLjQ5MDYxNDYqKGU9Q24qWW4oZSkpKSxCbigtLjk3ODc2ODQqbisxLjkxNjE0MTUqdCsuMDMzNDU0KmUpLEJuKC4wNzE5NDUzKm4tLjIyODk5MTQqdCsxLjQwNTI0MjcqZSksdGhpcy5vcGFjaXR5KX19KSksS3Qoam4sSG4sdG4obm4se2JyaWdodGVyOmZ1bmN0aW9uKHQpe3JldHVybiBuZXcgam4odGhpcy5oLHRoaXMuYyx0aGlzLmwrMTgqKG51bGw9PXQ/MTp0KSx0aGlzLm9wYWNpdHkpfSxkYXJrZXI6ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBqbih0aGlzLmgsdGhpcy5jLHRoaXMubC0xOCoobnVsbD09dD8xOnQpLHRoaXMub3BhY2l0eSl9LHJnYjpmdW5jdGlvbigpe3JldHVybiBEbih0aGlzKS5yZ2IoKX19KSk7dmFyIFhuPS0uMTQ4NjEsR249MS43ODI3NyxWbj0tLjI5MjI3LCRuPS0uOTA2NDksV249MS45NzI5NCxabj1XbiokbixRbj1XbipHbixKbj1HbipWbi0kbipYbjtmdW5jdGlvbiBLbih0LG4sZSxyKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGg/ZnVuY3Rpb24odCl7aWYodCBpbnN0YW5jZW9mIHRlKXJldHVybiBuZXcgdGUodC5oLHQucyx0LmwsdC5vcGFjaXR5KTt0IGluc3RhbmNlb2YgbW58fCh0PV9uKHQpKTt2YXIgbj10LnIvMjU1LGU9dC5nLzI1NSxyPXQuYi8yNTUsaT0oSm4qcitabipuLVFuKmUpLyhKbitabi1Rbiksbz1yLWksYT0oV24qKGUtaSktVm4qbykvJG4sdT1NYXRoLnNxcnQoYSphK28qbykvKFduKmkqKDEtaSkpLGY9dT9NYXRoLmF0YW4yKGEsbykqU24tMTIwOk5hTjtyZXR1cm4gbmV3IHRlKGY8MD9mKzM2MDpmLHUsaSx0Lm9wYWNpdHkpfSh0KTpuZXcgdGUodCxuLGUsbnVsbD09cj8xOnIpfWZ1bmN0aW9uIHRlKHQsbixlLHIpe3RoaXMuaD0rdCx0aGlzLnM9K24sdGhpcy5sPStlLHRoaXMub3BhY2l0eT0rcn1mdW5jdGlvbiBuZSh0LG4sZSxyLGkpe3ZhciBvPXQqdCxhPW8qdDtyZXR1cm4oKDEtMyp0KzMqby1hKSpuKyg0LTYqbyszKmEpKmUrKDErMyp0KzMqby0zKmEpKnIrYSppKS82fWZ1bmN0aW9uIGVlKHQpe3ZhciBuPXQubGVuZ3RoLTE7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciByPWU8PTA/ZT0wOmU+PTE/KGU9MSxuLTEpOk1hdGguZmxvb3IoZSpuKSxpPXRbcl0sbz10W3IrMV0sYT1yPjA/dFtyLTFdOjIqaS1vLHU9cjxuLTE/dFtyKzJdOjIqby1pO3JldHVybiBuZSgoZS1yL24pKm4sYSxpLG8sdSl9fWZ1bmN0aW9uIHJlKHQpe3ZhciBuPXQubGVuZ3RoO3JldHVybiBmdW5jdGlvbihlKXt2YXIgcj1NYXRoLmZsb29yKCgoZSU9MSk8MD8rK2U6ZSkqbiksaT10WyhyK24tMSklbl0sbz10W3Ilbl0sYT10WyhyKzEpJW5dLHU9dFsocisyKSVuXTtyZXR1cm4gbmUoKGUtci9uKSpuLGksbyxhLHUpfX1mdW5jdGlvbiBpZSh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19ZnVuY3Rpb24gb2UodCxuKXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIHQrZSpufX1mdW5jdGlvbiBhZSh0LG4pe3ZhciBlPW4tdDtyZXR1cm4gZT9vZSh0LGU+MTgwfHxlPC0xODA/ZS0zNjAqTWF0aC5yb3VuZChlLzM2MCk6ZSk6aWUoaXNOYU4odCk/bjp0KX1mdW5jdGlvbiB1ZSh0KXtyZXR1cm4gMT09KHQ9K3QpP2ZlOmZ1bmN0aW9uKG4sZSl7cmV0dXJuIGUtbj9mdW5jdGlvbih0LG4sZSl7cmV0dXJuIHQ9TWF0aC5wb3codCxlKSxuPU1hdGgucG93KG4sZSktdCxlPTEvZSxmdW5jdGlvbihyKXtyZXR1cm4gTWF0aC5wb3codCtyKm4sZSl9fShuLGUsdCk6aWUoaXNOYU4obik/ZTpuKX19ZnVuY3Rpb24gZmUodCxuKXt2YXIgZT1uLXQ7cmV0dXJuIGU/b2UodCxlKTppZShpc05hTih0KT9uOnQpfUt0KHRlLEtuLHRuKG5uLHticmlnaHRlcjpmdW5jdGlvbih0KXtyZXR1cm4gdD1udWxsPT10PzEvLjc6TWF0aC5wb3coMS8uNyx0KSxuZXcgdGUodGhpcy5oLHRoaXMucyx0aGlzLmwqdCx0aGlzLm9wYWNpdHkpfSxkYXJrZXI6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9bnVsbD09dD8uNzpNYXRoLnBvdyguNyx0KSxuZXcgdGUodGhpcy5oLHRoaXMucyx0aGlzLmwqdCx0aGlzLm9wYWNpdHkpfSxyZ2I6ZnVuY3Rpb24oKXt2YXIgdD1pc05hTih0aGlzLmgpPzA6KHRoaXMuaCsxMjApKk5uLG49K3RoaXMubCxlPWlzTmFOKHRoaXMucyk/MDp0aGlzLnMqbiooMS1uKSxyPU1hdGguY29zKHQpLGk9TWF0aC5zaW4odCk7cmV0dXJuIG5ldyBtbigyNTUqKG4rZSooWG4qcitHbippKSksMjU1KihuK2UqKFZuKnIrJG4qaSkpLDI1NSoobitlKihXbipyKSksdGhpcy5vcGFjaXR5KX19KSk7dmFyIGNlPWZ1bmN0aW9uIHQobil7dmFyIGU9dWUobik7ZnVuY3Rpb24gcih0LG4pe3ZhciByPWUoKHQ9Ym4odCkpLnIsKG49Ym4obikpLnIpLGk9ZSh0Lmcsbi5nKSxvPWUodC5iLG4uYiksYT1mZSh0Lm9wYWNpdHksbi5vcGFjaXR5KTtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIHQucj1yKG4pLHQuZz1pKG4pLHQuYj1vKG4pLHQub3BhY2l0eT1hKG4pLHQrIiJ9fXJldHVybiByLmdhbW1hPXQscn0oMSk7ZnVuY3Rpb24gc2UodCl7cmV0dXJuIGZ1bmN0aW9uKG4pe3ZhciBlLHIsaT1uLmxlbmd0aCxvPW5ldyBBcnJheShpKSxhPW5ldyBBcnJheShpKSx1PW5ldyBBcnJheShpKTtmb3IoZT0wO2U8aTsrK2Upcj1ibihuW2VdKSxvW2VdPXIucnx8MCxhW2VdPXIuZ3x8MCx1W2VdPXIuYnx8MDtyZXR1cm4gbz10KG8pLGE9dChhKSx1PXQodSksci5vcGFjaXR5PTEsZnVuY3Rpb24odCl7cmV0dXJuIHIucj1vKHQpLHIuZz1hKHQpLHIuYj11KHQpLHIrIiJ9fX12YXIgbGU9c2UoZWUpLGhlPXNlKHJlKTtmdW5jdGlvbiBkZSh0LG4pe3ZhciBlLHI9bj9uLmxlbmd0aDowLGk9dD9NYXRoLm1pbihyLHQubGVuZ3RoKTowLG89bmV3IEFycmF5KGkpLGE9bmV3IEFycmF5KHIpO2ZvcihlPTA7ZTxpOysrZSlvW2VdPW1lKHRbZV0sbltlXSk7Zm9yKDtlPHI7KytlKWFbZV09bltlXTtyZXR1cm4gZnVuY3Rpb24odCl7Zm9yKGU9MDtlPGk7KytlKWFbZV09b1tlXSh0KTtyZXR1cm4gYX19ZnVuY3Rpb24gcGUodCxuKXt2YXIgZT1uZXcgRGF0ZTtyZXR1cm4gbi09dD0rdCxmdW5jdGlvbihyKXtyZXR1cm4gZS5zZXRUaW1lKHQrbipyKSxlfX1mdW5jdGlvbiB2ZSh0LG4pe3JldHVybiBuLT10PSt0LGZ1bmN0aW9uKGUpe3JldHVybiB0K24qZX19ZnVuY3Rpb24gZ2UodCxuKXt2YXIgZSxyPXt9LGk9e307Zm9yKGUgaW4gbnVsbCE9PXQmJiJvYmplY3QiPT10eXBlb2YgdHx8KHQ9e30pLG51bGwhPT1uJiYib2JqZWN0Ij09dHlwZW9mIG58fChuPXt9KSxuKWUgaW4gdD9yW2VdPW1lKHRbZV0sbltlXSk6aVtlXT1uW2VdO3JldHVybiBmdW5jdGlvbih0KXtmb3IoZSBpbiByKWlbZV09cltlXSh0KTtyZXR1cm4gaX19dmFyIHllPS9bLStdPyg/OlxkK1wuP1xkKnxcLj9cZCspKD86W2VFXVstK10/XGQrKT8vZyxfZT1uZXcgUmVnRXhwKHllLnNvdXJjZSwiZyIpO2Z1bmN0aW9uIGJlKHQsbil7dmFyIGUscixpLG89eWUubGFzdEluZGV4PV9lLmxhc3RJbmRleD0wLGE9LTEsdT1bXSxmPVtdO2Zvcih0Kz0iIixuKz0iIjsoZT15ZS5leGVjKHQpKSYmKHI9X2UuZXhlYyhuKSk7KShpPXIuaW5kZXgpPm8mJihpPW4uc2xpY2UobyxpKSx1W2FdP3VbYV0rPWk6dVsrK2FdPWkpLChlPWVbMF0pPT09KHI9clswXSk/dVthXT91W2FdKz1yOnVbKythXT1yOih1WysrYV09bnVsbCxmLnB1c2goe2k6YSx4OnZlKGUscil9KSksbz1fZS5sYXN0SW5kZXg7cmV0dXJuIG88bi5sZW5ndGgmJihpPW4uc2xpY2UobyksdVthXT91W2FdKz1pOnVbKythXT1pKSx1Lmxlbmd0aDwyP2ZbMF0/ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiB0KG4pKyIifX0oZlswXS54KTpmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19KG4pOihuPWYubGVuZ3RoLGZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxyPTA7cjxuOysrcil1WyhlPWZbcl0pLmldPWUueCh0KTtyZXR1cm4gdS5qb2luKCIiKX0pfWZ1bmN0aW9uIG1lKHQsbil7dmFyIGUscj10eXBlb2YgbjtyZXR1cm4gbnVsbD09bnx8ImJvb2xlYW4iPT09cj9pZShuKTooIm51bWJlciI9PT1yP3ZlOiJzdHJpbmciPT09cj8oZT12bihuKSk/KG49ZSxjZSk6YmU6biBpbnN0YW5jZW9mIHZuP2NlOm4gaW5zdGFuY2VvZiBEYXRlP3BlOkFycmF5LmlzQXJyYXkobik/ZGU6ImZ1bmN0aW9uIiE9dHlwZW9mIG4udmFsdWVPZiYmImZ1bmN0aW9uIiE9dHlwZW9mIG4udG9TdHJpbmd8fGlzTmFOKG4pP2dlOnZlKSh0LG4pfWZ1bmN0aW9uIHhlKHQsbil7cmV0dXJuIG4tPXQ9K3QsZnVuY3Rpb24oZSl7cmV0dXJuIE1hdGgucm91bmQodCtuKmUpfX12YXIgd2UsTWUsQWUsVGUsTmU9MTgwL01hdGguUEksU2U9e3RyYW5zbGF0ZVg6MCx0cmFuc2xhdGVZOjAscm90YXRlOjAsc2tld1g6MCxzY2FsZVg6MSxzY2FsZVk6MX07ZnVuY3Rpb24gRWUodCxuLGUscixpLG8pe3ZhciBhLHUsZjtyZXR1cm4oYT1NYXRoLnNxcnQodCp0K24qbikpJiYodC89YSxuLz1hKSwoZj10KmUrbipyKSYmKGUtPXQqZixyLT1uKmYpLCh1PU1hdGguc3FydChlKmUrcipyKSkmJihlLz11LHIvPXUsZi89dSksdCpyPG4qZSYmKHQ9LXQsbj0tbixmPS1mLGE9LWEpLHt0cmFuc2xhdGVYOmksdHJhbnNsYXRlWTpvLHJvdGF0ZTpNYXRoLmF0YW4yKG4sdCkqTmUsc2tld1g6TWF0aC5hdGFuKGYpKk5lLHNjYWxlWDphLHNjYWxlWTp1fX1mdW5jdGlvbiBrZSh0LG4sZSxyKXtmdW5jdGlvbiBpKHQpe3JldHVybiB0Lmxlbmd0aD90LnBvcCgpKyIgIjoiIn1yZXR1cm4gZnVuY3Rpb24obyxhKXt2YXIgdT1bXSxmPVtdO3JldHVybiBvPXQobyksYT10KGEpLGZ1bmN0aW9uKHQscixpLG8sYSx1KXtpZih0IT09aXx8ciE9PW8pe3ZhciBmPWEucHVzaCgidHJhbnNsYXRlKCIsbnVsbCxuLG51bGwsZSk7dS5wdXNoKHtpOmYtNCx4OnZlKHQsaSl9LHtpOmYtMix4OnZlKHIsbyl9KX1lbHNlKGl8fG8pJiZhLnB1c2goInRyYW5zbGF0ZSgiK2krbitvK2UpfShvLnRyYW5zbGF0ZVgsby50cmFuc2xhdGVZLGEudHJhbnNsYXRlWCxhLnRyYW5zbGF0ZVksdSxmKSxmdW5jdGlvbih0LG4sZSxvKXt0IT09bj8odC1uPjE4MD9uKz0zNjA6bi10PjE4MCYmKHQrPTM2MCksby5wdXNoKHtpOmUucHVzaChpKGUpKyJyb3RhdGUoIixudWxsLHIpLTIseDp2ZSh0LG4pfSkpOm4mJmUucHVzaChpKGUpKyJyb3RhdGUoIituK3IpfShvLnJvdGF0ZSxhLnJvdGF0ZSx1LGYpLGZ1bmN0aW9uKHQsbixlLG8pe3QhPT1uP28ucHVzaCh7aTplLnB1c2goaShlKSsic2tld1goIixudWxsLHIpLTIseDp2ZSh0LG4pfSk6biYmZS5wdXNoKGkoZSkrInNrZXdYKCIrbityKX0oby5za2V3WCxhLnNrZXdYLHUsZiksZnVuY3Rpb24odCxuLGUscixvLGEpe2lmKHQhPT1lfHxuIT09cil7dmFyIHU9by5wdXNoKGkobykrInNjYWxlKCIsbnVsbCwiLCIsbnVsbCwiKSIpO2EucHVzaCh7aTp1LTQseDp2ZSh0LGUpfSx7aTp1LTIseDp2ZShuLHIpfSl9ZWxzZSAxPT09ZSYmMT09PXJ8fG8ucHVzaChpKG8pKyJzY2FsZSgiK2UrIiwiK3IrIikiKX0oby5zY2FsZVgsby5zY2FsZVksYS5zY2FsZVgsYS5zY2FsZVksdSxmKSxvPWE9bnVsbCxmdW5jdGlvbih0KXtmb3IodmFyIG4sZT0tMSxyPWYubGVuZ3RoOysrZTxyOyl1WyhuPWZbZV0pLmldPW4ueCh0KTtyZXR1cm4gdS5qb2luKCIiKX19fXZhciBDZT1rZShmdW5jdGlvbih0KXtyZXR1cm4ibm9uZSI9PT10P1NlOih3ZXx8KHdlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIkRJViIpLE1lPWRvY3VtZW50LmRvY3VtZW50RWxlbWVudCxBZT1kb2N1bWVudC5kZWZhdWx0Vmlldyksd2Uuc3R5bGUudHJhbnNmb3JtPXQsdD1BZS5nZXRDb21wdXRlZFN0eWxlKE1lLmFwcGVuZENoaWxkKHdlKSxudWxsKS5nZXRQcm9wZXJ0eVZhbHVlKCJ0cmFuc2Zvcm0iKSxNZS5yZW1vdmVDaGlsZCh3ZSksRWUoKyh0PXQuc2xpY2UoNywtMSkuc3BsaXQoIiwiKSlbMF0sK3RbMV0sK3RbMl0sK3RbM10sK3RbNF0sK3RbNV0pKX0sInB4LCAiLCJweCkiLCJkZWcpIiksUGU9a2UoZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/U2U6KFRlfHwoVGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsImciKSksVGUuc2V0QXR0cmlidXRlKCJ0cmFuc2Zvcm0iLHQpLCh0PVRlLnRyYW5zZm9ybS5iYXNlVmFsLmNvbnNvbGlkYXRlKCkpP0VlKCh0PXQubWF0cml4KS5hLHQuYix0LmMsdC5kLHQuZSx0LmYpOlNlKX0sIiwgIiwiKSIsIikiKSx6ZT1NYXRoLlNRUlQyLFJlPTIsTGU9NCxEZT0xZS0xMjtmdW5jdGlvbiBVZSh0KXtyZXR1cm4oKHQ9TWF0aC5leHAodCkpKzEvdCkvMn1mdW5jdGlvbiBxZSh0LG4pe3ZhciBlLHIsaT10WzBdLG89dFsxXSxhPXRbMl0sdT1uWzBdLGY9blsxXSxjPW5bMl0scz11LWksbD1mLW8saD1zKnMrbCpsO2lmKGg8RGUpcj1NYXRoLmxvZyhjL2EpL3plLGU9ZnVuY3Rpb24odCl7cmV0dXJuW2krdCpzLG8rdCpsLGEqTWF0aC5leHAoemUqdCpyKV19O2Vsc2V7dmFyIGQ9TWF0aC5zcXJ0KGgpLHA9KGMqYy1hKmErTGUqaCkvKDIqYSpSZSpkKSx2PShjKmMtYSphLUxlKmgpLygyKmMqUmUqZCksZz1NYXRoLmxvZyhNYXRoLnNxcnQocCpwKzEpLXApLHk9TWF0aC5sb2coTWF0aC5zcXJ0KHYqdisxKS12KTtyPSh5LWcpL3plLGU9ZnVuY3Rpb24odCl7dmFyIG4sZT10KnIsdT1VZShnKSxmPWEvKFJlKmQpKih1KihuPXplKmUrZywoKG49TWF0aC5leHAoMipuKSktMSkvKG4rMSkpLWZ1bmN0aW9uKHQpe3JldHVybigodD1NYXRoLmV4cCh0KSktMS90KS8yfShnKSk7cmV0dXJuW2krZipzLG8rZipsLGEqdS9VZSh6ZSplK2cpXX19cmV0dXJuIGUuZHVyYXRpb249MWUzKnIsZX1mdW5jdGlvbiBPZSh0KXtyZXR1cm4gZnVuY3Rpb24obixlKXt2YXIgcj10KChuPU1uKG4pKS5oLChlPU1uKGUpKS5oKSxpPWZlKG4ucyxlLnMpLG89ZmUobi5sLGUubCksYT1mZShuLm9wYWNpdHksZS5vcGFjaXR5KTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIG4uaD1yKHQpLG4ucz1pKHQpLG4ubD1vKHQpLG4ub3BhY2l0eT1hKHQpLG4rIiJ9fX12YXIgWWU9T2UoYWUpLEJlPU9lKGZlKTtmdW5jdGlvbiBGZSh0KXtyZXR1cm4gZnVuY3Rpb24obixlKXt2YXIgcj10KChuPUhuKG4pKS5oLChlPUhuKGUpKS5oKSxpPWZlKG4uYyxlLmMpLG89ZmUobi5sLGUubCksYT1mZShuLm9wYWNpdHksZS5vcGFjaXR5KTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIG4uaD1yKHQpLG4uYz1pKHQpLG4ubD1vKHQpLG4ub3BhY2l0eT1hKHQpLG4rIiJ9fX12YXIgSWU9RmUoYWUpLEhlPUZlKGZlKTtmdW5jdGlvbiBqZSh0KXtyZXR1cm4gZnVuY3Rpb24gbihlKXtmdW5jdGlvbiByKG4scil7dmFyIGk9dCgobj1LbihuKSkuaCwocj1LbihyKSkuaCksbz1mZShuLnMsci5zKSxhPWZlKG4ubCxyLmwpLHU9ZmUobi5vcGFjaXR5LHIub3BhY2l0eSk7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBuLmg9aSh0KSxuLnM9byh0KSxuLmw9YShNYXRoLnBvdyh0LGUpKSxuLm9wYWNpdHk9dSh0KSxuKyIifX1yZXR1cm4gZT0rZSxyLmdhbW1hPW4scn0oMSl9dmFyIFhlPWplKGFlKSxHZT1qZShmZSk7dmFyIFZlLCRlLFdlPTAsWmU9MCxRZT0wLEplPTFlMyxLZT0wLHRyPTAsbnI9MCxlcj0ib2JqZWN0Ij09dHlwZW9mIHBlcmZvcm1hbmNlJiZwZXJmb3JtYW5jZS5ub3c/cGVyZm9ybWFuY2U6RGF0ZSxycj0ib2JqZWN0Ij09dHlwZW9mIHdpbmRvdyYmd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZT93aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lLmJpbmQod2luZG93KTpmdW5jdGlvbih0KXtzZXRUaW1lb3V0KHQsMTcpfTtmdW5jdGlvbiBpcigpe3JldHVybiB0cnx8KHJyKG9yKSx0cj1lci5ub3coKStucil9ZnVuY3Rpb24gb3IoKXt0cj0wfWZ1bmN0aW9uIGFyKCl7dGhpcy5fY2FsbD10aGlzLl90aW1lPXRoaXMuX25leHQ9bnVsbH1mdW5jdGlvbiB1cih0LG4sZSl7dmFyIHI9bmV3IGFyO3JldHVybiByLnJlc3RhcnQodCxuLGUpLHJ9ZnVuY3Rpb24gZnIoKXtpcigpLCsrV2U7Zm9yKHZhciB0LG49VmU7bjspKHQ9dHItbi5fdGltZSk+PTAmJm4uX2NhbGwuY2FsbChudWxsLHQpLG49bi5fbmV4dDstLVdlfWZ1bmN0aW9uIGNyKCl7dHI9KEtlPWVyLm5vdygpKStucixXZT1aZT0wO3RyeXtmcigpfWZpbmFsbHl7V2U9MCxmdW5jdGlvbigpe3ZhciB0LG4sZT1WZSxyPTEvMDtmb3IoO2U7KWUuX2NhbGw/KHI+ZS5fdGltZSYmKHI9ZS5fdGltZSksdD1lLGU9ZS5fbmV4dCk6KG49ZS5fbmV4dCxlLl9uZXh0PW51bGwsZT10P3QuX25leHQ9bjpWZT1uKTskZT10LGxyKHIpfSgpLHRyPTB9fWZ1bmN0aW9uIHNyKCl7dmFyIHQ9ZXIubm93KCksbj10LUtlO24+SmUmJihuci09bixLZT10KX1mdW5jdGlvbiBscih0KXtXZXx8KFplJiYoWmU9Y2xlYXJUaW1lb3V0KFplKSksdC10cj4yND8odDwxLzAmJihaZT1zZXRUaW1lb3V0KGNyLHQtZXIubm93KCktbnIpKSxRZSYmKFFlPWNsZWFySW50ZXJ2YWwoUWUpKSk6KFFlfHwoS2U9ZXIubm93KCksUWU9c2V0SW50ZXJ2YWwoc3IsSmUpKSxXZT0xLHJyKGNyKSkpfWZ1bmN0aW9uIGhyKHQsbixlKXt2YXIgcj1uZXcgYXI7cmV0dXJuIG49bnVsbD09bj8wOituLHIucmVzdGFydChmdW5jdGlvbihlKXtyLnN0b3AoKSx0KGUrbil9LG4sZSkscn1hci5wcm90b3R5cGU9dXIucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjphcixyZXN0YXJ0OmZ1bmN0aW9uKHQsbixlKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCl0aHJvdyBuZXcgVHlwZUVycm9yKCJjYWxsYmFjayBpcyBub3QgYSBmdW5jdGlvbiIpO2U9KG51bGw9PWU/aXIoKTorZSkrKG51bGw9PW4/MDorbiksdGhpcy5fbmV4dHx8JGU9PT10aGlzfHwoJGU/JGUuX25leHQ9dGhpczpWZT10aGlzLCRlPXRoaXMpLHRoaXMuX2NhbGw9dCx0aGlzLl90aW1lPWUsbHIoKX0sc3RvcDpmdW5jdGlvbigpe3RoaXMuX2NhbGwmJih0aGlzLl9jYWxsPW51bGwsdGhpcy5fdGltZT0xLzAsbHIoKSl9fTt2YXIgZHI9SSgic3RhcnQiLCJlbmQiLCJpbnRlcnJ1cHQiKSxwcj1bXSx2cj0wLGdyPTEseXI9Mixfcj0zLGJyPTQsbXI9NSx4cj02O2Z1bmN0aW9uIHdyKHQsbixlLHIsaSxvKXt2YXIgYT10Ll9fdHJhbnNpdGlvbjtpZihhKXtpZihlIGluIGEpcmV0dXJufWVsc2UgdC5fX3RyYW5zaXRpb249e307IWZ1bmN0aW9uKHQsbixlKXt2YXIgcixpPXQuX190cmFuc2l0aW9uO2Z1bmN0aW9uIG8oZil7dmFyIGMscyxsLGg7aWYoZS5zdGF0ZSE9PWdyKXJldHVybiB1KCk7Zm9yKGMgaW4gaSlpZigoaD1pW2NdKS5uYW1lPT09ZS5uYW1lKXtpZihoLnN0YXRlPT09X3IpcmV0dXJuIGhyKG8pO2guc3RhdGU9PT1icj8oaC5zdGF0ZT14cixoLnRpbWVyLnN0b3AoKSxoLm9uLmNhbGwoImludGVycnVwdCIsdCx0Ll9fZGF0YV9fLGguaW5kZXgsaC5ncm91cCksZGVsZXRlIGlbY10pOitjPG4mJihoLnN0YXRlPXhyLGgudGltZXIuc3RvcCgpLGRlbGV0ZSBpW2NdKX1pZihocihmdW5jdGlvbigpe2Uuc3RhdGU9PT1fciYmKGUuc3RhdGU9YnIsZS50aW1lci5yZXN0YXJ0KGEsZS5kZWxheSxlLnRpbWUpLGEoZikpfSksZS5zdGF0ZT15cixlLm9uLmNhbGwoInN0YXJ0Iix0LHQuX19kYXRhX18sZS5pbmRleCxlLmdyb3VwKSxlLnN0YXRlPT09eXIpe2ZvcihlLnN0YXRlPV9yLHI9bmV3IEFycmF5KGw9ZS50d2Vlbi5sZW5ndGgpLGM9MCxzPS0xO2M8bDsrK2MpKGg9ZS50d2VlbltjXS52YWx1ZS5jYWxsKHQsdC5fX2RhdGFfXyxlLmluZGV4LGUuZ3JvdXApKSYmKHJbKytzXT1oKTtyLmxlbmd0aD1zKzF9fWZ1bmN0aW9uIGEobil7Zm9yKHZhciBpPW48ZS5kdXJhdGlvbj9lLmVhc2UuY2FsbChudWxsLG4vZS5kdXJhdGlvbik6KGUudGltZXIucmVzdGFydCh1KSxlLnN0YXRlPW1yLDEpLG89LTEsYT1yLmxlbmd0aDsrK288YTspcltvXS5jYWxsKG51bGwsaSk7ZS5zdGF0ZT09PW1yJiYoZS5vbi5jYWxsKCJlbmQiLHQsdC5fX2RhdGFfXyxlLmluZGV4LGUuZ3JvdXApLHUoKSl9ZnVuY3Rpb24gdSgpe2Zvcih2YXIgciBpbiBlLnN0YXRlPXhyLGUudGltZXIuc3RvcCgpLGRlbGV0ZSBpW25dLGkpcmV0dXJuO2RlbGV0ZSB0Ll9fdHJhbnNpdGlvbn1pW25dPWUsZS50aW1lcj11cihmdW5jdGlvbih0KXtlLnN0YXRlPWdyLGUudGltZXIucmVzdGFydChvLGUuZGVsYXksZS50aW1lKSxlLmRlbGF5PD10JiZvKHQtZS5kZWxheSl9LDAsZS50aW1lKX0odCxlLHtuYW1lOm4saW5kZXg6cixncm91cDppLG9uOmRyLHR3ZWVuOnByLHRpbWU6by50aW1lLGRlbGF5Om8uZGVsYXksZHVyYXRpb246by5kdXJhdGlvbixlYXNlOm8uZWFzZSx0aW1lcjpudWxsLHN0YXRlOnZyfSl9ZnVuY3Rpb24gTXIodCxuKXt2YXIgZT1Ucih0LG4pO2lmKGUuc3RhdGU+dnIpdGhyb3cgbmV3IEVycm9yKCJ0b28gbGF0ZTsgYWxyZWFkeSBzY2hlZHVsZWQiKTtyZXR1cm4gZX1mdW5jdGlvbiBBcih0LG4pe3ZhciBlPVRyKHQsbik7aWYoZS5zdGF0ZT55cil0aHJvdyBuZXcgRXJyb3IoInRvbyBsYXRlOyBhbHJlYWR5IHN0YXJ0ZWQiKTtyZXR1cm4gZX1mdW5jdGlvbiBUcih0LG4pe3ZhciBlPXQuX190cmFuc2l0aW9uO2lmKCFlfHwhKGU9ZVtuXSkpdGhyb3cgbmV3IEVycm9yKCJ0cmFuc2l0aW9uIG5vdCBmb3VuZCIpO3JldHVybiBlfWZ1bmN0aW9uIE5yKHQsbil7dmFyIGUscixpLG89dC5fX3RyYW5zaXRpb24sYT0hMDtpZihvKXtmb3IoaSBpbiBuPW51bGw9PW4/bnVsbDpuKyIiLG8pKGU9b1tpXSkubmFtZT09PW4/KHI9ZS5zdGF0ZT55ciYmZS5zdGF0ZTxtcixlLnN0YXRlPXhyLGUudGltZXIuc3RvcCgpLHImJmUub24uY2FsbCgiaW50ZXJydXB0Iix0LHQuX19kYXRhX18sZS5pbmRleCxlLmdyb3VwKSxkZWxldGUgb1tpXSk6YT0hMTthJiZkZWxldGUgdC5fX3RyYW5zaXRpb259fWZ1bmN0aW9uIFNyKHQsbixlKXt2YXIgcj10Ll9pZDtyZXR1cm4gdC5lYWNoKGZ1bmN0aW9uKCl7dmFyIHQ9QXIodGhpcyxyKTsodC52YWx1ZXx8KHQudmFsdWU9e30pKVtuXT1lLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0pLGZ1bmN0aW9uKHQpe3JldHVybiBUcih0LHIpLnZhbHVlW25dfX1mdW5jdGlvbiBFcih0LG4pe3ZhciBlO3JldHVybigibnVtYmVyIj09dHlwZW9mIG4/dmU6biBpbnN0YW5jZW9mIHZuP2NlOihlPXZuKG4pKT8obj1lLGNlKTpiZSkodCxuKX12YXIga3I9THQucHJvdG90eXBlLmNvbnN0cnVjdG9yO3ZhciBDcj0wO2Z1bmN0aW9uIFByKHQsbixlLHIpe3RoaXMuX2dyb3Vwcz10LHRoaXMuX3BhcmVudHM9bix0aGlzLl9uYW1lPWUsdGhpcy5faWQ9cn1mdW5jdGlvbiB6cih0KXtyZXR1cm4gTHQoKS50cmFuc2l0aW9uKHQpfWZ1bmN0aW9uIFJyKCl7cmV0dXJuKytDcn12YXIgTHI9THQucHJvdG90eXBlO2Z1bmN0aW9uIERyKHQpe3JldHVybigodCo9Mik8PTE/dCp0Oi0tdCooMi10KSsxKS8yfWZ1bmN0aW9uIFVyKHQpe3JldHVybigodCo9Mik8PTE/dCp0KnQ6KHQtPTIpKnQqdCsyKS8yfVByLnByb3RvdHlwZT16ci5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOlByLHNlbGVjdDpmdW5jdGlvbih0KXt2YXIgbj10aGlzLl9uYW1lLGU9dGhpcy5faWQ7ImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PVEodCkpO2Zvcih2YXIgcj10aGlzLl9ncm91cHMsaT1yLmxlbmd0aCxvPW5ldyBBcnJheShpKSxhPTA7YTxpOysrYSlmb3IodmFyIHUsZixjPXJbYV0scz1jLmxlbmd0aCxsPW9bYV09bmV3IEFycmF5KHMpLGg9MDtoPHM7KytoKSh1PWNbaF0pJiYoZj10LmNhbGwodSx1Ll9fZGF0YV9fLGgsYykpJiYoIl9fZGF0YV9fImluIHUmJihmLl9fZGF0YV9fPXUuX19kYXRhX18pLGxbaF09Zix3cihsW2hdLG4sZSxoLGwsVHIodSxlKSkpO3JldHVybiBuZXcgUHIobyx0aGlzLl9wYXJlbnRzLG4sZSl9LHNlbGVjdEFsbDpmdW5jdGlvbih0KXt2YXIgbj10aGlzLl9uYW1lLGU9dGhpcy5faWQ7ImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PUsodCkpO2Zvcih2YXIgcj10aGlzLl9ncm91cHMsaT1yLmxlbmd0aCxvPVtdLGE9W10sdT0wO3U8aTsrK3UpZm9yKHZhciBmLGM9clt1XSxzPWMubGVuZ3RoLGw9MDtsPHM7KytsKWlmKGY9Y1tsXSl7Zm9yKHZhciBoLGQ9dC5jYWxsKGYsZi5fX2RhdGFfXyxsLGMpLHA9VHIoZixlKSx2PTAsZz1kLmxlbmd0aDt2PGc7Kyt2KShoPWRbdl0pJiZ3cihoLG4sZSx2LGQscCk7by5wdXNoKGQpLGEucHVzaChmKX1yZXR1cm4gbmV3IFByKG8sYSxuLGUpfSxmaWx0ZXI6ZnVuY3Rpb24odCl7ImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PXJ0KHQpKTtmb3IodmFyIG49dGhpcy5fZ3JvdXBzLGU9bi5sZW5ndGgscj1uZXcgQXJyYXkoZSksaT0wO2k8ZTsrK2kpZm9yKHZhciBvLGE9bltpXSx1PWEubGVuZ3RoLGY9cltpXT1bXSxjPTA7Yzx1OysrYykobz1hW2NdKSYmdC5jYWxsKG8sby5fX2RhdGFfXyxjLGEpJiZmLnB1c2gobyk7cmV0dXJuIG5ldyBQcihyLHRoaXMuX3BhcmVudHMsdGhpcy5fbmFtZSx0aGlzLl9pZCl9LG1lcmdlOmZ1bmN0aW9uKHQpe2lmKHQuX2lkIT09dGhpcy5faWQpdGhyb3cgbmV3IEVycm9yO2Zvcih2YXIgbj10aGlzLl9ncm91cHMsZT10Ll9ncm91cHMscj1uLmxlbmd0aCxpPWUubGVuZ3RoLG89TWF0aC5taW4ocixpKSxhPW5ldyBBcnJheShyKSx1PTA7dTxvOysrdSlmb3IodmFyIGYsYz1uW3VdLHM9ZVt1XSxsPWMubGVuZ3RoLGg9YVt1XT1uZXcgQXJyYXkobCksZD0wO2Q8bDsrK2QpKGY9Y1tkXXx8c1tkXSkmJihoW2RdPWYpO2Zvcig7dTxyOysrdSlhW3VdPW5bdV07cmV0dXJuIG5ldyBQcihhLHRoaXMuX3BhcmVudHMsdGhpcy5fbmFtZSx0aGlzLl9pZCl9LHNlbGVjdGlvbjpmdW5jdGlvbigpe3JldHVybiBuZXcga3IodGhpcy5fZ3JvdXBzLHRoaXMuX3BhcmVudHMpfSx0cmFuc2l0aW9uOmZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMuX25hbWUsbj10aGlzLl9pZCxlPVJyKCkscj10aGlzLl9ncm91cHMsaT1yLmxlbmd0aCxvPTA7bzxpOysrbylmb3IodmFyIGEsdT1yW29dLGY9dS5sZW5ndGgsYz0wO2M8ZjsrK2MpaWYoYT11W2NdKXt2YXIgcz1UcihhLG4pO3dyKGEsdCxlLGMsdSx7dGltZTpzLnRpbWUrcy5kZWxheStzLmR1cmF0aW9uLGRlbGF5OjAsZHVyYXRpb246cy5kdXJhdGlvbixlYXNlOnMuZWFzZX0pfXJldHVybiBuZXcgUHIocix0aGlzLl9wYXJlbnRzLHQsZSl9LGNhbGw6THIuY2FsbCxub2RlczpMci5ub2Rlcyxub2RlOkxyLm5vZGUsc2l6ZTpMci5zaXplLGVtcHR5OkxyLmVtcHR5LGVhY2g6THIuZWFjaCxvbjpmdW5jdGlvbih0LG4pe3ZhciBlPXRoaXMuX2lkO3JldHVybiBhcmd1bWVudHMubGVuZ3RoPDI/VHIodGhpcy5ub2RlKCksZSkub24ub24odCk6dGhpcy5lYWNoKGZ1bmN0aW9uKHQsbixlKXt2YXIgcixpLG89ZnVuY3Rpb24odCl7cmV0dXJuKHQrIiIpLnRyaW0oKS5zcGxpdCgvXnxccysvKS5ldmVyeShmdW5jdGlvbih0KXt2YXIgbj10LmluZGV4T2YoIi4iKTtyZXR1cm4gbj49MCYmKHQ9dC5zbGljZSgwLG4pKSwhdHx8InN0YXJ0Ij09PXR9KX0obik/TXI6QXI7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGE9byh0aGlzLHQpLHU9YS5vbjt1IT09ciYmKGk9KHI9dSkuY29weSgpKS5vbihuLGUpLGEub249aX19KGUsdCxuKSl9LGF0dHI6ZnVuY3Rpb24odCxuKXt2YXIgZT0kKHQpLHI9InRyYW5zZm9ybSI9PT1lP1BlOkVyO3JldHVybiB0aGlzLmF0dHJUd2Vlbih0LCJmdW5jdGlvbiI9PXR5cGVvZiBuPyhlLmxvY2FsP2Z1bmN0aW9uKHQsbixlKXt2YXIgcixpLG87cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGEsdT1lKHRoaXMpO2lmKG51bGwhPXUpcmV0dXJuKGE9dGhpcy5nZXRBdHRyaWJ1dGVOUyh0LnNwYWNlLHQubG9jYWwpKT09PXU/bnVsbDphPT09ciYmdT09PWk/bzpvPW4ocj1hLGk9dSk7dGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyh0LnNwYWNlLHQubG9jYWwpfX06ZnVuY3Rpb24odCxuLGUpe3ZhciByLGksbztyZXR1cm4gZnVuY3Rpb24oKXt2YXIgYSx1PWUodGhpcyk7aWYobnVsbCE9dSlyZXR1cm4oYT10aGlzLmdldEF0dHJpYnV0ZSh0KSk9PT11P251bGw6YT09PXImJnU9PT1pP286bz1uKHI9YSxpPXUpO3RoaXMucmVtb3ZlQXR0cmlidXRlKHQpfX0pKGUscixTcih0aGlzLCJhdHRyLiIrdCxuKSk6bnVsbD09bj8oZS5sb2NhbD9mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKHQuc3BhY2UsdC5sb2NhbCl9fTpmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnJlbW92ZUF0dHJpYnV0ZSh0KX19KShlKTooZS5sb2NhbD9mdW5jdGlvbih0LG4sZSl7dmFyIHIsaTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbz10aGlzLmdldEF0dHJpYnV0ZU5TKHQuc3BhY2UsdC5sb2NhbCk7cmV0dXJuIG89PT1lP251bGw6bz09PXI/aTppPW4ocj1vLGUpfX06ZnVuY3Rpb24odCxuLGUpe3ZhciByLGk7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG89dGhpcy5nZXRBdHRyaWJ1dGUodCk7cmV0dXJuIG89PT1lP251bGw6bz09PXI/aTppPW4ocj1vLGUpfX0pKGUscixuKyIiKSl9LGF0dHJUd2VlbjpmdW5jdGlvbih0LG4pe3ZhciBlPSJhdHRyLiIrdDtpZihhcmd1bWVudHMubGVuZ3RoPDIpcmV0dXJuKGU9dGhpcy50d2VlbihlKSkmJmUuX3ZhbHVlO2lmKG51bGw9PW4pcmV0dXJuIHRoaXMudHdlZW4oZSxudWxsKTtpZigiZnVuY3Rpb24iIT10eXBlb2Ygbil0aHJvdyBuZXcgRXJyb3I7dmFyIHI9JCh0KTtyZXR1cm4gdGhpcy50d2VlbihlLChyLmxvY2FsP2Z1bmN0aW9uKHQsbil7ZnVuY3Rpb24gZSgpe3ZhciBlPXRoaXMscj1uLmFwcGx5KGUsYXJndW1lbnRzKTtyZXR1cm4gciYmZnVuY3Rpb24obil7ZS5zZXRBdHRyaWJ1dGVOUyh0LnNwYWNlLHQubG9jYWwscihuKSl9fXJldHVybiBlLl92YWx1ZT1uLGV9OmZ1bmN0aW9uKHQsbil7ZnVuY3Rpb24gZSgpe3ZhciBlPXRoaXMscj1uLmFwcGx5KGUsYXJndW1lbnRzKTtyZXR1cm4gciYmZnVuY3Rpb24obil7ZS5zZXRBdHRyaWJ1dGUodCxyKG4pKX19cmV0dXJuIGUuX3ZhbHVlPW4sZX0pKHIsbikpfSxzdHlsZTpmdW5jdGlvbih0LG4sZSl7dmFyIHI9InRyYW5zZm9ybSI9PSh0Kz0iIik/Q2U6RXI7cmV0dXJuIG51bGw9PW4/dGhpcy5zdHlsZVR3ZWVuKHQsZnVuY3Rpb24odCxuKXt2YXIgZSxyLGk7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG89bHQodGhpcyx0KSxhPSh0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KHQpLGx0KHRoaXMsdCkpO3JldHVybiBvPT09YT9udWxsOm89PT1lJiZhPT09cj9pOmk9bihlPW8scj1hKX19KHQscikpLm9uKCJlbmQuc3R5bGUuIit0LGZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3RoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkodCl9fSh0KSk6dGhpcy5zdHlsZVR3ZWVuKHQsImZ1bmN0aW9uIj09dHlwZW9mIG4/ZnVuY3Rpb24odCxuLGUpe3ZhciByLGksbztyZXR1cm4gZnVuY3Rpb24oKXt2YXIgYT1sdCh0aGlzLHQpLHU9ZSh0aGlzKTtyZXR1cm4gbnVsbD09dSYmKHRoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkodCksdT1sdCh0aGlzLHQpKSxhPT09dT9udWxsOmE9PT1yJiZ1PT09aT9vOm89bihyPWEsaT11KX19KHQscixTcih0aGlzLCJzdHlsZS4iK3QsbikpOmZ1bmN0aW9uKHQsbixlKXt2YXIgcixpO3JldHVybiBmdW5jdGlvbigpe3ZhciBvPWx0KHRoaXMsdCk7cmV0dXJuIG89PT1lP251bGw6bz09PXI/aTppPW4ocj1vLGUpfX0odCxyLG4rIiIpLGUpfSxzdHlsZVR3ZWVuOmZ1bmN0aW9uKHQsbixlKXt2YXIgcj0ic3R5bGUuIisodCs9IiIpO2lmKGFyZ3VtZW50cy5sZW5ndGg8MilyZXR1cm4ocj10aGlzLnR3ZWVuKHIpKSYmci5fdmFsdWU7aWYobnVsbD09bilyZXR1cm4gdGhpcy50d2VlbihyLG51bGwpO2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBuKXRocm93IG5ldyBFcnJvcjtyZXR1cm4gdGhpcy50d2VlbihyLGZ1bmN0aW9uKHQsbixlKXtmdW5jdGlvbiByKCl7dmFyIHI9dGhpcyxpPW4uYXBwbHkocixhcmd1bWVudHMpO3JldHVybiBpJiZmdW5jdGlvbihuKXtyLnN0eWxlLnNldFByb3BlcnR5KHQsaShuKSxlKX19cmV0dXJuIHIuX3ZhbHVlPW4scn0odCxuLG51bGw9PWU/IiI6ZSkpfSx0ZXh0OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnR3ZWVuKCJ0ZXh0IiwiZnVuY3Rpb24iPT10eXBlb2YgdD9mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbj10KHRoaXMpO3RoaXMudGV4dENvbnRlbnQ9bnVsbD09bj8iIjpufX0oU3IodGhpcywidGV4dCIsdCkpOmZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3RoaXMudGV4dENvbnRlbnQ9dH19KG51bGw9PXQ/IiI6dCsiIikpfSxyZW1vdmU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vbigiZW5kLnJlbW92ZSIsKHQ9dGhpcy5faWQsZnVuY3Rpb24oKXt2YXIgbj10aGlzLnBhcmVudE5vZGU7Zm9yKHZhciBlIGluIHRoaXMuX190cmFuc2l0aW9uKWlmKCtlIT09dClyZXR1cm47biYmbi5yZW1vdmVDaGlsZCh0aGlzKX0pKTt2YXIgdH0sdHdlZW46ZnVuY3Rpb24odCxuKXt2YXIgZT10aGlzLl9pZDtpZih0Kz0iIixhcmd1bWVudHMubGVuZ3RoPDIpe2Zvcih2YXIgcixpPVRyKHRoaXMubm9kZSgpLGUpLnR3ZWVuLG89MCxhPWkubGVuZ3RoO288YTsrK28paWYoKHI9aVtvXSkubmFtZT09PXQpcmV0dXJuIHIudmFsdWU7cmV0dXJuIG51bGx9cmV0dXJuIHRoaXMuZWFjaCgobnVsbD09bj9mdW5jdGlvbih0LG4pe3ZhciBlLHI7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGk9QXIodGhpcyx0KSxvPWkudHdlZW47aWYobyE9PWUpZm9yKHZhciBhPTAsdT0ocj1lPW8pLmxlbmd0aDthPHU7KythKWlmKHJbYV0ubmFtZT09PW4peyhyPXIuc2xpY2UoKSkuc3BsaWNlKGEsMSk7YnJlYWt9aS50d2Vlbj1yfX06ZnVuY3Rpb24odCxuLGUpe3ZhciByLGk7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGUpdGhyb3cgbmV3IEVycm9yO3JldHVybiBmdW5jdGlvbigpe3ZhciBvPUFyKHRoaXMsdCksYT1vLnR3ZWVuO2lmKGEhPT1yKXtpPShyPWEpLnNsaWNlKCk7Zm9yKHZhciB1PXtuYW1lOm4sdmFsdWU6ZX0sZj0wLGM9aS5sZW5ndGg7ZjxjOysrZilpZihpW2ZdLm5hbWU9PT1uKXtpW2ZdPXU7YnJlYWt9Zj09PWMmJmkucHVzaCh1KX1vLnR3ZWVuPWl9fSkoZSx0LG4pKX0sZGVsYXk6ZnVuY3Rpb24odCl7dmFyIG49dGhpcy5faWQ7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dGhpcy5lYWNoKCgiZnVuY3Rpb24iPT10eXBlb2YgdD9mdW5jdGlvbih0LG4pe3JldHVybiBmdW5jdGlvbigpe01yKHRoaXMsdCkuZGVsYXk9K24uYXBwbHkodGhpcyxhcmd1bWVudHMpfX06ZnVuY3Rpb24odCxuKXtyZXR1cm4gbj0rbixmdW5jdGlvbigpe01yKHRoaXMsdCkuZGVsYXk9bn19KShuLHQpKTpUcih0aGlzLm5vZGUoKSxuKS5kZWxheX0sZHVyYXRpb246ZnVuY3Rpb24odCl7dmFyIG49dGhpcy5faWQ7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dGhpcy5lYWNoKCgiZnVuY3Rpb24iPT10eXBlb2YgdD9mdW5jdGlvbih0LG4pe3JldHVybiBmdW5jdGlvbigpe0FyKHRoaXMsdCkuZHVyYXRpb249K24uYXBwbHkodGhpcyxhcmd1bWVudHMpfX06ZnVuY3Rpb24odCxuKXtyZXR1cm4gbj0rbixmdW5jdGlvbigpe0FyKHRoaXMsdCkuZHVyYXRpb249bn19KShuLHQpKTpUcih0aGlzLm5vZGUoKSxuKS5kdXJhdGlvbn0sZWFzZTpmdW5jdGlvbih0KXt2YXIgbj10aGlzLl9pZDtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90aGlzLmVhY2goZnVuY3Rpb24odCxuKXtpZigiZnVuY3Rpb24iIT10eXBlb2Ygbil0aHJvdyBuZXcgRXJyb3I7cmV0dXJuIGZ1bmN0aW9uKCl7QXIodGhpcyx0KS5lYXNlPW59fShuLHQpKTpUcih0aGlzLm5vZGUoKSxuKS5lYXNlfX07dmFyIHFyPWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4gTWF0aC5wb3codCxuKX1yZXR1cm4gbj0rbixlLmV4cG9uZW50PXQsZX0oMyksT3I9ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiBlKHQpe3JldHVybiAxLU1hdGgucG93KDEtdCxuKX1yZXR1cm4gbj0rbixlLmV4cG9uZW50PXQsZX0oMyksWXI9ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiBlKHQpe3JldHVybigodCo9Mik8PTE/TWF0aC5wb3codCxuKToyLU1hdGgucG93KDItdCxuKSkvMn1yZXR1cm4gbj0rbixlLmV4cG9uZW50PXQsZX0oMyksQnI9TWF0aC5QSSxGcj1Cci8yO2Z1bmN0aW9uIElyKHQpe3JldHVybigxLU1hdGguY29zKEJyKnQpKS8yfWZ1bmN0aW9uIEhyKHQpe3JldHVybigodCo9Mik8PTE/TWF0aC5wb3coMiwxMCp0LTEwKToyLU1hdGgucG93KDIsMTAtMTAqdCkpLzJ9ZnVuY3Rpb24ganIodCl7cmV0dXJuKCh0Kj0yKTw9MT8xLU1hdGguc3FydCgxLXQqdCk6TWF0aC5zcXJ0KDEtKHQtPTIpKnQpKzEpLzJ9dmFyIFhyPTQvMTEsR3I9Ni8xMSxWcj04LzExLCRyPS43NSxXcj05LzExLFpyPTEwLzExLFFyPS45Mzc1LEpyPTIxLzIyLEtyPTYzLzY0LHRpPTEvWHIvWHI7ZnVuY3Rpb24gbmkodCl7cmV0dXJuKHQ9K3QpPFhyP3RpKnQqdDp0PFZyP3RpKih0LT1HcikqdCskcjp0PFpyP3RpKih0LT1XcikqdCtRcjp0aSoodC09SnIpKnQrS3J9dmFyIGVpPWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4gdCp0KigobisxKSp0LW4pfXJldHVybiBuPStuLGUub3ZlcnNob290PXQsZX0oMS43MDE1OCkscmk9ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiBlKHQpe3JldHVybi0tdCp0KigobisxKSp0K24pKzF9cmV0dXJuIG49K24sZS5vdmVyc2hvb3Q9dCxlfSgxLjcwMTU4KSxpaT1mdW5jdGlvbiB0KG4pe2Z1bmN0aW9uIGUodCl7cmV0dXJuKCh0Kj0yKTwxP3QqdCooKG4rMSkqdC1uKToodC09MikqdCooKG4rMSkqdCtuKSsyKS8yfXJldHVybiBuPStuLGUub3ZlcnNob290PXQsZX0oMS43MDE1OCksb2k9MipNYXRoLlBJLGFpPWZ1bmN0aW9uIHQobixlKXt2YXIgcj1NYXRoLmFzaW4oMS8obj1NYXRoLm1heCgxLG4pKSkqKGUvPW9pKTtmdW5jdGlvbiBpKHQpe3JldHVybiBuKk1hdGgucG93KDIsMTAqLS10KSpNYXRoLnNpbigoci10KS9lKX1yZXR1cm4gaS5hbXBsaXR1ZGU9ZnVuY3Rpb24obil7cmV0dXJuIHQobixlKm9pKX0saS5wZXJpb2Q9ZnVuY3Rpb24oZSl7cmV0dXJuIHQobixlKX0saX0oMSwuMyksdWk9ZnVuY3Rpb24gdChuLGUpe3ZhciByPU1hdGguYXNpbigxLyhuPU1hdGgubWF4KDEsbikpKSooZS89b2kpO2Z1bmN0aW9uIGkodCl7cmV0dXJuIDEtbipNYXRoLnBvdygyLC0xMCoodD0rdCkpKk1hdGguc2luKCh0K3IpL2UpfXJldHVybiBpLmFtcGxpdHVkZT1mdW5jdGlvbihuKXtyZXR1cm4gdChuLGUqb2kpfSxpLnBlcmlvZD1mdW5jdGlvbihlKXtyZXR1cm4gdChuLGUpfSxpfSgxLC4zKSxmaT1mdW5jdGlvbiB0KG4sZSl7dmFyIHI9TWF0aC5hc2luKDEvKG49TWF0aC5tYXgoMSxuKSkpKihlLz1vaSk7ZnVuY3Rpb24gaSh0KXtyZXR1cm4oKHQ9Mip0LTEpPDA/bipNYXRoLnBvdygyLDEwKnQpKk1hdGguc2luKChyLXQpL2UpOjItbipNYXRoLnBvdygyLC0xMCp0KSpNYXRoLnNpbigocit0KS9lKSkvMn1yZXR1cm4gaS5hbXBsaXR1ZGU9ZnVuY3Rpb24obil7cmV0dXJuIHQobixlKm9pKX0saS5wZXJpb2Q9ZnVuY3Rpb24oZSl7cmV0dXJuIHQobixlKX0saX0oMSwuMyksY2k9e3RpbWU6bnVsbCxkZWxheTowLGR1cmF0aW9uOjI1MCxlYXNlOlVyfTtmdW5jdGlvbiBzaSh0LG4pe2Zvcih2YXIgZTshKGU9dC5fX3RyYW5zaXRpb24pfHwhKGU9ZVtuXSk7KWlmKCEodD10LnBhcmVudE5vZGUpKXJldHVybiBjaS50aW1lPWlyKCksY2k7cmV0dXJuIGV9THQucHJvdG90eXBlLmludGVycnVwdD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7TnIodGhpcyx0KX0pfSxMdC5wcm90b3R5cGUudHJhbnNpdGlvbj1mdW5jdGlvbih0KXt2YXIgbixlO3QgaW5zdGFuY2VvZiBQcj8obj10Ll9pZCx0PXQuX25hbWUpOihuPVJyKCksKGU9Y2kpLnRpbWU9aXIoKSx0PW51bGw9PXQ/bnVsbDp0KyIiKTtmb3IodmFyIHI9dGhpcy5fZ3JvdXBzLGk9ci5sZW5ndGgsbz0wO288aTsrK28pZm9yKHZhciBhLHU9cltvXSxmPXUubGVuZ3RoLGM9MDtjPGY7KytjKShhPXVbY10pJiZ3cihhLHQsbixjLHUsZXx8c2koYSxuKSk7cmV0dXJuIG5ldyBQcihyLHRoaXMuX3BhcmVudHMsdCxuKX07dmFyIGxpPVtudWxsXTtmdW5jdGlvbiBoaSh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19ZnVuY3Rpb24gZGkodCxuLGUpe3RoaXMudGFyZ2V0PXQsdGhpcy50eXBlPW4sdGhpcy5zZWxlY3Rpb249ZX1mdW5jdGlvbiBwaSgpe3QuZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCl9ZnVuY3Rpb24gdmkoKXt0LmV2ZW50LnByZXZlbnREZWZhdWx0KCksdC5ldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKX12YXIgZ2k9e25hbWU6ImRyYWcifSx5aT17bmFtZToic3BhY2UifSxfaT17bmFtZToiaGFuZGxlIn0sYmk9e25hbWU6ImNlbnRlciJ9LG1pPXtuYW1lOiJ4IixoYW5kbGVzOlsiZSIsInciXS5tYXAoRWkpLGlucHV0OmZ1bmN0aW9uKHQsbil7cmV0dXJuIHQmJltbdFswXSxuWzBdWzFdXSxbdFsxXSxuWzFdWzFdXV19LG91dHB1dDpmdW5jdGlvbih0KXtyZXR1cm4gdCYmW3RbMF1bMF0sdFsxXVswXV19fSx4aT17bmFtZToieSIsaGFuZGxlczpbIm4iLCJzIl0ubWFwKEVpKSxpbnB1dDpmdW5jdGlvbih0LG4pe3JldHVybiB0JiZbW25bMF1bMF0sdFswXV0sW25bMV1bMF0sdFsxXV1dfSxvdXRwdXQ6ZnVuY3Rpb24odCl7cmV0dXJuIHQmJlt0WzBdWzFdLHRbMV1bMV1dfX0sd2k9e25hbWU6Inh5IixoYW5kbGVzOlsibiIsImUiLCJzIiwidyIsIm53IiwibmUiLCJzZSIsInN3Il0ubWFwKEVpKSxpbnB1dDpmdW5jdGlvbih0KXtyZXR1cm4gdH0sb3V0cHV0OmZ1bmN0aW9uKHQpe3JldHVybiB0fX0sTWk9e292ZXJsYXk6ImNyb3NzaGFpciIsc2VsZWN0aW9uOiJtb3ZlIixuOiJucy1yZXNpemUiLGU6ImV3LXJlc2l6ZSIsczoibnMtcmVzaXplIix3OiJldy1yZXNpemUiLG53OiJud3NlLXJlc2l6ZSIsbmU6Im5lc3ctcmVzaXplIixzZToibndzZS1yZXNpemUiLHN3OiJuZXN3LXJlc2l6ZSJ9LEFpPXtlOiJ3Iix3OiJlIixudzoibmUiLG5lOiJudyIsc2U6InN3Iixzdzoic2UifSxUaT17bjoicyIsczoibiIsbnc6InN3IixuZToic2UiLHNlOiJuZSIsc3c6Im53In0sTmk9e292ZXJsYXk6MSxzZWxlY3Rpb246MSxuOm51bGwsZToxLHM6bnVsbCx3Oi0xLG53Oi0xLG5lOjEsc2U6MSxzdzotMX0sU2k9e292ZXJsYXk6MSxzZWxlY3Rpb246MSxuOi0xLGU6bnVsbCxzOjEsdzpudWxsLG53Oi0xLG5lOi0xLHNlOjEsc3c6MX07ZnVuY3Rpb24gRWkodCl7cmV0dXJue3R5cGU6dH19ZnVuY3Rpb24ga2koKXtyZXR1cm4hdC5ldmVudC5idXR0b259ZnVuY3Rpb24gQ2koKXt2YXIgdD10aGlzLm93bmVyU1ZHRWxlbWVudHx8dGhpcztyZXR1cm5bWzAsMF0sW3Qud2lkdGguYmFzZVZhbC52YWx1ZSx0LmhlaWdodC5iYXNlVmFsLnZhbHVlXV19ZnVuY3Rpb24gUGkodCl7Zm9yKDshdC5fX2JydXNoOylpZighKHQ9dC5wYXJlbnROb2RlKSlyZXR1cm47cmV0dXJuIHQuX19icnVzaH1mdW5jdGlvbiB6aSh0KXtyZXR1cm4gdFswXVswXT09PXRbMV1bMF18fHRbMF1bMV09PT10WzFdWzFdfWZ1bmN0aW9uIFJpKG4pe3ZhciBlLHI9Q2ksaT1raSxvPUkodSwic3RhcnQiLCJicnVzaCIsImVuZCIpLGE9NjtmdW5jdGlvbiB1KHQpe3ZhciBlPXQucHJvcGVydHkoIl9fYnJ1c2giLGgpLnNlbGVjdEFsbCgiLm92ZXJsYXkiKS5kYXRhKFtFaSgib3ZlcmxheSIpXSk7ZS5lbnRlcigpLmFwcGVuZCgicmVjdCIpLmF0dHIoImNsYXNzIiwib3ZlcmxheSIpLmF0dHIoInBvaW50ZXItZXZlbnRzIiwiYWxsIikuYXR0cigiY3Vyc29yIixNaS5vdmVybGF5KS5tZXJnZShlKS5lYWNoKGZ1bmN0aW9uKCl7dmFyIHQ9UGkodGhpcykuZXh0ZW50O0R0KHRoaXMpLmF0dHIoIngiLHRbMF1bMF0pLmF0dHIoInkiLHRbMF1bMV0pLmF0dHIoIndpZHRoIix0WzFdWzBdLXRbMF1bMF0pLmF0dHIoImhlaWdodCIsdFsxXVsxXS10WzBdWzFdKX0pLHQuc2VsZWN0QWxsKCIuc2VsZWN0aW9uIikuZGF0YShbRWkoInNlbGVjdGlvbiIpXSkuZW50ZXIoKS5hcHBlbmQoInJlY3QiKS5hdHRyKCJjbGFzcyIsInNlbGVjdGlvbiIpLmF0dHIoImN1cnNvciIsTWkuc2VsZWN0aW9uKS5hdHRyKCJmaWxsIiwiIzc3NyIpLmF0dHIoImZpbGwtb3BhY2l0eSIsLjMpLmF0dHIoInN0cm9rZSIsIiNmZmYiKS5hdHRyKCJzaGFwZS1yZW5kZXJpbmciLCJjcmlzcEVkZ2VzIik7dmFyIHI9dC5zZWxlY3RBbGwoIi5oYW5kbGUiKS5kYXRhKG4uaGFuZGxlcyxmdW5jdGlvbih0KXtyZXR1cm4gdC50eXBlfSk7ci5leGl0KCkucmVtb3ZlKCksci5lbnRlcigpLmFwcGVuZCgicmVjdCIpLmF0dHIoImNsYXNzIixmdW5jdGlvbih0KXtyZXR1cm4iaGFuZGxlIGhhbmRsZS0tIit0LnR5cGV9KS5hdHRyKCJjdXJzb3IiLGZ1bmN0aW9uKHQpe3JldHVybiBNaVt0LnR5cGVdfSksdC5lYWNoKGYpLmF0dHIoImZpbGwiLCJub25lIikuYXR0cigicG9pbnRlci1ldmVudHMiLCJhbGwiKS5zdHlsZSgiLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yIiwicmdiYSgwLDAsMCwwKSIpLm9uKCJtb3VzZWRvd24uYnJ1c2ggdG91Y2hzdGFydC5icnVzaCIsbCl9ZnVuY3Rpb24gZigpe3ZhciB0PUR0KHRoaXMpLG49UGkodGhpcykuc2VsZWN0aW9uO24/KHQuc2VsZWN0QWxsKCIuc2VsZWN0aW9uIikuc3R5bGUoImRpc3BsYXkiLG51bGwpLmF0dHIoIngiLG5bMF1bMF0pLmF0dHIoInkiLG5bMF1bMV0pLmF0dHIoIndpZHRoIixuWzFdWzBdLW5bMF1bMF0pLmF0dHIoImhlaWdodCIsblsxXVsxXS1uWzBdWzFdKSx0LnNlbGVjdEFsbCgiLmhhbmRsZSIpLnN0eWxlKCJkaXNwbGF5IixudWxsKS5hdHRyKCJ4IixmdW5jdGlvbih0KXtyZXR1cm4iZSI9PT10LnR5cGVbdC50eXBlLmxlbmd0aC0xXT9uWzFdWzBdLWEvMjpuWzBdWzBdLWEvMn0pLmF0dHIoInkiLGZ1bmN0aW9uKHQpe3JldHVybiJzIj09PXQudHlwZVswXT9uWzFdWzFdLWEvMjpuWzBdWzFdLWEvMn0pLmF0dHIoIndpZHRoIixmdW5jdGlvbih0KXtyZXR1cm4ibiI9PT10LnR5cGV8fCJzIj09PXQudHlwZT9uWzFdWzBdLW5bMF1bMF0rYTphfSkuYXR0cigiaGVpZ2h0IixmdW5jdGlvbih0KXtyZXR1cm4iZSI9PT10LnR5cGV8fCJ3Ij09PXQudHlwZT9uWzFdWzFdLW5bMF1bMV0rYTphfSkpOnQuc2VsZWN0QWxsKCIuc2VsZWN0aW9uLC5oYW5kbGUiKS5zdHlsZSgiZGlzcGxheSIsIm5vbmUiKS5hdHRyKCJ4IixudWxsKS5hdHRyKCJ5IixudWxsKS5hdHRyKCJ3aWR0aCIsbnVsbCkuYXR0cigiaGVpZ2h0IixudWxsKX1mdW5jdGlvbiBjKHQsbil7cmV0dXJuIHQuX19icnVzaC5lbWl0dGVyfHxuZXcgcyh0LG4pfWZ1bmN0aW9uIHModCxuKXt0aGlzLnRoYXQ9dCx0aGlzLmFyZ3M9bix0aGlzLnN0YXRlPXQuX19icnVzaCx0aGlzLmFjdGl2ZT0wfWZ1bmN0aW9uIGwoKXtpZih0LmV2ZW50LnRvdWNoZXMpe2lmKHQuZXZlbnQuY2hhbmdlZFRvdWNoZXMubGVuZ3RoPHQuZXZlbnQudG91Y2hlcy5sZW5ndGgpcmV0dXJuIHZpKCl9ZWxzZSBpZihlKXJldHVybjtpZihpLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl7dmFyIHIsbyxhLHUscyxsLGgsZCxwLHYsZyx5LF8sYj10aGlzLG09dC5ldmVudC50YXJnZXQuX19kYXRhX18udHlwZSx4PSJzZWxlY3Rpb24iPT09KHQuZXZlbnQubWV0YUtleT9tPSJvdmVybGF5IjptKT9naTp0LmV2ZW50LmFsdEtleT9iaTpfaSx3PW49PT14aT9udWxsOk5pW21dLE09bj09PW1pP251bGw6U2lbbV0sQT1QaShiKSxUPUEuZXh0ZW50LE49QS5zZWxlY3Rpb24sUz1UWzBdWzBdLEU9VFswXVsxXSxrPVRbMV1bMF0sQz1UWzFdWzFdLFA9dyYmTSYmdC5ldmVudC5zaGlmdEtleSx6PUZ0KGIpLFI9eixMPWMoYixhcmd1bWVudHMpLmJlZm9yZXN0YXJ0KCk7Im92ZXJsYXkiPT09bT9BLnNlbGVjdGlvbj1OPVtbcj1uPT09eGk/Uzp6WzBdLGE9bj09PW1pP0U6elsxXV0sW3M9bj09PXhpP2s6cixoPW49PT1taT9DOmFdXToocj1OWzBdWzBdLGE9TlswXVsxXSxzPU5bMV1bMF0saD1OWzFdWzFdKSxvPXIsdT1hLGw9cyxkPWg7dmFyIEQ9RHQoYikuYXR0cigicG9pbnRlci1ldmVudHMiLCJub25lIiksVT1ELnNlbGVjdEFsbCgiLm92ZXJsYXkiKS5hdHRyKCJjdXJzb3IiLE1pW21dKTtpZih0LmV2ZW50LnRvdWNoZXMpRC5vbigidG91Y2htb3ZlLmJydXNoIixPLCEwKS5vbigidG91Y2hlbmQuYnJ1c2ggdG91Y2hjYW5jZWwuYnJ1c2giLEIsITApO2Vsc2V7dmFyIHE9RHQodC5ldmVudC52aWV3KS5vbigia2V5ZG93bi5icnVzaCIsZnVuY3Rpb24oKXtzd2l0Y2godC5ldmVudC5rZXlDb2RlKXtjYXNlIDE2OlA9dyYmTTticmVhaztjYXNlIDE4Ong9PT1faSYmKHcmJihzPWwtcCp3LHI9bytwKncpLE0mJihoPWQtdipNLGE9dSt2Kk0pLHg9YmksWSgpKTticmVhaztjYXNlIDMyOnghPT1faSYmeCE9PWJpfHwodzwwP3M9bC1wOnc+MCYmKHI9by1wKSxNPDA/aD1kLXY6TT4wJiYoYT11LXYpLHg9eWksVS5hdHRyKCJjdXJzb3IiLE1pLnNlbGVjdGlvbiksWSgpKTticmVhaztkZWZhdWx0OnJldHVybn12aSgpfSwhMCkub24oImtleXVwLmJydXNoIixmdW5jdGlvbigpe3N3aXRjaCh0LmV2ZW50LmtleUNvZGUpe2Nhc2UgMTY6UCYmKHk9Xz1QPSExLFkoKSk7YnJlYWs7Y2FzZSAxODp4PT09YmkmJih3PDA/cz1sOnc+MCYmKHI9byksTTwwP2g9ZDpNPjAmJihhPXUpLHg9X2ksWSgpKTticmVhaztjYXNlIDMyOng9PT15aSYmKHQuZXZlbnQuYWx0S2V5Pyh3JiYocz1sLXAqdyxyPW8rcCp3KSxNJiYoaD1kLXYqTSxhPXUrdipNKSx4PWJpKToodzwwP3M9bDp3PjAmJihyPW8pLE08MD9oPWQ6TT4wJiYoYT11KSx4PV9pKSxVLmF0dHIoImN1cnNvciIsTWlbbV0pLFkoKSk7YnJlYWs7ZGVmYXVsdDpyZXR1cm59dmkoKX0sITApLm9uKCJtb3VzZW1vdmUuYnJ1c2giLE8sITApLm9uKCJtb3VzZXVwLmJydXNoIixCLCEwKTtYdCh0LmV2ZW50LnZpZXcpfXBpKCksTnIoYiksZi5jYWxsKGIpLEwuc3RhcnQoKX1mdW5jdGlvbiBPKCl7dmFyIHQ9RnQoYik7IVB8fHl8fF98fChNYXRoLmFicyh0WzBdLVJbMF0pPk1hdGguYWJzKHRbMV0tUlsxXSk/Xz0hMDp5PSEwKSxSPXQsZz0hMCx2aSgpLFkoKX1mdW5jdGlvbiBZKCl7dmFyIHQ7c3dpdGNoKHA9UlswXS16WzBdLHY9UlsxXS16WzFdLHgpe2Nhc2UgeWk6Y2FzZSBnaTp3JiYocD1NYXRoLm1heChTLXIsTWF0aC5taW4oay1zLHApKSxvPXIrcCxsPXMrcCksTSYmKHY9TWF0aC5tYXgoRS1hLE1hdGgubWluKEMtaCx2KSksdT1hK3YsZD1oK3YpO2JyZWFrO2Nhc2UgX2k6dzwwPyhwPU1hdGgubWF4KFMtcixNYXRoLm1pbihrLXIscCkpLG89citwLGw9cyk6dz4wJiYocD1NYXRoLm1heChTLXMsTWF0aC5taW4oay1zLHApKSxvPXIsbD1zK3ApLE08MD8odj1NYXRoLm1heChFLWEsTWF0aC5taW4oQy1hLHYpKSx1PWErdixkPWgpOk0+MCYmKHY9TWF0aC5tYXgoRS1oLE1hdGgubWluKEMtaCx2KSksdT1hLGQ9aCt2KTticmVhaztjYXNlIGJpOncmJihvPU1hdGgubWF4KFMsTWF0aC5taW4oayxyLXAqdykpLGw9TWF0aC5tYXgoUyxNYXRoLm1pbihrLHMrcCp3KSkpLE0mJih1PU1hdGgubWF4KEUsTWF0aC5taW4oQyxhLXYqTSkpLGQ9TWF0aC5tYXgoRSxNYXRoLm1pbihDLGgrdipNKSkpfWw8byYmKHcqPS0xLHQ9cixyPXMscz10LHQ9byxvPWwsbD10LG0gaW4gQWkmJlUuYXR0cigiY3Vyc29yIixNaVttPUFpW21dXSkpLGQ8dSYmKE0qPS0xLHQ9YSxhPWgsaD10LHQ9dSx1PWQsZD10LG0gaW4gVGkmJlUuYXR0cigiY3Vyc29yIixNaVttPVRpW21dXSkpLEEuc2VsZWN0aW9uJiYoTj1BLnNlbGVjdGlvbikseSYmKG89TlswXVswXSxsPU5bMV1bMF0pLF8mJih1PU5bMF1bMV0sZD1OWzFdWzFdKSxOWzBdWzBdPT09byYmTlswXVsxXT09PXUmJk5bMV1bMF09PT1sJiZOWzFdWzFdPT09ZHx8KEEuc2VsZWN0aW9uPVtbbyx1XSxbbCxkXV0sZi5jYWxsKGIpLEwuYnJ1c2goKSl9ZnVuY3Rpb24gQigpe2lmKHBpKCksdC5ldmVudC50b3VjaGVzKXtpZih0LmV2ZW50LnRvdWNoZXMubGVuZ3RoKXJldHVybjtlJiZjbGVhclRpbWVvdXQoZSksZT1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZT1udWxsfSw1MDApLEQub24oInRvdWNobW92ZS5icnVzaCB0b3VjaGVuZC5icnVzaCB0b3VjaGNhbmNlbC5icnVzaCIsbnVsbCl9ZWxzZSBHdCh0LmV2ZW50LnZpZXcsZykscS5vbigia2V5ZG93bi5icnVzaCBrZXl1cC5icnVzaCBtb3VzZW1vdmUuYnJ1c2ggbW91c2V1cC5icnVzaCIsbnVsbCk7RC5hdHRyKCJwb2ludGVyLWV2ZW50cyIsImFsbCIpLFUuYXR0cigiY3Vyc29yIixNaS5vdmVybGF5KSxBLnNlbGVjdGlvbiYmKE49QS5zZWxlY3Rpb24pLHppKE4pJiYoQS5zZWxlY3Rpb249bnVsbCxmLmNhbGwoYikpLEwuZW5kKCl9fWZ1bmN0aW9uIGgoKXt2YXIgdD10aGlzLl9fYnJ1c2h8fHtzZWxlY3Rpb246bnVsbH07cmV0dXJuIHQuZXh0ZW50PXIuYXBwbHkodGhpcyxhcmd1bWVudHMpLHQuZGltPW4sdH1yZXR1cm4gdS5tb3ZlPWZ1bmN0aW9uKHQsZSl7dC5zZWxlY3Rpb24/dC5vbigic3RhcnQuYnJ1c2giLGZ1bmN0aW9uKCl7Yyh0aGlzLGFyZ3VtZW50cykuYmVmb3Jlc3RhcnQoKS5zdGFydCgpfSkub24oImludGVycnVwdC5icnVzaCBlbmQuYnJ1c2giLGZ1bmN0aW9uKCl7Yyh0aGlzLGFyZ3VtZW50cykuZW5kKCl9KS50d2VlbigiYnJ1c2giLGZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxyPXQuX19icnVzaCxpPWModCxhcmd1bWVudHMpLG89ci5zZWxlY3Rpb24sYT1uLmlucHV0KCJmdW5jdGlvbiI9PXR5cGVvZiBlP2UuYXBwbHkodGhpcyxhcmd1bWVudHMpOmUsci5leHRlbnQpLHU9bWUobyxhKTtmdW5jdGlvbiBzKG4pe3Iuc2VsZWN0aW9uPTE9PT1uJiZ6aShhKT9udWxsOnUobiksZi5jYWxsKHQpLGkuYnJ1c2goKX1yZXR1cm4gbyYmYT9zOnMoMSl9KTp0LmVhY2goZnVuY3Rpb24oKXt2YXIgdD1hcmd1bWVudHMscj10aGlzLl9fYnJ1c2gsaT1uLmlucHV0KCJmdW5jdGlvbiI9PXR5cGVvZiBlP2UuYXBwbHkodGhpcyx0KTplLHIuZXh0ZW50KSxvPWModGhpcyx0KS5iZWZvcmVzdGFydCgpO05yKHRoaXMpLHIuc2VsZWN0aW9uPW51bGw9PWl8fHppKGkpP251bGw6aSxmLmNhbGwodGhpcyksby5zdGFydCgpLmJydXNoKCkuZW5kKCl9KX0scy5wcm90b3R5cGU9e2JlZm9yZXN0YXJ0OmZ1bmN0aW9uKCl7cmV0dXJuIDE9PSsrdGhpcy5hY3RpdmUmJih0aGlzLnN0YXRlLmVtaXR0ZXI9dGhpcyx0aGlzLnN0YXJ0aW5nPSEwKSx0aGlzfSxzdGFydDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXJ0aW5nJiYodGhpcy5zdGFydGluZz0hMSx0aGlzLmVtaXQoInN0YXJ0IikpLHRoaXN9LGJydXNoOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZW1pdCgiYnJ1c2giKSx0aGlzfSxlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gMD09LS10aGlzLmFjdGl2ZSYmKGRlbGV0ZSB0aGlzLnN0YXRlLmVtaXR0ZXIsdGhpcy5lbWl0KCJlbmQiKSksdGhpc30sZW1pdDpmdW5jdGlvbih0KXtDdChuZXcgZGkodSx0LG4ub3V0cHV0KHRoaXMuc3RhdGUuc2VsZWN0aW9uKSksby5hcHBseSxvLFt0LHRoaXMudGhhdCx0aGlzLmFyZ3NdKX19LHUuZXh0ZW50PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6aGkoW1srdFswXVswXSwrdFswXVsxXV0sWyt0WzFdWzBdLCt0WzFdWzFdXV0pLHUpOnJ9LHUuZmlsdGVyPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6aGkoISF0KSx1KTppfSx1LmhhbmRsZVNpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9K3QsdSk6YX0sdS5vbj1mdW5jdGlvbigpe3ZhciB0PW8ub24uYXBwbHkobyxhcmd1bWVudHMpO3JldHVybiB0PT09bz91OnR9LHV9dmFyIExpPU1hdGguY29zLERpPU1hdGguc2luLFVpPU1hdGguUEkscWk9VWkvMixPaT0yKlVpLFlpPU1hdGgubWF4O3ZhciBCaT1BcnJheS5wcm90b3R5cGUuc2xpY2U7ZnVuY3Rpb24gRmkodCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fXZhciBJaT1NYXRoLlBJLEhpPTIqSWksamk9SGktMWUtNjtmdW5jdGlvbiBYaSgpe3RoaXMuX3gwPXRoaXMuX3kwPXRoaXMuX3gxPXRoaXMuX3kxPW51bGwsdGhpcy5fPSIifWZ1bmN0aW9uIEdpKCl7cmV0dXJuIG5ldyBYaX1mdW5jdGlvbiBWaSh0KXtyZXR1cm4gdC5zb3VyY2V9ZnVuY3Rpb24gJGkodCl7cmV0dXJuIHQudGFyZ2V0fWZ1bmN0aW9uIFdpKHQpe3JldHVybiB0LnJhZGl1c31mdW5jdGlvbiBaaSh0KXtyZXR1cm4gdC5zdGFydEFuZ2xlfWZ1bmN0aW9uIFFpKHQpe3JldHVybiB0LmVuZEFuZ2xlfVhpLnByb3RvdHlwZT1HaS5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOlhpLG1vdmVUbzpmdW5jdGlvbih0LG4pe3RoaXMuXys9Ik0iKyh0aGlzLl94MD10aGlzLl94MT0rdCkrIiwiKyh0aGlzLl95MD10aGlzLl95MT0rbil9LGNsb3NlUGF0aDpmdW5jdGlvbigpe251bGwhPT10aGlzLl94MSYmKHRoaXMuX3gxPXRoaXMuX3gwLHRoaXMuX3kxPXRoaXMuX3kwLHRoaXMuXys9IloiKX0sbGluZVRvOmZ1bmN0aW9uKHQsbil7dGhpcy5fKz0iTCIrKHRoaXMuX3gxPSt0KSsiLCIrKHRoaXMuX3kxPStuKX0scXVhZHJhdGljQ3VydmVUbzpmdW5jdGlvbih0LG4sZSxyKXt0aGlzLl8rPSJRIisgK3QrIiwiKyArbisiLCIrKHRoaXMuX3gxPStlKSsiLCIrKHRoaXMuX3kxPStyKX0sYmV6aWVyQ3VydmVUbzpmdW5jdGlvbih0LG4sZSxyLGksbyl7dGhpcy5fKz0iQyIrICt0KyIsIisgK24rIiwiKyArZSsiLCIrICtyKyIsIisodGhpcy5feDE9K2kpKyIsIisodGhpcy5feTE9K28pfSxhcmNUbzpmdW5jdGlvbih0LG4sZSxyLGkpe3Q9K3Qsbj0rbixlPStlLHI9K3IsaT0raTt2YXIgbz10aGlzLl94MSxhPXRoaXMuX3kxLHU9ZS10LGY9ci1uLGM9by10LHM9YS1uLGw9YypjK3MqcztpZihpPDApdGhyb3cgbmV3IEVycm9yKCJuZWdhdGl2ZSByYWRpdXM6ICIraSk7aWYobnVsbD09PXRoaXMuX3gxKXRoaXMuXys9Ik0iKyh0aGlzLl94MT10KSsiLCIrKHRoaXMuX3kxPW4pO2Vsc2UgaWYobD4xZS02KWlmKE1hdGguYWJzKHMqdS1mKmMpPjFlLTYmJmkpe3ZhciBoPWUtbyxkPXItYSxwPXUqdStmKmYsdj1oKmgrZCpkLGc9TWF0aC5zcXJ0KHApLHk9TWF0aC5zcXJ0KGwpLF89aSpNYXRoLnRhbigoSWktTWF0aC5hY29zKChwK2wtdikvKDIqZyp5KSkpLzIpLGI9Xy95LG09Xy9nO01hdGguYWJzKGItMSk+MWUtNiYmKHRoaXMuXys9IkwiKyh0K2IqYykrIiwiKyhuK2IqcykpLHRoaXMuXys9IkEiK2krIiwiK2krIiwwLDAsIisgKyhzKmg+YypkKSsiLCIrKHRoaXMuX3gxPXQrbSp1KSsiLCIrKHRoaXMuX3kxPW4rbSpmKX1lbHNlIHRoaXMuXys9IkwiKyh0aGlzLl94MT10KSsiLCIrKHRoaXMuX3kxPW4pO2Vsc2U7fSxhcmM6ZnVuY3Rpb24odCxuLGUscixpLG8pe3Q9K3Qsbj0rbjt2YXIgYT0oZT0rZSkqTWF0aC5jb3MociksdT1lKk1hdGguc2luKHIpLGY9dCthLGM9bit1LHM9MV5vLGw9bz9yLWk6aS1yO2lmKGU8MCl0aHJvdyBuZXcgRXJyb3IoIm5lZ2F0aXZlIHJhZGl1czogIitlKTtudWxsPT09dGhpcy5feDE/dGhpcy5fKz0iTSIrZisiLCIrYzooTWF0aC5hYnModGhpcy5feDEtZik+MWUtNnx8TWF0aC5hYnModGhpcy5feTEtYyk+MWUtNikmJih0aGlzLl8rPSJMIitmKyIsIitjKSxlJiYobDwwJiYobD1sJUhpK0hpKSxsPmppP3RoaXMuXys9IkEiK2UrIiwiK2UrIiwwLDEsIitzKyIsIisodC1hKSsiLCIrKG4tdSkrIkEiK2UrIiwiK2UrIiwwLDEsIitzKyIsIisodGhpcy5feDE9ZikrIiwiKyh0aGlzLl95MT1jKTpsPjFlLTYmJih0aGlzLl8rPSJBIitlKyIsIitlKyIsMCwiKyArKGw+PUlpKSsiLCIrcysiLCIrKHRoaXMuX3gxPXQrZSpNYXRoLmNvcyhpKSkrIiwiKyh0aGlzLl95MT1uK2UqTWF0aC5zaW4oaSkpKSl9LHJlY3Q6ZnVuY3Rpb24odCxuLGUscil7dGhpcy5fKz0iTSIrKHRoaXMuX3gwPXRoaXMuX3gxPSt0KSsiLCIrKHRoaXMuX3kwPXRoaXMuX3kxPStuKSsiaCIrICtlKyJ2IisgK3IrImgiKy1lKyJaIn0sdG9TdHJpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ffX07ZnVuY3Rpb24gSmkoKXt9ZnVuY3Rpb24gS2kodCxuKXt2YXIgZT1uZXcgSmk7aWYodCBpbnN0YW5jZW9mIEppKXQuZWFjaChmdW5jdGlvbih0LG4pe2Uuc2V0KG4sdCl9KTtlbHNlIGlmKEFycmF5LmlzQXJyYXkodCkpe3ZhciByLGk9LTEsbz10Lmxlbmd0aDtpZihudWxsPT1uKWZvcig7KytpPG87KWUuc2V0KGksdFtpXSk7ZWxzZSBmb3IoOysraTxvOyllLnNldChuKHI9dFtpXSxpLHQpLHIpfWVsc2UgaWYodClmb3IodmFyIGEgaW4gdCllLnNldChhLHRbYV0pO3JldHVybiBlfWZ1bmN0aW9uIHRvKCl7cmV0dXJue319ZnVuY3Rpb24gbm8odCxuLGUpe3Rbbl09ZX1mdW5jdGlvbiBlbygpe3JldHVybiBLaSgpfWZ1bmN0aW9uIHJvKHQsbixlKXt0LnNldChuLGUpfWZ1bmN0aW9uIGlvKCl7fUppLnByb3RvdHlwZT1LaS5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOkppLGhhczpmdW5jdGlvbih0KXtyZXR1cm4iJCIrdCBpbiB0aGlzfSxnZXQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXNbIiQiK3RdfSxzZXQ6ZnVuY3Rpb24odCxuKXtyZXR1cm4gdGhpc1siJCIrdF09bix0aGlzfSxyZW1vdmU6ZnVuY3Rpb24odCl7dmFyIG49IiQiK3Q7cmV0dXJuIG4gaW4gdGhpcyYmZGVsZXRlIHRoaXNbbl19LGNsZWFyOmZ1bmN0aW9uKCl7Zm9yKHZhciB0IGluIHRoaXMpIiQiPT09dFswXSYmZGVsZXRlIHRoaXNbdF19LGtleXM6ZnVuY3Rpb24oKXt2YXIgdD1bXTtmb3IodmFyIG4gaW4gdGhpcykiJCI9PT1uWzBdJiZ0LnB1c2gobi5zbGljZSgxKSk7cmV0dXJuIHR9LHZhbHVlczpmdW5jdGlvbigpe3ZhciB0PVtdO2Zvcih2YXIgbiBpbiB0aGlzKSIkIj09PW5bMF0mJnQucHVzaCh0aGlzW25dKTtyZXR1cm4gdH0sZW50cmllczpmdW5jdGlvbigpe3ZhciB0PVtdO2Zvcih2YXIgbiBpbiB0aGlzKSIkIj09PW5bMF0mJnQucHVzaCh7a2V5Om4uc2xpY2UoMSksdmFsdWU6dGhpc1tuXX0pO3JldHVybiB0fSxzaXplOmZ1bmN0aW9uKCl7dmFyIHQ9MDtmb3IodmFyIG4gaW4gdGhpcykiJCI9PT1uWzBdJiYrK3Q7cmV0dXJuIHR9LGVtcHR5OmZ1bmN0aW9uKCl7Zm9yKHZhciB0IGluIHRoaXMpaWYoIiQiPT09dFswXSlyZXR1cm4hMTtyZXR1cm4hMH0sZWFjaDpmdW5jdGlvbih0KXtmb3IodmFyIG4gaW4gdGhpcykiJCI9PT1uWzBdJiZ0KHRoaXNbbl0sbi5zbGljZSgxKSx0aGlzKX19O3ZhciBvbz1LaS5wcm90b3R5cGU7ZnVuY3Rpb24gYW8odCxuKXt2YXIgZT1uZXcgaW87aWYodCBpbnN0YW5jZW9mIGlvKXQuZWFjaChmdW5jdGlvbih0KXtlLmFkZCh0KX0pO2Vsc2UgaWYodCl7dmFyIHI9LTEsaT10Lmxlbmd0aDtpZihudWxsPT1uKWZvcig7KytyPGk7KWUuYWRkKHRbcl0pO2Vsc2UgZm9yKDsrK3I8aTspZS5hZGQobih0W3JdLHIsdCkpfXJldHVybiBlfWlvLnByb3RvdHlwZT1hby5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOmlvLGhhczpvby5oYXMsYWRkOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzWyIkIisodCs9IiIpXT10LHRoaXN9LHJlbW92ZTpvby5yZW1vdmUsY2xlYXI6b28uY2xlYXIsdmFsdWVzOm9vLmtleXMsc2l6ZTpvby5zaXplLGVtcHR5Om9vLmVtcHR5LGVhY2g6b28uZWFjaH07dmFyIHVvPUFycmF5LnByb3RvdHlwZS5zbGljZTtmdW5jdGlvbiBmbyh0LG4pe3JldHVybiB0LW59ZnVuY3Rpb24gY28odCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fWZ1bmN0aW9uIHNvKHQsbil7Zm9yKHZhciBlLHI9LTEsaT1uLmxlbmd0aDsrK3I8aTspaWYoZT1sbyh0LG5bcl0pKXJldHVybiBlO3JldHVybiAwfWZ1bmN0aW9uIGxvKHQsbil7Zm9yKHZhciBlPW5bMF0scj1uWzFdLGk9LTEsbz0wLGE9dC5sZW5ndGgsdT1hLTE7bzxhO3U9bysrKXt2YXIgZj10W29dLGM9ZlswXSxzPWZbMV0sbD10W3VdLGg9bFswXSxkPWxbMV07aWYoaG8oZixsLG4pKXJldHVybiAwO3M+ciE9ZD5yJiZlPChoLWMpKihyLXMpLyhkLXMpK2MmJihpPS1pKX1yZXR1cm4gaX1mdW5jdGlvbiBobyh0LG4sZSl7dmFyIHIsaSxvLGE7cmV0dXJuIGZ1bmN0aW9uKHQsbixlKXtyZXR1cm4oblswXS10WzBdKSooZVsxXS10WzFdKT09KGVbMF0tdFswXSkqKG5bMV0tdFsxXSl9KHQsbixlKSYmKGk9dFtyPSsodFswXT09PW5bMF0pXSxvPWVbcl0sYT1uW3JdLGk8PW8mJm88PWF8fGE8PW8mJm88PWkpfWZ1bmN0aW9uIHBvKCl7fXZhciB2bz1bW10sW1tbMSwxLjVdLFsuNSwxXV1dLFtbWzEuNSwxXSxbMSwxLjVdXV0sW1tbMS41LDFdLFsuNSwxXV1dLFtbWzEsLjVdLFsxLjUsMV1dXSxbW1sxLDEuNV0sWy41LDFdXSxbWzEsLjVdLFsxLjUsMV1dXSxbW1sxLC41XSxbMSwxLjVdXV0sW1tbMSwuNV0sWy41LDFdXV0sW1tbLjUsMV0sWzEsLjVdXV0sW1tbMSwxLjVdLFsxLC41XV1dLFtbWy41LDFdLFsxLC41XV0sW1sxLjUsMV0sWzEsMS41XV1dLFtbWzEuNSwxXSxbMSwuNV1dXSxbW1suNSwxXSxbMS41LDFdXV0sW1tbMSwxLjVdLFsxLjUsMV1dXSxbW1suNSwxXSxbMSwxLjVdXV0sW11dO2Z1bmN0aW9uIGdvKCl7dmFyIHQ9MSxuPTEsZT1NLHI9dTtmdW5jdGlvbiBpKHQpe3ZhciBuPWUodCk7aWYoQXJyYXkuaXNBcnJheShuKSluPW4uc2xpY2UoKS5zb3J0KGZvKTtlbHNle3ZhciByPXModCksaT1yWzBdLGE9clsxXTtuPXcoaSxhLG4pLG49ZyhNYXRoLmZsb29yKGkvbikqbixNYXRoLmZsb29yKGEvbikqbixuKX1yZXR1cm4gbi5tYXAoZnVuY3Rpb24obil7cmV0dXJuIG8odCxuKX0pfWZ1bmN0aW9uIG8oZSxpKXt2YXIgbz1bXSx1PVtdO3JldHVybiBmdW5jdGlvbihlLHIsaSl7dmFyIG8sdSxmLGMscyxsLGg9bmV3IEFycmF5LGQ9bmV3IEFycmF5O289dT0tMSxjPWVbMF0+PXIsdm9bYzw8MV0uZm9yRWFjaChwKTtmb3IoOysrbzx0LTE7KWY9YyxjPWVbbysxXT49cix2b1tmfGM8PDFdLmZvckVhY2gocCk7dm9bYzw8MF0uZm9yRWFjaChwKTtmb3IoOysrdTxuLTE7KXtmb3Iobz0tMSxjPWVbdSp0K3RdPj1yLHM9ZVt1KnRdPj1yLHZvW2M8PDF8czw8Ml0uZm9yRWFjaChwKTsrK288dC0xOylmPWMsYz1lW3UqdCt0K28rMV0+PXIsbD1zLHM9ZVt1KnQrbysxXT49cix2b1tmfGM8PDF8czw8MnxsPDwzXS5mb3JFYWNoKHApO3ZvW2N8czw8M10uZm9yRWFjaChwKX1vPS0xLHM9ZVt1KnRdPj1yLHZvW3M8PDJdLmZvckVhY2gocCk7Zm9yKDsrK288dC0xOylsPXMscz1lW3UqdCtvKzFdPj1yLHZvW3M8PDJ8bDw8M10uZm9yRWFjaChwKTtmdW5jdGlvbiBwKHQpe3ZhciBuLGUscj1bdFswXVswXStvLHRbMF1bMV0rdV0sZj1bdFsxXVswXStvLHRbMV1bMV0rdV0sYz1hKHIpLHM9YShmKTsobj1kW2NdKT8oZT1oW3NdKT8oZGVsZXRlIGRbbi5lbmRdLGRlbGV0ZSBoW2Uuc3RhcnRdLG49PT1lPyhuLnJpbmcucHVzaChmKSxpKG4ucmluZykpOmhbbi5zdGFydF09ZFtlLmVuZF09e3N0YXJ0Om4uc3RhcnQsZW5kOmUuZW5kLHJpbmc6bi5yaW5nLmNvbmNhdChlLnJpbmcpfSk6KGRlbGV0ZSBkW24uZW5kXSxuLnJpbmcucHVzaChmKSxkW24uZW5kPXNdPW4pOihuPWhbc10pPyhlPWRbY10pPyhkZWxldGUgaFtuLnN0YXJ0XSxkZWxldGUgZFtlLmVuZF0sbj09PWU/KG4ucmluZy5wdXNoKGYpLGkobi5yaW5nKSk6aFtlLnN0YXJ0XT1kW24uZW5kXT17c3RhcnQ6ZS5zdGFydCxlbmQ6bi5lbmQscmluZzplLnJpbmcuY29uY2F0KG4ucmluZyl9KTooZGVsZXRlIGhbbi5zdGFydF0sbi5yaW5nLnVuc2hpZnQociksaFtuLnN0YXJ0PWNdPW4pOmhbY109ZFtzXT17c3RhcnQ6YyxlbmQ6cyxyaW5nOltyLGZdfX12b1tzPDwzXS5mb3JFYWNoKHApfShlLGksZnVuY3Rpb24odCl7cih0LGUsaSksZnVuY3Rpb24odCl7Zm9yKHZhciBuPTAsZT10Lmxlbmd0aCxyPXRbZS0xXVsxXSp0WzBdWzBdLXRbZS0xXVswXSp0WzBdWzFdOysrbjxlOylyKz10W24tMV1bMV0qdFtuXVswXS10W24tMV1bMF0qdFtuXVsxXTtyZXR1cm4gcn0odCk+MD9vLnB1c2goW3RdKTp1LnB1c2godCl9KSx1LmZvckVhY2goZnVuY3Rpb24odCl7Zm9yKHZhciBuLGU9MCxyPW8ubGVuZ3RoO2U8cjsrK2UpaWYoLTEhPT1zbygobj1vW2VdKVswXSx0KSlyZXR1cm4gdm9pZCBuLnB1c2godCl9KSx7dHlwZToiTXVsdGlQb2x5Z29uIix2YWx1ZTppLGNvb3JkaW5hdGVzOm99fWZ1bmN0aW9uIGEobil7cmV0dXJuIDIqblswXStuWzFdKih0KzEpKjR9ZnVuY3Rpb24gdShlLHIsaSl7ZS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciBvLGE9ZVswXSx1PWVbMV0sZj0wfGEsYz0wfHUscz1yW2MqdCtmXTthPjAmJmE8dCYmZj09PWEmJihvPXJbYyp0K2YtMV0sZVswXT1hKyhpLW8pLyhzLW8pLS41KSx1PjAmJnU8biYmYz09PXUmJihvPXJbKGMtMSkqdCtmXSxlWzFdPXUrKGktbykvKHMtbyktLjUpfSl9cmV0dXJuIGkuY29udG91cj1vLGkuc2l6ZT1mdW5jdGlvbihlKXtpZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm5bdCxuXTt2YXIgcj1NYXRoLmNlaWwoZVswXSksbz1NYXRoLmNlaWwoZVsxXSk7aWYoIShyPjAmJm8+MCkpdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIHNpemUiKTtyZXR1cm4gdD1yLG49byxpfSxpLnRocmVzaG9sZHM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpBcnJheS5pc0FycmF5KHQpP2NvKHVvLmNhbGwodCkpOmNvKHQpLGkpOmV9LGkuc21vb3RoPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPXQ/dTpwbyxpKTpyPT09dX0saX1mdW5jdGlvbiB5byh0LG4sZSl7Zm9yKHZhciByPXQud2lkdGgsaT10LmhlaWdodCxvPTErKGU8PDEpLGE9MDthPGk7KythKWZvcih2YXIgdT0wLGY9MDt1PHIrZTsrK3UpdTxyJiYoZis9dC5kYXRhW3UrYSpyXSksdT49ZSYmKHU+PW8mJihmLT10LmRhdGFbdS1vK2Eqcl0pLG4uZGF0YVt1LWUrYSpyXT1mL01hdGgubWluKHUrMSxyLTErby11LG8pKX1mdW5jdGlvbiBfbyh0LG4sZSl7Zm9yKHZhciByPXQud2lkdGgsaT10LmhlaWdodCxvPTErKGU8PDEpLGE9MDthPHI7KythKWZvcih2YXIgdT0wLGY9MDt1PGkrZTsrK3UpdTxpJiYoZis9dC5kYXRhW2ErdSpyXSksdT49ZSYmKHU+PW8mJihmLT10LmRhdGFbYSsodS1vKSpyXSksbi5kYXRhW2ErKHUtZSkqcl09Zi9NYXRoLm1pbih1KzEsaS0xK28tdSxvKSl9ZnVuY3Rpb24gYm8odCl7cmV0dXJuIHRbMF19ZnVuY3Rpb24gbW8odCl7cmV0dXJuIHRbMV19ZnVuY3Rpb24geG8oKXtyZXR1cm4gMX12YXIgd289e30sTW89e30sQW89MzQsVG89MTAsTm89MTM7ZnVuY3Rpb24gU28odCl7cmV0dXJuIG5ldyBGdW5jdGlvbigiZCIsInJldHVybiB7Iit0Lm1hcChmdW5jdGlvbih0LG4pe3JldHVybiBKU09OLnN0cmluZ2lmeSh0KSsiOiBkWyIrbisiXSJ9KS5qb2luKCIsIikrIn0iKX1mdW5jdGlvbiBFbyh0KXt2YXIgbj1uZXcgUmVnRXhwKCdbIicrdCsiXG5ccl0iKSxlPXQuY2hhckNvZGVBdCgwKTtmdW5jdGlvbiByKHQsbil7dmFyIHIsaT1bXSxvPXQubGVuZ3RoLGE9MCx1PTAsZj1vPD0wLGM9ITE7ZnVuY3Rpb24gcygpe2lmKGYpcmV0dXJuIE1vO2lmKGMpcmV0dXJuIGM9ITEsd287dmFyIG4scixpPWE7aWYodC5jaGFyQ29kZUF0KGkpPT09QW8pe2Zvcig7YSsrPG8mJnQuY2hhckNvZGVBdChhKSE9PUFvfHx0LmNoYXJDb2RlQXQoKythKT09PUFvOyk7cmV0dXJuKG49YSk+PW8/Zj0hMDoocj10LmNoYXJDb2RlQXQoYSsrKSk9PT1Ubz9jPSEwOnI9PT1ObyYmKGM9ITAsdC5jaGFyQ29kZUF0KGEpPT09VG8mJisrYSksdC5zbGljZShpKzEsbi0xKS5yZXBsYWNlKC8iIi9nLCciJyl9Zm9yKDthPG87KXtpZigocj10LmNoYXJDb2RlQXQobj1hKyspKT09PVRvKWM9ITA7ZWxzZSBpZihyPT09Tm8pYz0hMCx0LmNoYXJDb2RlQXQoYSk9PT1UbyYmKythO2Vsc2UgaWYociE9PWUpY29udGludWU7cmV0dXJuIHQuc2xpY2UoaSxuKX1yZXR1cm4gZj0hMCx0LnNsaWNlKGksbyl9Zm9yKHQuY2hhckNvZGVBdChvLTEpPT09VG8mJi0tbyx0LmNoYXJDb2RlQXQoby0xKT09PU5vJiYtLW87KHI9cygpKSE9PU1vOyl7Zm9yKHZhciBsPVtdO3IhPT13byYmciE9PU1vOylsLnB1c2gocikscj1zKCk7biYmbnVsbD09KGw9bihsLHUrKykpfHxpLnB1c2gobCl9cmV0dXJuIGl9ZnVuY3Rpb24gaShuKXtyZXR1cm4gbi5tYXAobykuam9pbih0KX1mdW5jdGlvbiBvKHQpe3JldHVybiBudWxsPT10PyIiOm4udGVzdCh0Kz0iIik/JyInK3QucmVwbGFjZSgvIi9nLCciIicpKyciJzp0fXJldHVybntwYXJzZTpmdW5jdGlvbih0LG4pe3ZhciBlLGksbz1yKHQsZnVuY3Rpb24odCxyKXtpZihlKXJldHVybiBlKHQsci0xKTtpPXQsZT1uP2Z1bmN0aW9uKHQsbil7dmFyIGU9U28odCk7cmV0dXJuIGZ1bmN0aW9uKHIsaSl7cmV0dXJuIG4oZShyKSxpLHQpfX0odCxuKTpTbyh0KX0pO3JldHVybiBvLmNvbHVtbnM9aXx8W10sb30scGFyc2VSb3dzOnIsZm9ybWF0OmZ1bmN0aW9uKG4sZSl7cmV0dXJuIG51bGw9PWUmJihlPWZ1bmN0aW9uKHQpe3ZhciBuPU9iamVjdC5jcmVhdGUobnVsbCksZT1bXTtyZXR1cm4gdC5mb3JFYWNoKGZ1bmN0aW9uKHQpe2Zvcih2YXIgciBpbiB0KXIgaW4gbnx8ZS5wdXNoKG5bcl09cil9KSxlfShuKSksW2UubWFwKG8pLmpvaW4odCldLmNvbmNhdChuLm1hcChmdW5jdGlvbihuKXtyZXR1cm4gZS5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIG8oblt0XSl9KS5qb2luKHQpfSkpLmpvaW4oIlxuIil9LGZvcm1hdFJvd3M6ZnVuY3Rpb24odCl7cmV0dXJuIHQubWFwKGkpLmpvaW4oIlxuIil9fX12YXIga289RW8oIiwiKSxDbz1rby5wYXJzZSxQbz1rby5wYXJzZVJvd3Msem89a28uZm9ybWF0LFJvPWtvLmZvcm1hdFJvd3MsTG89RW8oIlx0IiksRG89TG8ucGFyc2UsVW89TG8ucGFyc2VSb3dzLHFvPUxvLmZvcm1hdCxPbz1Mby5mb3JtYXRSb3dzO2Z1bmN0aW9uIFlvKHQpe2lmKCF0Lm9rKXRocm93IG5ldyBFcnJvcih0LnN0YXR1cysiICIrdC5zdGF0dXNUZXh0KTtyZXR1cm4gdC5ibG9iKCl9ZnVuY3Rpb24gQm8odCl7aWYoIXQub2spdGhyb3cgbmV3IEVycm9yKHQuc3RhdHVzKyIgIit0LnN0YXR1c1RleHQpO3JldHVybiB0LmFycmF5QnVmZmVyKCl9ZnVuY3Rpb24gRm8odCl7aWYoIXQub2spdGhyb3cgbmV3IEVycm9yKHQuc3RhdHVzKyIgIit0LnN0YXR1c1RleHQpO3JldHVybiB0LnRleHQoKX1mdW5jdGlvbiBJbyh0LG4pe3JldHVybiBmZXRjaCh0LG4pLnRoZW4oRm8pfWZ1bmN0aW9uIEhvKHQpe3JldHVybiBmdW5jdGlvbihuLGUscil7cmV0dXJuIDI9PT1hcmd1bWVudHMubGVuZ3RoJiYiZnVuY3Rpb24iPT10eXBlb2YgZSYmKHI9ZSxlPXZvaWQgMCksSW8obixlKS50aGVuKGZ1bmN0aW9uKG4pe3JldHVybiB0KG4scil9KX19dmFyIGpvPUhvKENvKSxYbz1IbyhEbyk7ZnVuY3Rpb24gR28odCl7aWYoIXQub2spdGhyb3cgbmV3IEVycm9yKHQuc3RhdHVzKyIgIit0LnN0YXR1c1RleHQpO3JldHVybiB0Lmpzb24oKX1mdW5jdGlvbiBWbyh0KXtyZXR1cm4gZnVuY3Rpb24obixlKXtyZXR1cm4gSW8obixlKS50aGVuKGZ1bmN0aW9uKG4pe3JldHVybihuZXcgRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcobix0KX0pfX12YXIgJG89Vm8oImFwcGxpY2F0aW9uL3htbCIpLFdvPVZvKCJ0ZXh0L2h0bWwiKSxabz1WbygiaW1hZ2Uvc3ZnK3htbCIpO2Z1bmN0aW9uIFFvKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fX1mdW5jdGlvbiBKbygpe3JldHVybiAxZS02KihNYXRoLnJhbmRvbSgpLS41KX1mdW5jdGlvbiBLbyh0LG4sZSxyKXtpZihpc05hTihuKXx8aXNOYU4oZSkpcmV0dXJuIHQ7dmFyIGksbyxhLHUsZixjLHMsbCxoLGQ9dC5fcm9vdCxwPXtkYXRhOnJ9LHY9dC5feDAsZz10Ll95MCx5PXQuX3gxLF89dC5feTE7aWYoIWQpcmV0dXJuIHQuX3Jvb3Q9cCx0O2Zvcig7ZC5sZW5ndGg7KWlmKChjPW4+PShvPSh2K3kpLzIpKT92PW86eT1vLChzPWU+PShhPShnK18pLzIpKT9nPWE6Xz1hLGk9ZCwhKGQ9ZFtsPXM8PDF8Y10pKXJldHVybiBpW2xdPXAsdDtpZih1PSt0Ll94LmNhbGwobnVsbCxkLmRhdGEpLGY9K3QuX3kuY2FsbChudWxsLGQuZGF0YSksbj09PXUmJmU9PT1mKXJldHVybiBwLm5leHQ9ZCxpP2lbbF09cDp0Ll9yb290PXAsdDtkb3tpPWk/aVtsXT1uZXcgQXJyYXkoNCk6dC5fcm9vdD1uZXcgQXJyYXkoNCksKGM9bj49KG89KHYreSkvMikpP3Y9bzp5PW8sKHM9ZT49KGE9KGcrXykvMikpP2c9YTpfPWF9d2hpbGUoKGw9czw8MXxjKT09KGg9KGY+PWEpPDwxfHU+PW8pKTtyZXR1cm4gaVtoXT1kLGlbbF09cCx0fWZ1bmN0aW9uIHRhKHQsbixlLHIsaSl7dGhpcy5ub2RlPXQsdGhpcy54MD1uLHRoaXMueTA9ZSx0aGlzLngxPXIsdGhpcy55MT1pfWZ1bmN0aW9uIG5hKHQpe3JldHVybiB0WzBdfWZ1bmN0aW9uIGVhKHQpe3JldHVybiB0WzFdfWZ1bmN0aW9uIHJhKHQsbixlKXt2YXIgcj1uZXcgaWEobnVsbD09bj9uYTpuLG51bGw9PWU/ZWE6ZSxOYU4sTmFOLE5hTixOYU4pO3JldHVybiBudWxsPT10P3I6ci5hZGRBbGwodCl9ZnVuY3Rpb24gaWEodCxuLGUscixpLG8pe3RoaXMuX3g9dCx0aGlzLl95PW4sdGhpcy5feDA9ZSx0aGlzLl95MD1yLHRoaXMuX3gxPWksdGhpcy5feTE9byx0aGlzLl9yb290PXZvaWQgMH1mdW5jdGlvbiBvYSh0KXtmb3IodmFyIG49e2RhdGE6dC5kYXRhfSxlPW47dD10Lm5leHQ7KWU9ZS5uZXh0PXtkYXRhOnQuZGF0YX07cmV0dXJuIG59dmFyIGFhPXJhLnByb3RvdHlwZT1pYS5wcm90b3R5cGU7ZnVuY3Rpb24gdWEodCl7cmV0dXJuIHQueCt0LnZ4fWZ1bmN0aW9uIGZhKHQpe3JldHVybiB0LnkrdC52eX1mdW5jdGlvbiBjYSh0KXtyZXR1cm4gdC5pbmRleH1mdW5jdGlvbiBzYSh0LG4pe3ZhciBlPXQuZ2V0KG4pO2lmKCFlKXRocm93IG5ldyBFcnJvcigibWlzc2luZzogIituKTtyZXR1cm4gZX1mdW5jdGlvbiBsYSh0KXtyZXR1cm4gdC54fWZ1bmN0aW9uIGhhKHQpe3JldHVybiB0Lnl9YWEuY29weT1mdW5jdGlvbigpe3ZhciB0LG4sZT1uZXcgaWEodGhpcy5feCx0aGlzLl95LHRoaXMuX3gwLHRoaXMuX3kwLHRoaXMuX3gxLHRoaXMuX3kxKSxyPXRoaXMuX3Jvb3Q7aWYoIXIpcmV0dXJuIGU7aWYoIXIubGVuZ3RoKXJldHVybiBlLl9yb290PW9hKHIpLGU7Zm9yKHQ9W3tzb3VyY2U6cix0YXJnZXQ6ZS5fcm9vdD1uZXcgQXJyYXkoNCl9XTtyPXQucG9wKCk7KWZvcih2YXIgaT0wO2k8NDsrK2kpKG49ci5zb3VyY2VbaV0pJiYobi5sZW5ndGg/dC5wdXNoKHtzb3VyY2U6bix0YXJnZXQ6ci50YXJnZXRbaV09bmV3IEFycmF5KDQpfSk6ci50YXJnZXRbaV09b2EobikpO3JldHVybiBlfSxhYS5hZGQ9ZnVuY3Rpb24odCl7dmFyIG49K3RoaXMuX3guY2FsbChudWxsLHQpLGU9K3RoaXMuX3kuY2FsbChudWxsLHQpO3JldHVybiBLbyh0aGlzLmNvdmVyKG4sZSksbixlLHQpfSxhYS5hZGRBbGw9ZnVuY3Rpb24odCl7dmFyIG4sZSxyLGksbz10Lmxlbmd0aCxhPW5ldyBBcnJheShvKSx1PW5ldyBBcnJheShvKSxmPTEvMCxjPTEvMCxzPS0xLzAsbD0tMS8wO2ZvcihlPTA7ZTxvOysrZSlpc05hTihyPSt0aGlzLl94LmNhbGwobnVsbCxuPXRbZV0pKXx8aXNOYU4oaT0rdGhpcy5feS5jYWxsKG51bGwsbikpfHwoYVtlXT1yLHVbZV09aSxyPGYmJihmPXIpLHI+cyYmKHM9ciksaTxjJiYoYz1pKSxpPmwmJihsPWkpKTtmb3IoczxmJiYoZj10aGlzLl94MCxzPXRoaXMuX3gxKSxsPGMmJihjPXRoaXMuX3kwLGw9dGhpcy5feTEpLHRoaXMuY292ZXIoZixjKS5jb3ZlcihzLGwpLGU9MDtlPG87KytlKUtvKHRoaXMsYVtlXSx1W2VdLHRbZV0pO3JldHVybiB0aGlzfSxhYS5jb3Zlcj1mdW5jdGlvbih0LG4pe2lmKGlzTmFOKHQ9K3QpfHxpc05hTihuPStuKSlyZXR1cm4gdGhpczt2YXIgZT10aGlzLl94MCxyPXRoaXMuX3kwLGk9dGhpcy5feDEsbz10aGlzLl95MTtpZihpc05hTihlKSlpPShlPU1hdGguZmxvb3IodCkpKzEsbz0ocj1NYXRoLmZsb29yKG4pKSsxO2Vsc2V7aWYoIShlPnR8fHQ+aXx8cj5ufHxuPm8pKXJldHVybiB0aGlzO3ZhciBhLHUsZj1pLWUsYz10aGlzLl9yb290O3N3aXRjaCh1PShuPChyK28pLzIpPDwxfHQ8KGUraSkvMil7Y2FzZSAwOmRveyhhPW5ldyBBcnJheSg0KSlbdV09YyxjPWF9d2hpbGUobz1yKyhmKj0yKSx0PihpPWUrZil8fG4+byk7YnJlYWs7Y2FzZSAxOmRveyhhPW5ldyBBcnJheSg0KSlbdV09YyxjPWF9d2hpbGUobz1yKyhmKj0yKSwoZT1pLWYpPnR8fG4+byk7YnJlYWs7Y2FzZSAyOmRveyhhPW5ldyBBcnJheSg0KSlbdV09YyxjPWF9d2hpbGUocj1vLShmKj0yKSx0PihpPWUrZil8fHI+bik7YnJlYWs7Y2FzZSAzOmRveyhhPW5ldyBBcnJheSg0KSlbdV09YyxjPWF9d2hpbGUocj1vLShmKj0yKSwoZT1pLWYpPnR8fHI+bil9dGhpcy5fcm9vdCYmdGhpcy5fcm9vdC5sZW5ndGgmJih0aGlzLl9yb290PWMpfXJldHVybiB0aGlzLl94MD1lLHRoaXMuX3kwPXIsdGhpcy5feDE9aSx0aGlzLl95MT1vLHRoaXN9LGFhLmRhdGE9ZnVuY3Rpb24oKXt2YXIgdD1bXTtyZXR1cm4gdGhpcy52aXNpdChmdW5jdGlvbihuKXtpZighbi5sZW5ndGgpZG97dC5wdXNoKG4uZGF0YSl9d2hpbGUobj1uLm5leHQpfSksdH0sYWEuZXh0ZW50PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3RoaXMuY292ZXIoK3RbMF1bMF0sK3RbMF1bMV0pLmNvdmVyKCt0WzFdWzBdLCt0WzFdWzFdKTppc05hTih0aGlzLl94MCk/dm9pZCAwOltbdGhpcy5feDAsdGhpcy5feTBdLFt0aGlzLl94MSx0aGlzLl95MV1dfSxhYS5maW5kPWZ1bmN0aW9uKHQsbixlKXt2YXIgcixpLG8sYSx1LGYsYyxzPXRoaXMuX3gwLGw9dGhpcy5feTAsaD10aGlzLl94MSxkPXRoaXMuX3kxLHA9W10sdj10aGlzLl9yb290O2Zvcih2JiZwLnB1c2gobmV3IHRhKHYscyxsLGgsZCkpLG51bGw9PWU/ZT0xLzA6KHM9dC1lLGw9bi1lLGg9dCtlLGQ9bitlLGUqPWUpO2Y9cC5wb3AoKTspaWYoISghKHY9Zi5ub2RlKXx8KGk9Zi54MCk+aHx8KG89Zi55MCk+ZHx8KGE9Zi54MSk8c3x8KHU9Zi55MSk8bCkpaWYodi5sZW5ndGgpe3ZhciBnPShpK2EpLzIseT0obyt1KS8yO3AucHVzaChuZXcgdGEodlszXSxnLHksYSx1KSxuZXcgdGEodlsyXSxpLHksZyx1KSxuZXcgdGEodlsxXSxnLG8sYSx5KSxuZXcgdGEodlswXSxpLG8sZyx5KSksKGM9KG4+PXkpPDwxfHQ+PWcpJiYoZj1wW3AubGVuZ3RoLTFdLHBbcC5sZW5ndGgtMV09cFtwLmxlbmd0aC0xLWNdLHBbcC5sZW5ndGgtMS1jXT1mKX1lbHNle3ZhciBfPXQtK3RoaXMuX3guY2FsbChudWxsLHYuZGF0YSksYj1uLSt0aGlzLl95LmNhbGwobnVsbCx2LmRhdGEpLG09XypfK2IqYjtpZihtPGUpe3ZhciB4PU1hdGguc3FydChlPW0pO3M9dC14LGw9bi14LGg9dCt4LGQ9bit4LHI9di5kYXRhfX1yZXR1cm4gcn0sYWEucmVtb3ZlPWZ1bmN0aW9uKHQpe2lmKGlzTmFOKG89K3RoaXMuX3guY2FsbChudWxsLHQpKXx8aXNOYU4oYT0rdGhpcy5feS5jYWxsKG51bGwsdCkpKXJldHVybiB0aGlzO3ZhciBuLGUscixpLG8sYSx1LGYsYyxzLGwsaCxkPXRoaXMuX3Jvb3QscD10aGlzLl94MCx2PXRoaXMuX3kwLGc9dGhpcy5feDEseT10aGlzLl95MTtpZighZClyZXR1cm4gdGhpcztpZihkLmxlbmd0aClmb3IoOzspe2lmKChjPW8+PSh1PShwK2cpLzIpKT9wPXU6Zz11LChzPWE+PShmPSh2K3kpLzIpKT92PWY6eT1mLG49ZCwhKGQ9ZFtsPXM8PDF8Y10pKXJldHVybiB0aGlzO2lmKCFkLmxlbmd0aClicmVhazsobltsKzEmM118fG5bbCsyJjNdfHxuW2wrMyYzXSkmJihlPW4saD1sKX1mb3IoO2QuZGF0YSE9PXQ7KWlmKHI9ZCwhKGQ9ZC5uZXh0KSlyZXR1cm4gdGhpcztyZXR1cm4oaT1kLm5leHQpJiZkZWxldGUgZC5uZXh0LHI/KGk/ci5uZXh0PWk6ZGVsZXRlIHIubmV4dCx0aGlzKTpuPyhpP25bbF09aTpkZWxldGUgbltsXSwoZD1uWzBdfHxuWzFdfHxuWzJdfHxuWzNdKSYmZD09PShuWzNdfHxuWzJdfHxuWzFdfHxuWzBdKSYmIWQubGVuZ3RoJiYoZT9lW2hdPWQ6dGhpcy5fcm9vdD1kKSx0aGlzKToodGhpcy5fcm9vdD1pLHRoaXMpfSxhYS5yZW1vdmVBbGw9ZnVuY3Rpb24odCl7Zm9yKHZhciBuPTAsZT10Lmxlbmd0aDtuPGU7KytuKXRoaXMucmVtb3ZlKHRbbl0pO3JldHVybiB0aGlzfSxhYS5yb290PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Jvb3R9LGFhLnNpemU9ZnVuY3Rpb24oKXt2YXIgdD0wO3JldHVybiB0aGlzLnZpc2l0KGZ1bmN0aW9uKG4pe2lmKCFuLmxlbmd0aClkb3srK3R9d2hpbGUobj1uLm5leHQpfSksdH0sYWEudmlzaXQ9ZnVuY3Rpb24odCl7dmFyIG4sZSxyLGksbyxhLHU9W10sZj10aGlzLl9yb290O2ZvcihmJiZ1LnB1c2gobmV3IHRhKGYsdGhpcy5feDAsdGhpcy5feTAsdGhpcy5feDEsdGhpcy5feTEpKTtuPXUucG9wKCk7KWlmKCF0KGY9bi5ub2RlLHI9bi54MCxpPW4ueTAsbz1uLngxLGE9bi55MSkmJmYubGVuZ3RoKXt2YXIgYz0ocitvKS8yLHM9KGkrYSkvMjsoZT1mWzNdKSYmdS5wdXNoKG5ldyB0YShlLGMscyxvLGEpKSwoZT1mWzJdKSYmdS5wdXNoKG5ldyB0YShlLHIscyxjLGEpKSwoZT1mWzFdKSYmdS5wdXNoKG5ldyB0YShlLGMsaSxvLHMpKSwoZT1mWzBdKSYmdS5wdXNoKG5ldyB0YShlLHIsaSxjLHMpKX1yZXR1cm4gdGhpc30sYWEudmlzaXRBZnRlcj1mdW5jdGlvbih0KXt2YXIgbixlPVtdLHI9W107Zm9yKHRoaXMuX3Jvb3QmJmUucHVzaChuZXcgdGEodGhpcy5fcm9vdCx0aGlzLl94MCx0aGlzLl95MCx0aGlzLl94MSx0aGlzLl95MSkpO249ZS5wb3AoKTspe3ZhciBpPW4ubm9kZTtpZihpLmxlbmd0aCl7dmFyIG8sYT1uLngwLHU9bi55MCxmPW4ueDEsYz1uLnkxLHM9KGErZikvMixsPSh1K2MpLzI7KG89aVswXSkmJmUucHVzaChuZXcgdGEobyxhLHUscyxsKSksKG89aVsxXSkmJmUucHVzaChuZXcgdGEobyxzLHUsZixsKSksKG89aVsyXSkmJmUucHVzaChuZXcgdGEobyxhLGwscyxjKSksKG89aVszXSkmJmUucHVzaChuZXcgdGEobyxzLGwsZixjKSl9ci5wdXNoKG4pfWZvcig7bj1yLnBvcCgpOyl0KG4ubm9kZSxuLngwLG4ueTAsbi54MSxuLnkxKTtyZXR1cm4gdGhpc30sYWEueD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odGhpcy5feD10LHRoaXMpOnRoaXMuX3h9LGFhLnk9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHRoaXMuX3k9dCx0aGlzKTp0aGlzLl95fTt2YXIgZGE9MTAscGE9TWF0aC5QSSooMy1NYXRoLnNxcnQoNSkpO2Z1bmN0aW9uIHZhKHQsbil7aWYoKGU9KHQ9bj90LnRvRXhwb25lbnRpYWwobi0xKTp0LnRvRXhwb25lbnRpYWwoKSkuaW5kZXhPZigiZSIpKTwwKXJldHVybiBudWxsO3ZhciBlLHI9dC5zbGljZSgwLGUpO3JldHVybltyLmxlbmd0aD4xP3JbMF0rci5zbGljZSgyKTpyLCt0LnNsaWNlKGUrMSldfWZ1bmN0aW9uIGdhKHQpe3JldHVybih0PXZhKE1hdGguYWJzKHQpKSk/dFsxXTpOYU59dmFyIHlhLF9hPS9eKD86KC4pPyhbPD49Xl0pKT8oWytcLSggXSk/KFskI10pPygwKT8oXGQrKT8oLCk/KFwuXGQrKT8ofik/KFthLXolXSk/JC9pO2Z1bmN0aW9uIGJhKHQpe3JldHVybiBuZXcgbWEodCl9ZnVuY3Rpb24gbWEodCl7aWYoIShuPV9hLmV4ZWModCkpKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBmb3JtYXQ6ICIrdCk7dmFyIG47dGhpcy5maWxsPW5bMV18fCIgIix0aGlzLmFsaWduPW5bMl18fCI+Iix0aGlzLnNpZ249blszXXx8Ii0iLHRoaXMuc3ltYm9sPW5bNF18fCIiLHRoaXMuemVybz0hIW5bNV0sdGhpcy53aWR0aD1uWzZdJiYrbls2XSx0aGlzLmNvbW1hPSEhbls3XSx0aGlzLnByZWNpc2lvbj1uWzhdJiYrbls4XS5zbGljZSgxKSx0aGlzLnRyaW09ISFuWzldLHRoaXMudHlwZT1uWzEwXXx8IiJ9ZnVuY3Rpb24geGEodCxuKXt2YXIgZT12YSh0LG4pO2lmKCFlKXJldHVybiB0KyIiO3ZhciByPWVbMF0saT1lWzFdO3JldHVybiBpPDA/IjAuIituZXcgQXJyYXkoLWkpLmpvaW4oIjAiKStyOnIubGVuZ3RoPmkrMT9yLnNsaWNlKDAsaSsxKSsiLiIrci5zbGljZShpKzEpOnIrbmV3IEFycmF5KGktci5sZW5ndGgrMikuam9pbigiMCIpfWJhLnByb3RvdHlwZT1tYS5wcm90b3R5cGUsbWEucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZmlsbCt0aGlzLmFsaWduK3RoaXMuc2lnbit0aGlzLnN5bWJvbCsodGhpcy56ZXJvPyIwIjoiIikrKG51bGw9PXRoaXMud2lkdGg/IiI6TWF0aC5tYXgoMSwwfHRoaXMud2lkdGgpKSsodGhpcy5jb21tYT8iLCI6IiIpKyhudWxsPT10aGlzLnByZWNpc2lvbj8iIjoiLiIrTWF0aC5tYXgoMCwwfHRoaXMucHJlY2lzaW9uKSkrKHRoaXMudHJpbT8ifiI6IiIpK3RoaXMudHlwZX07dmFyIHdhPXsiJSI6ZnVuY3Rpb24odCxuKXtyZXR1cm4oMTAwKnQpLnRvRml4ZWQobil9LGI6ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGgucm91bmQodCkudG9TdHJpbmcoMil9LGM6ZnVuY3Rpb24odCl7cmV0dXJuIHQrIiJ9LGQ6ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGgucm91bmQodCkudG9TdHJpbmcoMTApfSxlOmZ1bmN0aW9uKHQsbil7cmV0dXJuIHQudG9FeHBvbmVudGlhbChuKX0sZjpmdW5jdGlvbih0LG4pe3JldHVybiB0LnRvRml4ZWQobil9LGc6ZnVuY3Rpb24odCxuKXtyZXR1cm4gdC50b1ByZWNpc2lvbihuKX0sbzpmdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5yb3VuZCh0KS50b1N0cmluZyg4KX0scDpmdW5jdGlvbih0LG4pe3JldHVybiB4YSgxMDAqdCxuKX0scjp4YSxzOmZ1bmN0aW9uKHQsbil7dmFyIGU9dmEodCxuKTtpZighZSlyZXR1cm4gdCsiIjt2YXIgcj1lWzBdLGk9ZVsxXSxvPWktKHlhPTMqTWF0aC5tYXgoLTgsTWF0aC5taW4oOCxNYXRoLmZsb29yKGkvMykpKSkrMSxhPXIubGVuZ3RoO3JldHVybiBvPT09YT9yOm8+YT9yK25ldyBBcnJheShvLWErMSkuam9pbigiMCIpOm8+MD9yLnNsaWNlKDAsbykrIi4iK3Iuc2xpY2Uobyk6IjAuIituZXcgQXJyYXkoMS1vKS5qb2luKCIwIikrdmEodCxNYXRoLm1heCgwLG4rby0xKSlbMF19LFg6ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGgucm91bmQodCkudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCl9LHg6ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGgucm91bmQodCkudG9TdHJpbmcoMTYpfX07ZnVuY3Rpb24gTWEodCl7cmV0dXJuIHR9dmFyIEFhLFRhPVsieSIsInoiLCJhIiwiZiIsInAiLCJuIiwiwrUiLCJtIiwiIiwiayIsIk0iLCJHIiwiVCIsIlAiLCJFIiwiWiIsIlkiXTtmdW5jdGlvbiBOYSh0KXt2YXIgbixlLHI9dC5ncm91cGluZyYmdC50aG91c2FuZHM/KG49dC5ncm91cGluZyxlPXQudGhvdXNhbmRzLGZ1bmN0aW9uKHQscil7Zm9yKHZhciBpPXQubGVuZ3RoLG89W10sYT0wLHU9blswXSxmPTA7aT4wJiZ1PjAmJihmK3UrMT5yJiYodT1NYXRoLm1heCgxLHItZikpLG8ucHVzaCh0LnN1YnN0cmluZyhpLT11LGkrdSkpLCEoKGYrPXUrMSk+cikpOyl1PW5bYT0oYSsxKSVuLmxlbmd0aF07cmV0dXJuIG8ucmV2ZXJzZSgpLmpvaW4oZSl9KTpNYSxpPXQuY3VycmVuY3ksbz10LmRlY2ltYWwsYT10Lm51bWVyYWxzP2Z1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gbi5yZXBsYWNlKC9bMC05XS9nLGZ1bmN0aW9uKG4pe3JldHVybiB0WytuXX0pfX0odC5udW1lcmFscyk6TWEsdT10LnBlcmNlbnR8fCIlIjtmdW5jdGlvbiBmKHQpe3ZhciBuPSh0PWJhKHQpKS5maWxsLGU9dC5hbGlnbixmPXQuc2lnbixjPXQuc3ltYm9sLHM9dC56ZXJvLGw9dC53aWR0aCxoPXQuY29tbWEsZD10LnByZWNpc2lvbixwPXQudHJpbSx2PXQudHlwZTsibiI9PT12PyhoPSEwLHY9ImciKTp3YVt2XXx8KG51bGw9PWQmJihkPTEyKSxwPSEwLHY9ImciKSwoc3x8IjAiPT09biYmIj0iPT09ZSkmJihzPSEwLG49IjAiLGU9Ij0iKTt2YXIgZz0iJCI9PT1jP2lbMF06IiMiPT09YyYmL1tib3hYXS8udGVzdCh2KT8iMCIrdi50b0xvd2VyQ2FzZSgpOiIiLHk9IiQiPT09Yz9pWzFdOi9bJXBdLy50ZXN0KHYpP3U6IiIsXz13YVt2XSxiPS9bZGVmZ3BycyVdLy50ZXN0KHYpO2Z1bmN0aW9uIG0odCl7dmFyIGksdSxjLG09Zyx4PXk7aWYoImMiPT09dil4PV8odCkreCx0PSIiO2Vsc2V7dmFyIHc9KHQ9K3QpPDA7aWYodD1fKE1hdGguYWJzKHQpLGQpLHAmJih0PWZ1bmN0aW9uKHQpe3Q6Zm9yKHZhciBuLGU9dC5sZW5ndGgscj0xLGk9LTE7cjxlOysrcilzd2l0Y2godFtyXSl7Y2FzZSIuIjppPW49cjticmVhaztjYXNlIjAiOjA9PT1pJiYoaT1yKSxuPXI7YnJlYWs7ZGVmYXVsdDppZihpPjApe2lmKCErdFtyXSlicmVhayB0O2k9MH19cmV0dXJuIGk+MD90LnNsaWNlKDAsaSkrdC5zbGljZShuKzEpOnR9KHQpKSx3JiYwPT0rdCYmKHc9ITEpLG09KHc/IigiPT09Zj9mOiItIjoiLSI9PT1mfHwiKCI9PT1mPyIiOmYpK20seD0oInMiPT09dj9UYVs4K3lhLzNdOiIiKSt4Kyh3JiYiKCI9PT1mPyIpIjoiIiksYilmb3IoaT0tMSx1PXQubGVuZ3RoOysraTx1OylpZig0OD4oYz10LmNoYXJDb2RlQXQoaSkpfHxjPjU3KXt4PSg0Nj09PWM/byt0LnNsaWNlKGkrMSk6dC5zbGljZShpKSkreCx0PXQuc2xpY2UoMCxpKTticmVha319aCYmIXMmJih0PXIodCwxLzApKTt2YXIgTT1tLmxlbmd0aCt0Lmxlbmd0aCt4Lmxlbmd0aCxBPU08bD9uZXcgQXJyYXkobC1NKzEpLmpvaW4obik6IiI7c3dpdGNoKGgmJnMmJih0PXIoQSt0LEEubGVuZ3RoP2wteC5sZW5ndGg6MS8wKSxBPSIiKSxlKXtjYXNlIjwiOnQ9bSt0K3grQTticmVhaztjYXNlIj0iOnQ9bStBK3QreDticmVhaztjYXNlIl4iOnQ9QS5zbGljZSgwLE09QS5sZW5ndGg+PjEpK20rdCt4K0Euc2xpY2UoTSk7YnJlYWs7ZGVmYXVsdDp0PUErbSt0K3h9cmV0dXJuIGEodCl9cmV0dXJuIGQ9bnVsbD09ZD82Oi9bZ3Byc10vLnRlc3Qodik/TWF0aC5tYXgoMSxNYXRoLm1pbigyMSxkKSk6TWF0aC5tYXgoMCxNYXRoLm1pbigyMCxkKSksbS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0KyIifSxtfXJldHVybntmb3JtYXQ6Zixmb3JtYXRQcmVmaXg6ZnVuY3Rpb24odCxuKXt2YXIgZT1mKCgodD1iYSh0KSkudHlwZT0iZiIsdCkpLHI9MypNYXRoLm1heCgtOCxNYXRoLm1pbig4LE1hdGguZmxvb3IoZ2EobikvMykpKSxpPU1hdGgucG93KDEwLC1yKSxvPVRhWzgrci8zXTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIGUoaSp0KStvfX19fWZ1bmN0aW9uIFNhKG4pe3JldHVybiBBYT1OYShuKSx0LmZvcm1hdD1BYS5mb3JtYXQsdC5mb3JtYXRQcmVmaXg9QWEuZm9ybWF0UHJlZml4LEFhfWZ1bmN0aW9uIEVhKHQpe3JldHVybiBNYXRoLm1heCgwLC1nYShNYXRoLmFicyh0KSkpfWZ1bmN0aW9uIGthKHQsbil7cmV0dXJuIE1hdGgubWF4KDAsMypNYXRoLm1heCgtOCxNYXRoLm1pbig4LE1hdGguZmxvb3IoZ2EobikvMykpKS1nYShNYXRoLmFicyh0KSkpfWZ1bmN0aW9uIENhKHQsbil7cmV0dXJuIHQ9TWF0aC5hYnModCksbj1NYXRoLmFicyhuKS10LE1hdGgubWF4KDAsZ2EobiktZ2EodCkpKzF9ZnVuY3Rpb24gUGEoKXtyZXR1cm4gbmV3IHphfWZ1bmN0aW9uIHphKCl7dGhpcy5yZXNldCgpfVNhKHtkZWNpbWFsOiIuIix0aG91c2FuZHM6IiwiLGdyb3VwaW5nOlszXSxjdXJyZW5jeTpbIiQiLCIiXX0pLHphLnByb3RvdHlwZT17Y29uc3RydWN0b3I6emEscmVzZXQ6ZnVuY3Rpb24oKXt0aGlzLnM9dGhpcy50PTB9LGFkZDpmdW5jdGlvbih0KXtMYShSYSx0LHRoaXMudCksTGEodGhpcyxSYS5zLHRoaXMucyksdGhpcy5zP3RoaXMudCs9UmEudDp0aGlzLnM9UmEudH0sdmFsdWVPZjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN9fTt2YXIgUmE9bmV3IHphO2Z1bmN0aW9uIExhKHQsbixlKXt2YXIgcj10LnM9bitlLGk9ci1uLG89ci1pO3QudD1uLW8rKGUtaSl9dmFyIERhPTFlLTYsVWE9MWUtMTIscWE9TWF0aC5QSSxPYT1xYS8yLFlhPXFhLzQsQmE9MipxYSxGYT0xODAvcWEsSWE9cWEvMTgwLEhhPU1hdGguYWJzLGphPU1hdGguYXRhbixYYT1NYXRoLmF0YW4yLEdhPU1hdGguY29zLFZhPU1hdGguY2VpbCwkYT1NYXRoLmV4cCxXYT1NYXRoLmxvZyxaYT1NYXRoLnBvdyxRYT1NYXRoLnNpbixKYT1NYXRoLnNpZ258fGZ1bmN0aW9uKHQpe3JldHVybiB0PjA/MTp0PDA/LTE6MH0sS2E9TWF0aC5zcXJ0LHR1PU1hdGgudGFuO2Z1bmN0aW9uIG51KHQpe3JldHVybiB0PjE/MDp0PC0xP3FhOk1hdGguYWNvcyh0KX1mdW5jdGlvbiBldSh0KXtyZXR1cm4gdD4xP09hOnQ8LTE/LU9hOk1hdGguYXNpbih0KX1mdW5jdGlvbiBydSh0KXtyZXR1cm4odD1RYSh0LzIpKSp0fWZ1bmN0aW9uIGl1KCl7fWZ1bmN0aW9uIG91KHQsbil7dCYmdXUuaGFzT3duUHJvcGVydHkodC50eXBlKSYmdXVbdC50eXBlXSh0LG4pfXZhciBhdT17RmVhdHVyZTpmdW5jdGlvbih0LG4pe291KHQuZ2VvbWV0cnksbil9LEZlYXR1cmVDb2xsZWN0aW9uOmZ1bmN0aW9uKHQsbil7Zm9yKHZhciBlPXQuZmVhdHVyZXMscj0tMSxpPWUubGVuZ3RoOysrcjxpOylvdShlW3JdLmdlb21ldHJ5LG4pfX0sdXU9e1NwaGVyZTpmdW5jdGlvbih0LG4pe24uc3BoZXJlKCl9LFBvaW50OmZ1bmN0aW9uKHQsbil7dD10LmNvb3JkaW5hdGVzLG4ucG9pbnQodFswXSx0WzFdLHRbMl0pfSxNdWx0aVBvaW50OmZ1bmN0aW9uKHQsbil7Zm9yKHZhciBlPXQuY29vcmRpbmF0ZXMscj0tMSxpPWUubGVuZ3RoOysrcjxpOyl0PWVbcl0sbi5wb2ludCh0WzBdLHRbMV0sdFsyXSl9LExpbmVTdHJpbmc6ZnVuY3Rpb24odCxuKXtmdSh0LmNvb3JkaW5hdGVzLG4sMCl9LE11bHRpTGluZVN0cmluZzpmdW5jdGlvbih0LG4pe2Zvcih2YXIgZT10LmNvb3JkaW5hdGVzLHI9LTEsaT1lLmxlbmd0aDsrK3I8aTspZnUoZVtyXSxuLDApfSxQb2x5Z29uOmZ1bmN0aW9uKHQsbil7Y3UodC5jb29yZGluYXRlcyxuKX0sTXVsdGlQb2x5Z29uOmZ1bmN0aW9uKHQsbil7Zm9yKHZhciBlPXQuY29vcmRpbmF0ZXMscj0tMSxpPWUubGVuZ3RoOysrcjxpOyljdShlW3JdLG4pfSxHZW9tZXRyeUNvbGxlY3Rpb246ZnVuY3Rpb24odCxuKXtmb3IodmFyIGU9dC5nZW9tZXRyaWVzLHI9LTEsaT1lLmxlbmd0aDsrK3I8aTspb3UoZVtyXSxuKX19O2Z1bmN0aW9uIGZ1KHQsbixlKXt2YXIgcixpPS0xLG89dC5sZW5ndGgtZTtmb3Iobi5saW5lU3RhcnQoKTsrK2k8bzspcj10W2ldLG4ucG9pbnQoclswXSxyWzFdLHJbMl0pO24ubGluZUVuZCgpfWZ1bmN0aW9uIGN1KHQsbil7dmFyIGU9LTEscj10Lmxlbmd0aDtmb3Iobi5wb2x5Z29uU3RhcnQoKTsrK2U8cjspZnUodFtlXSxuLDEpO24ucG9seWdvbkVuZCgpfWZ1bmN0aW9uIHN1KHQsbil7dCYmYXUuaGFzT3duUHJvcGVydHkodC50eXBlKT9hdVt0LnR5cGVdKHQsbik6b3UodCxuKX12YXIgbHUsaHUsZHUscHUsdnUsZ3U9UGEoKSx5dT1QYSgpLF91PXtwb2ludDppdSxsaW5lU3RhcnQ6aXUsbGluZUVuZDppdSxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXtndS5yZXNldCgpLF91LmxpbmVTdGFydD1idSxfdS5saW5lRW5kPW11fSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7dmFyIHQ9K2d1O3l1LmFkZCh0PDA/QmErdDp0KSx0aGlzLmxpbmVTdGFydD10aGlzLmxpbmVFbmQ9dGhpcy5wb2ludD1pdX0sc3BoZXJlOmZ1bmN0aW9uKCl7eXUuYWRkKEJhKX19O2Z1bmN0aW9uIGJ1KCl7X3UucG9pbnQ9eHV9ZnVuY3Rpb24gbXUoKXt3dShsdSxodSl9ZnVuY3Rpb24geHUodCxuKXtfdS5wb2ludD13dSxsdT10LGh1PW4sZHU9dCo9SWEscHU9R2Eobj0obio9SWEpLzIrWWEpLHZ1PVFhKG4pfWZ1bmN0aW9uIHd1KHQsbil7dmFyIGU9KHQqPUlhKS1kdSxyPWU+PTA/MTotMSxpPXIqZSxvPUdhKG49KG4qPUlhKS8yK1lhKSxhPVFhKG4pLHU9dnUqYSxmPXB1Km8rdSpHYShpKSxjPXUqcipRYShpKTtndS5hZGQoWGEoYyxmKSksZHU9dCxwdT1vLHZ1PWF9ZnVuY3Rpb24gTXUodCl7cmV0dXJuW1hhKHRbMV0sdFswXSksZXUodFsyXSldfWZ1bmN0aW9uIEF1KHQpe3ZhciBuPXRbMF0sZT10WzFdLHI9R2EoZSk7cmV0dXJuW3IqR2EobikscipRYShuKSxRYShlKV19ZnVuY3Rpb24gVHUodCxuKXtyZXR1cm4gdFswXSpuWzBdK3RbMV0qblsxXSt0WzJdKm5bMl19ZnVuY3Rpb24gTnUodCxuKXtyZXR1cm5bdFsxXSpuWzJdLXRbMl0qblsxXSx0WzJdKm5bMF0tdFswXSpuWzJdLHRbMF0qblsxXS10WzFdKm5bMF1dfWZ1bmN0aW9uIFN1KHQsbil7dFswXSs9blswXSx0WzFdKz1uWzFdLHRbMl0rPW5bMl19ZnVuY3Rpb24gRXUodCxuKXtyZXR1cm5bdFswXSpuLHRbMV0qbix0WzJdKm5dfWZ1bmN0aW9uIGt1KHQpe3ZhciBuPUthKHRbMF0qdFswXSt0WzFdKnRbMV0rdFsyXSp0WzJdKTt0WzBdLz1uLHRbMV0vPW4sdFsyXS89bn12YXIgQ3UsUHUsenUsUnUsTHUsRHUsVXUscXUsT3UsWXUsQnUsRnUsSXUsSHUsanUsWHUsR3UsVnUsJHUsV3UsWnUsUXUsSnUsS3UsdGYsbmYsZWY9UGEoKSxyZj17cG9pbnQ6b2YsbGluZVN0YXJ0OnVmLGxpbmVFbmQ6ZmYscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7cmYucG9pbnQ9Y2YscmYubGluZVN0YXJ0PXNmLHJmLmxpbmVFbmQ9bGYsZWYucmVzZXQoKSxfdS5wb2x5Z29uU3RhcnQoKX0scG9seWdvbkVuZDpmdW5jdGlvbigpe191LnBvbHlnb25FbmQoKSxyZi5wb2ludD1vZixyZi5saW5lU3RhcnQ9dWYscmYubGluZUVuZD1mZixndTwwPyhDdT0tKHp1PTE4MCksUHU9LShSdT05MCkpOmVmPkRhP1J1PTkwOmVmPC1EYSYmKFB1PS05MCksWXVbMF09Q3UsWXVbMV09enV9fTtmdW5jdGlvbiBvZih0LG4pe091LnB1c2goWXU9W0N1PXQsenU9dF0pLG48UHUmJihQdT1uKSxuPlJ1JiYoUnU9bil9ZnVuY3Rpb24gYWYodCxuKXt2YXIgZT1BdShbdCpJYSxuKklhXSk7aWYocXUpe3ZhciByPU51KHF1LGUpLGk9TnUoW3JbMV0sLXJbMF0sMF0scik7a3UoaSksaT1NdShpKTt2YXIgbyxhPXQtTHUsdT1hPjA/MTotMSxmPWlbMF0qRmEqdSxjPUhhKGEpPjE4MDtjXih1Kkx1PGYmJmY8dSp0KT8obz1pWzFdKkZhKT5SdSYmKFJ1PW8pOmNeKHUqTHU8KGY9KGYrMzYwKSUzNjAtMTgwKSYmZjx1KnQpPyhvPS1pWzFdKkZhKTxQdSYmKFB1PW8pOihuPFB1JiYoUHU9biksbj5SdSYmKFJ1PW4pKSxjP3Q8THU/aGYoQ3UsdCk+aGYoQ3UsenUpJiYoenU9dCk6aGYodCx6dSk+aGYoQ3UsenUpJiYoQ3U9dCk6enU+PUN1Pyh0PEN1JiYoQ3U9dCksdD56dSYmKHp1PXQpKTp0Pkx1P2hmKEN1LHQpPmhmKEN1LHp1KSYmKHp1PXQpOmhmKHQsenUpPmhmKEN1LHp1KSYmKEN1PXQpfWVsc2UgT3UucHVzaChZdT1bQ3U9dCx6dT10XSk7bjxQdSYmKFB1PW4pLG4+UnUmJihSdT1uKSxxdT1lLEx1PXR9ZnVuY3Rpb24gdWYoKXtyZi5wb2ludD1hZn1mdW5jdGlvbiBmZigpe1l1WzBdPUN1LFl1WzFdPXp1LHJmLnBvaW50PW9mLHF1PW51bGx9ZnVuY3Rpb24gY2YodCxuKXtpZihxdSl7dmFyIGU9dC1MdTtlZi5hZGQoSGEoZSk+MTgwP2UrKGU+MD8zNjA6LTM2MCk6ZSl9ZWxzZSBEdT10LFV1PW47X3UucG9pbnQodCxuKSxhZih0LG4pfWZ1bmN0aW9uIHNmKCl7X3UubGluZVN0YXJ0KCl9ZnVuY3Rpb24gbGYoKXtjZihEdSxVdSksX3UubGluZUVuZCgpLEhhKGVmKT5EYSYmKEN1PS0oenU9MTgwKSksWXVbMF09Q3UsWXVbMV09enUscXU9bnVsbH1mdW5jdGlvbiBoZih0LG4pe3JldHVybihuLT10KTwwP24rMzYwOm59ZnVuY3Rpb24gZGYodCxuKXtyZXR1cm4gdFswXS1uWzBdfWZ1bmN0aW9uIHBmKHQsbil7cmV0dXJuIHRbMF08PXRbMV0/dFswXTw9biYmbjw9dFsxXTpuPHRbMF18fHRbMV08bn12YXIgdmY9e3NwaGVyZTppdSxwb2ludDpnZixsaW5lU3RhcnQ6X2YsbGluZUVuZDp4Zixwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXt2Zi5saW5lU3RhcnQ9d2YsdmYubGluZUVuZD1NZn0scG9seWdvbkVuZDpmdW5jdGlvbigpe3ZmLmxpbmVTdGFydD1fZix2Zi5saW5lRW5kPXhmfX07ZnVuY3Rpb24gZ2YodCxuKXt0Kj1JYTt2YXIgZT1HYShuKj1JYSk7eWYoZSpHYSh0KSxlKlFhKHQpLFFhKG4pKX1mdW5jdGlvbiB5Zih0LG4sZSl7SXUrPSh0LUl1KS8rK0J1LEh1Kz0obi1IdSkvQnUsanUrPShlLWp1KS9CdX1mdW5jdGlvbiBfZigpe3ZmLnBvaW50PWJmfWZ1bmN0aW9uIGJmKHQsbil7dCo9SWE7dmFyIGU9R2Eobio9SWEpO0t1PWUqR2EodCksdGY9ZSpRYSh0KSxuZj1RYShuKSx2Zi5wb2ludD1tZix5ZihLdSx0ZixuZil9ZnVuY3Rpb24gbWYodCxuKXt0Kj1JYTt2YXIgZT1HYShuKj1JYSkscj1lKkdhKHQpLGk9ZSpRYSh0KSxvPVFhKG4pLGE9WGEoS2EoKGE9dGYqby1uZippKSphKyhhPW5mKnItS3UqbykqYSsoYT1LdSppLXRmKnIpKmEpLEt1KnIrdGYqaStuZipvKTtGdSs9YSxYdSs9YSooS3UrKEt1PXIpKSxHdSs9YSoodGYrKHRmPWkpKSxWdSs9YSoobmYrKG5mPW8pKSx5ZihLdSx0ZixuZil9ZnVuY3Rpb24geGYoKXt2Zi5wb2ludD1nZn1mdW5jdGlvbiB3Zigpe3ZmLnBvaW50PUFmfWZ1bmN0aW9uIE1mKCl7VGYoUXUsSnUpLHZmLnBvaW50PWdmfWZ1bmN0aW9uIEFmKHQsbil7UXU9dCxKdT1uLHQqPUlhLG4qPUlhLHZmLnBvaW50PVRmO3ZhciBlPUdhKG4pO0t1PWUqR2EodCksdGY9ZSpRYSh0KSxuZj1RYShuKSx5ZihLdSx0ZixuZil9ZnVuY3Rpb24gVGYodCxuKXt0Kj1JYTt2YXIgZT1HYShuKj1JYSkscj1lKkdhKHQpLGk9ZSpRYSh0KSxvPVFhKG4pLGE9dGYqby1uZippLHU9bmYqci1LdSpvLGY9S3UqaS10ZipyLGM9S2EoYSphK3UqdStmKmYpLHM9ZXUoYyksbD1jJiYtcy9jOyR1Kz1sKmEsV3UrPWwqdSxadSs9bCpmLEZ1Kz1zLFh1Kz1zKihLdSsoS3U9cikpLEd1Kz1zKih0ZisodGY9aSkpLFZ1Kz1zKihuZisobmY9bykpLHlmKEt1LHRmLG5mKX1mdW5jdGlvbiBOZih0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19ZnVuY3Rpb24gU2YodCxuKXtmdW5jdGlvbiBlKGUscil7cmV0dXJuIGU9dChlLHIpLG4oZVswXSxlWzFdKX1yZXR1cm4gdC5pbnZlcnQmJm4uaW52ZXJ0JiYoZS5pbnZlcnQ9ZnVuY3Rpb24oZSxyKXtyZXR1cm4oZT1uLmludmVydChlLHIpKSYmdC5pbnZlcnQoZVswXSxlWzFdKX0pLGV9ZnVuY3Rpb24gRWYodCxuKXtyZXR1cm5bdD5xYT90LUJhOnQ8LXFhP3QrQmE6dCxuXX1mdW5jdGlvbiBrZih0LG4sZSl7cmV0dXJuKHQlPUJhKT9ufHxlP1NmKFBmKHQpLHpmKG4sZSkpOlBmKHQpOm58fGU/emYobixlKTpFZn1mdW5jdGlvbiBDZih0KXtyZXR1cm4gZnVuY3Rpb24obixlKXtyZXR1cm5bKG4rPXQpPnFhP24tQmE6bjwtcWE/bitCYTpuLGVdfX1mdW5jdGlvbiBQZih0KXt2YXIgbj1DZih0KTtyZXR1cm4gbi5pbnZlcnQ9Q2YoLXQpLG59ZnVuY3Rpb24gemYodCxuKXt2YXIgZT1HYSh0KSxyPVFhKHQpLGk9R2Eobiksbz1RYShuKTtmdW5jdGlvbiBhKHQsbil7dmFyIGE9R2EobiksdT1HYSh0KSphLGY9UWEodCkqYSxjPVFhKG4pLHM9YyplK3UqcjtyZXR1cm5bWGEoZippLXMqbyx1KmUtYypyKSxldShzKmkrZipvKV19cmV0dXJuIGEuaW52ZXJ0PWZ1bmN0aW9uKHQsbil7dmFyIGE9R2EobiksdT1HYSh0KSphLGY9UWEodCkqYSxjPVFhKG4pLHM9YyppLWYqbztyZXR1cm5bWGEoZippK2Mqbyx1KmUrcypyKSxldShzKmUtdSpyKV19LGF9ZnVuY3Rpb24gUmYodCl7ZnVuY3Rpb24gbihuKXtyZXR1cm4obj10KG5bMF0qSWEsblsxXSpJYSkpWzBdKj1GYSxuWzFdKj1GYSxufXJldHVybiB0PWtmKHRbMF0qSWEsdFsxXSpJYSx0Lmxlbmd0aD4yP3RbMl0qSWE6MCksbi5pbnZlcnQ9ZnVuY3Rpb24obil7cmV0dXJuKG49dC5pbnZlcnQoblswXSpJYSxuWzFdKklhKSlbMF0qPUZhLG5bMV0qPUZhLG59LG59ZnVuY3Rpb24gTGYodCxuLGUscixpLG8pe2lmKGUpe3ZhciBhPUdhKG4pLHU9UWEobiksZj1yKmU7bnVsbD09aT8oaT1uK3IqQmEsbz1uLWYvMik6KGk9RGYoYSxpKSxvPURmKGEsbyksKHI+MD9pPG86aT5vKSYmKGkrPXIqQmEpKTtmb3IodmFyIGMscz1pO3I+MD9zPm86czxvO3MtPWYpYz1NdShbYSwtdSpHYShzKSwtdSpRYShzKV0pLHQucG9pbnQoY1swXSxjWzFdKX19ZnVuY3Rpb24gRGYodCxuKXsobj1BdShuKSlbMF0tPXQsa3Uobik7dmFyIGU9bnUoLW5bMV0pO3JldHVybigoLW5bMl08MD8tZTplKStCYS1EYSklQmF9ZnVuY3Rpb24gVWYoKXt2YXIgdCxuPVtdO3JldHVybntwb2ludDpmdW5jdGlvbihuLGUpe3QucHVzaChbbixlXSl9LGxpbmVTdGFydDpmdW5jdGlvbigpe24ucHVzaCh0PVtdKX0sbGluZUVuZDppdSxyZWpvaW46ZnVuY3Rpb24oKXtuLmxlbmd0aD4xJiZuLnB1c2gobi5wb3AoKS5jb25jYXQobi5zaGlmdCgpKSl9LHJlc3VsdDpmdW5jdGlvbigpe3ZhciBlPW47cmV0dXJuIG49W10sdD1udWxsLGV9fX1mdW5jdGlvbiBxZih0LG4pe3JldHVybiBIYSh0WzBdLW5bMF0pPERhJiZIYSh0WzFdLW5bMV0pPERhfWZ1bmN0aW9uIE9mKHQsbixlLHIpe3RoaXMueD10LHRoaXMuej1uLHRoaXMubz1lLHRoaXMuZT1yLHRoaXMudj0hMSx0aGlzLm49dGhpcy5wPW51bGx9ZnVuY3Rpb24gWWYodCxuLGUscixpKXt2YXIgbyxhLHU9W10sZj1bXTtpZih0LmZvckVhY2goZnVuY3Rpb24odCl7aWYoISgobj10Lmxlbmd0aC0xKTw9MCkpe3ZhciBuLGUscj10WzBdLGE9dFtuXTtpZihxZihyLGEpKXtmb3IoaS5saW5lU3RhcnQoKSxvPTA7bzxuOysrbylpLnBvaW50KChyPXRbb10pWzBdLHJbMV0pO2kubGluZUVuZCgpfWVsc2UgdS5wdXNoKGU9bmV3IE9mKHIsdCxudWxsLCEwKSksZi5wdXNoKGUubz1uZXcgT2YocixudWxsLGUsITEpKSx1LnB1c2goZT1uZXcgT2YoYSx0LG51bGwsITEpKSxmLnB1c2goZS5vPW5ldyBPZihhLG51bGwsZSwhMCkpfX0pLHUubGVuZ3RoKXtmb3IoZi5zb3J0KG4pLEJmKHUpLEJmKGYpLG89MCxhPWYubGVuZ3RoO288YTsrK28pZltvXS5lPWU9IWU7Zm9yKHZhciBjLHMsbD11WzBdOzspe2Zvcih2YXIgaD1sLGQ9ITA7aC52OylpZigoaD1oLm4pPT09bClyZXR1cm47Yz1oLnosaS5saW5lU3RhcnQoKTtkb3tpZihoLnY9aC5vLnY9ITAsaC5lKXtpZihkKWZvcihvPTAsYT1jLmxlbmd0aDtvPGE7KytvKWkucG9pbnQoKHM9Y1tvXSlbMF0sc1sxXSk7ZWxzZSByKGgueCxoLm4ueCwxLGkpO2g9aC5ufWVsc2V7aWYoZClmb3IoYz1oLnAueixvPWMubGVuZ3RoLTE7bz49MDstLW8paS5wb2ludCgocz1jW29dKVswXSxzWzFdKTtlbHNlIHIoaC54LGgucC54LC0xLGkpO2g9aC5wfWM9KGg9aC5vKS56LGQ9IWR9d2hpbGUoIWgudik7aS5saW5lRW5kKCl9fX1mdW5jdGlvbiBCZih0KXtpZihuPXQubGVuZ3RoKXtmb3IodmFyIG4sZSxyPTAsaT10WzBdOysrcjxuOylpLm49ZT10W3JdLGUucD1pLGk9ZTtpLm49ZT10WzBdLGUucD1pfX1FZi5pbnZlcnQ9RWY7dmFyIEZmPVBhKCk7ZnVuY3Rpb24gSWYodCxuKXt2YXIgZT1uWzBdLHI9blsxXSxpPVFhKHIpLG89W1FhKGUpLC1HYShlKSwwXSxhPTAsdT0wO0ZmLnJlc2V0KCksMT09PWk/cj1PYStEYTotMT09PWkmJihyPS1PYS1EYSk7Zm9yKHZhciBmPTAsYz10Lmxlbmd0aDtmPGM7KytmKWlmKGw9KHM9dFtmXSkubGVuZ3RoKWZvcih2YXIgcyxsLGg9c1tsLTFdLGQ9aFswXSxwPWhbMV0vMitZYSx2PVFhKHApLGc9R2EocCkseT0wO3k8bDsrK3ksZD1iLHY9eCxnPXcsaD1fKXt2YXIgXz1zW3ldLGI9X1swXSxtPV9bMV0vMitZYSx4PVFhKG0pLHc9R2EobSksTT1iLWQsQT1NPj0wPzE6LTEsVD1BKk0sTj1UPnFhLFM9dip4O2lmKEZmLmFkZChYYShTKkEqUWEoVCksZyp3K1MqR2EoVCkpKSxhKz1OP00rQSpCYTpNLE5eZD49ZV5iPj1lKXt2YXIgRT1OdShBdShoKSxBdShfKSk7a3UoRSk7dmFyIGs9TnUobyxFKTtrdShrKTt2YXIgQz0oTl5NPj0wPy0xOjEpKmV1KGtbMl0pOyhyPkN8fHI9PT1DJiYoRVswXXx8RVsxXSkpJiYodSs9Tl5NPj0wPzE6LTEpfX1yZXR1cm4oYTwtRGF8fGE8RGEmJkZmPC1EYSleMSZ1fWZ1bmN0aW9uIEhmKHQsbixlLHIpe3JldHVybiBmdW5jdGlvbihpKXt2YXIgbyxhLHUsZj1uKGkpLGM9VWYoKSxzPW4oYyksbD0hMSxoPXtwb2ludDpkLGxpbmVTdGFydDp2LGxpbmVFbmQ6Zyxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXtoLnBvaW50PXksaC5saW5lU3RhcnQ9XyxoLmxpbmVFbmQ9YixhPVtdLG89W119LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXtoLnBvaW50PWQsaC5saW5lU3RhcnQ9dixoLmxpbmVFbmQ9ZyxhPU4oYSk7dmFyIHQ9SWYobyxyKTthLmxlbmd0aD8obHx8KGkucG9seWdvblN0YXJ0KCksbD0hMCksWWYoYSxYZix0LGUsaSkpOnQmJihsfHwoaS5wb2x5Z29uU3RhcnQoKSxsPSEwKSxpLmxpbmVTdGFydCgpLGUobnVsbCxudWxsLDEsaSksaS5saW5lRW5kKCkpLGwmJihpLnBvbHlnb25FbmQoKSxsPSExKSxhPW89bnVsbH0sc3BoZXJlOmZ1bmN0aW9uKCl7aS5wb2x5Z29uU3RhcnQoKSxpLmxpbmVTdGFydCgpLGUobnVsbCxudWxsLDEsaSksaS5saW5lRW5kKCksaS5wb2x5Z29uRW5kKCl9fTtmdW5jdGlvbiBkKG4sZSl7dChuLGUpJiZpLnBvaW50KG4sZSl9ZnVuY3Rpb24gcCh0LG4pe2YucG9pbnQodCxuKX1mdW5jdGlvbiB2KCl7aC5wb2ludD1wLGYubGluZVN0YXJ0KCl9ZnVuY3Rpb24gZygpe2gucG9pbnQ9ZCxmLmxpbmVFbmQoKX1mdW5jdGlvbiB5KHQsbil7dS5wdXNoKFt0LG5dKSxzLnBvaW50KHQsbil9ZnVuY3Rpb24gXygpe3MubGluZVN0YXJ0KCksdT1bXX1mdW5jdGlvbiBiKCl7eSh1WzBdWzBdLHVbMF1bMV0pLHMubGluZUVuZCgpO3ZhciB0LG4sZSxyLGY9cy5jbGVhbigpLGg9Yy5yZXN1bHQoKSxkPWgubGVuZ3RoO2lmKHUucG9wKCksby5wdXNoKHUpLHU9bnVsbCxkKWlmKDEmZil7aWYoKG49KGU9aFswXSkubGVuZ3RoLTEpPjApe2ZvcihsfHwoaS5wb2x5Z29uU3RhcnQoKSxsPSEwKSxpLmxpbmVTdGFydCgpLHQ9MDt0PG47Kyt0KWkucG9pbnQoKHI9ZVt0XSlbMF0sclsxXSk7aS5saW5lRW5kKCl9fWVsc2UgZD4xJiYyJmYmJmgucHVzaChoLnBvcCgpLmNvbmNhdChoLnNoaWZ0KCkpKSxhLnB1c2goaC5maWx0ZXIoamYpKX1yZXR1cm4gaH19ZnVuY3Rpb24gamYodCl7cmV0dXJuIHQubGVuZ3RoPjF9ZnVuY3Rpb24gWGYodCxuKXtyZXR1cm4oKHQ9dC54KVswXTwwP3RbMV0tT2EtRGE6T2EtdFsxXSktKChuPW4ueClbMF08MD9uWzFdLU9hLURhOk9hLW5bMV0pfXZhciBHZj1IZihmdW5jdGlvbigpe3JldHVybiEwfSxmdW5jdGlvbih0KXt2YXIgbixlPU5hTixyPU5hTixpPU5hTjtyZXR1cm57bGluZVN0YXJ0OmZ1bmN0aW9uKCl7dC5saW5lU3RhcnQoKSxuPTF9LHBvaW50OmZ1bmN0aW9uKG8sYSl7dmFyIHU9bz4wP3FhOi1xYSxmPUhhKG8tZSk7SGEoZi1xYSk8RGE/KHQucG9pbnQoZSxyPShyK2EpLzI+MD9PYTotT2EpLHQucG9pbnQoaSxyKSx0LmxpbmVFbmQoKSx0LmxpbmVTdGFydCgpLHQucG9pbnQodSxyKSx0LnBvaW50KG8sciksbj0wKTppIT09dSYmZj49cWEmJihIYShlLWkpPERhJiYoZS09aSpEYSksSGEoby11KTxEYSYmKG8tPXUqRGEpLHI9ZnVuY3Rpb24odCxuLGUscil7dmFyIGksbyxhPVFhKHQtZSk7cmV0dXJuIEhhKGEpPkRhP2phKChRYShuKSoobz1HYShyKSkqUWEoZSktUWEocikqKGk9R2EobikpKlFhKHQpKS8oaSpvKmEpKToobityKS8yfShlLHIsbyxhKSx0LnBvaW50KGksciksdC5saW5lRW5kKCksdC5saW5lU3RhcnQoKSx0LnBvaW50KHUsciksbj0wKSx0LnBvaW50KGU9byxyPWEpLGk9dX0sbGluZUVuZDpmdW5jdGlvbigpe3QubGluZUVuZCgpLGU9cj1OYU59LGNsZWFuOmZ1bmN0aW9uKCl7cmV0dXJuIDItbn19fSxmdW5jdGlvbih0LG4sZSxyKXt2YXIgaTtpZihudWxsPT10KWk9ZSpPYSxyLnBvaW50KC1xYSxpKSxyLnBvaW50KDAsaSksci5wb2ludChxYSxpKSxyLnBvaW50KHFhLDApLHIucG9pbnQocWEsLWkpLHIucG9pbnQoMCwtaSksci5wb2ludCgtcWEsLWkpLHIucG9pbnQoLXFhLDApLHIucG9pbnQoLXFhLGkpO2Vsc2UgaWYoSGEodFswXS1uWzBdKT5EYSl7dmFyIG89dFswXTxuWzBdP3FhOi1xYTtpPWUqby8yLHIucG9pbnQoLW8saSksci5wb2ludCgwLGkpLHIucG9pbnQobyxpKX1lbHNlIHIucG9pbnQoblswXSxuWzFdKX0sWy1xYSwtT2FdKTtmdW5jdGlvbiBWZih0KXt2YXIgbj1HYSh0KSxlPTYqSWEscj1uPjAsaT1IYShuKT5EYTtmdW5jdGlvbiBvKHQsZSl7cmV0dXJuIEdhKHQpKkdhKGUpPm59ZnVuY3Rpb24gYSh0LGUscil7dmFyIGk9WzEsMCwwXSxvPU51KEF1KHQpLEF1KGUpKSxhPVR1KG8sbyksdT1vWzBdLGY9YS11KnU7aWYoIWYpcmV0dXJuIXImJnQ7dmFyIGM9biphL2Yscz0tbip1L2YsbD1OdShpLG8pLGg9RXUoaSxjKTtTdShoLEV1KG8scykpO3ZhciBkPWwscD1UdShoLGQpLHY9VHUoZCxkKSxnPXAqcC12KihUdShoLGgpLTEpO2lmKCEoZzwwKSl7dmFyIHk9S2EoZyksXz1FdShkLCgtcC15KS92KTtpZihTdShfLGgpLF89TXUoXyksIXIpcmV0dXJuIF87dmFyIGIsbT10WzBdLHg9ZVswXSx3PXRbMV0sTT1lWzFdO3g8bSYmKGI9bSxtPXgseD1iKTt2YXIgQT14LW0sVD1IYShBLXFhKTxEYTtpZighVCYmTTx3JiYoYj13LHc9TSxNPWIpLFR8fEE8RGE/VD93K00+MF5fWzFdPChIYShfWzBdLW0pPERhP3c6TSk6dzw9X1sxXSYmX1sxXTw9TTpBPnFhXihtPD1fWzBdJiZfWzBdPD14KSl7dmFyIE49RXUoZCwoLXAreSkvdik7cmV0dXJuIFN1KE4saCksW18sTXUoTildfX19ZnVuY3Rpb24gdShuLGUpe3ZhciBpPXI/dDpxYS10LG89MDtyZXR1cm4gbjwtaT9vfD0xOm4+aSYmKG98PTIpLGU8LWk/b3w9NDplPmkmJihvfD04KSxvfXJldHVybiBIZihvLGZ1bmN0aW9uKHQpe3ZhciBuLGUsZixjLHM7cmV0dXJue2xpbmVTdGFydDpmdW5jdGlvbigpe2M9Zj0hMSxzPTF9LHBvaW50OmZ1bmN0aW9uKGwsaCl7dmFyIGQscD1bbCxoXSx2PW8obCxoKSxnPXI/dj8wOnUobCxoKTp2P3UobCsobDwwP3FhOi1xYSksaCk6MDtpZighbiYmKGM9Zj12KSYmdC5saW5lU3RhcnQoKSx2IT09ZiYmKCEoZD1hKG4scCkpfHxxZihuLGQpfHxxZihwLGQpKSYmKHBbMF0rPURhLHBbMV0rPURhLHY9byhwWzBdLHBbMV0pKSx2IT09ZilzPTAsdj8odC5saW5lU3RhcnQoKSxkPWEocCxuKSx0LnBvaW50KGRbMF0sZFsxXSkpOihkPWEobixwKSx0LnBvaW50KGRbMF0sZFsxXSksdC5saW5lRW5kKCkpLG49ZDtlbHNlIGlmKGkmJm4mJnJedil7dmFyIHk7ZyZlfHwhKHk9YShwLG4sITApKXx8KHM9MCxyPyh0LmxpbmVTdGFydCgpLHQucG9pbnQoeVswXVswXSx5WzBdWzFdKSx0LnBvaW50KHlbMV1bMF0seVsxXVsxXSksdC5saW5lRW5kKCkpOih0LnBvaW50KHlbMV1bMF0seVsxXVsxXSksdC5saW5lRW5kKCksdC5saW5lU3RhcnQoKSx0LnBvaW50KHlbMF1bMF0seVswXVsxXSkpKX0hdnx8biYmcWYobixwKXx8dC5wb2ludChwWzBdLHBbMV0pLG49cCxmPXYsZT1nfSxsaW5lRW5kOmZ1bmN0aW9uKCl7ZiYmdC5saW5lRW5kKCksbj1udWxsfSxjbGVhbjpmdW5jdGlvbigpe3JldHVybiBzfChjJiZmKTw8MX19fSxmdW5jdGlvbihuLHIsaSxvKXtMZihvLHQsZSxpLG4scil9LHI/WzAsLXRdOlstcWEsdC1xYV0pfXZhciAkZj0xZTksV2Y9LSRmO2Z1bmN0aW9uIFpmKHQsbixlLHIpe2Z1bmN0aW9uIGkoaSxvKXtyZXR1cm4gdDw9aSYmaTw9ZSYmbjw9byYmbzw9cn1mdW5jdGlvbiBvKGksbyx1LGMpe3ZhciBzPTAsbD0wO2lmKG51bGw9PWl8fChzPWEoaSx1KSkhPT0obD1hKG8sdSkpfHxmKGksbyk8MF51PjApZG97Yy5wb2ludCgwPT09c3x8Mz09PXM/dDplLHM+MT9yOm4pfXdoaWxlKChzPShzK3UrNCklNCkhPT1sKTtlbHNlIGMucG9pbnQob1swXSxvWzFdKX1mdW5jdGlvbiBhKHIsaSl7cmV0dXJuIEhhKHJbMF0tdCk8RGE/aT4wPzA6MzpIYShyWzBdLWUpPERhP2k+MD8yOjE6SGEoclsxXS1uKTxEYT9pPjA/MTowOmk+MD8zOjJ9ZnVuY3Rpb24gdSh0LG4pe3JldHVybiBmKHQueCxuLngpfWZ1bmN0aW9uIGYodCxuKXt2YXIgZT1hKHQsMSkscj1hKG4sMSk7cmV0dXJuIGUhPT1yP2UtcjowPT09ZT9uWzFdLXRbMV06MT09PWU/dFswXS1uWzBdOjI9PT1lP3RbMV0tblsxXTpuWzBdLXRbMF19cmV0dXJuIGZ1bmN0aW9uKGEpe3ZhciBmLGMscyxsLGgsZCxwLHYsZyx5LF8sYj1hLG09VWYoKSx4PXtwb2ludDp3LGxpbmVTdGFydDpmdW5jdGlvbigpe3gucG9pbnQ9TSxjJiZjLnB1c2gocz1bXSk7eT0hMCxnPSExLHA9dj1OYU59LGxpbmVFbmQ6ZnVuY3Rpb24oKXtmJiYoTShsLGgpLGQmJmcmJm0ucmVqb2luKCksZi5wdXNoKG0ucmVzdWx0KCkpKTt4LnBvaW50PXcsZyYmYi5saW5lRW5kKCl9LHBvbHlnb25TdGFydDpmdW5jdGlvbigpe2I9bSxmPVtdLGM9W10sXz0hMH0scG9seWdvbkVuZDpmdW5jdGlvbigpe3ZhciBuPWZ1bmN0aW9uKCl7Zm9yKHZhciBuPTAsZT0wLGk9Yy5sZW5ndGg7ZTxpOysrZSlmb3IodmFyIG8sYSx1PWNbZV0sZj0xLHM9dS5sZW5ndGgsbD11WzBdLGg9bFswXSxkPWxbMV07ZjxzOysrZilvPWgsYT1kLGw9dVtmXSxoPWxbMF0sZD1sWzFdLGE8PXI/ZD5yJiYoaC1vKSooci1hKT4oZC1hKSoodC1vKSYmKytuOmQ8PXImJihoLW8pKihyLWEpPChkLWEpKih0LW8pJiYtLW47cmV0dXJuIG59KCksZT1fJiZuLGk9KGY9TihmKSkubGVuZ3RoOyhlfHxpKSYmKGEucG9seWdvblN0YXJ0KCksZSYmKGEubGluZVN0YXJ0KCksbyhudWxsLG51bGwsMSxhKSxhLmxpbmVFbmQoKSksaSYmWWYoZix1LG4sbyxhKSxhLnBvbHlnb25FbmQoKSk7Yj1hLGY9Yz1zPW51bGx9fTtmdW5jdGlvbiB3KHQsbil7aSh0LG4pJiZiLnBvaW50KHQsbil9ZnVuY3Rpb24gTShvLGEpe3ZhciB1PWkobyxhKTtpZihjJiZzLnB1c2goW28sYV0pLHkpbD1vLGg9YSxkPXUseT0hMSx1JiYoYi5saW5lU3RhcnQoKSxiLnBvaW50KG8sYSkpO2Vsc2UgaWYodSYmZyliLnBvaW50KG8sYSk7ZWxzZXt2YXIgZj1bcD1NYXRoLm1heChXZixNYXRoLm1pbigkZixwKSksdj1NYXRoLm1heChXZixNYXRoLm1pbigkZix2KSldLG09W289TWF0aC5tYXgoV2YsTWF0aC5taW4oJGYsbykpLGE9TWF0aC5tYXgoV2YsTWF0aC5taW4oJGYsYSkpXTshZnVuY3Rpb24odCxuLGUscixpLG8pe3ZhciBhLHU9dFswXSxmPXRbMV0sYz0wLHM9MSxsPW5bMF0tdSxoPW5bMV0tZjtpZihhPWUtdSxsfHwhKGE+MCkpe2lmKGEvPWwsbDwwKXtpZihhPGMpcmV0dXJuO2E8cyYmKHM9YSl9ZWxzZSBpZihsPjApe2lmKGE+cylyZXR1cm47YT5jJiYoYz1hKX1pZihhPWktdSxsfHwhKGE8MCkpe2lmKGEvPWwsbDwwKXtpZihhPnMpcmV0dXJuO2E+YyYmKGM9YSl9ZWxzZSBpZihsPjApe2lmKGE8YylyZXR1cm47YTxzJiYocz1hKX1pZihhPXItZixofHwhKGE+MCkpe2lmKGEvPWgsaDwwKXtpZihhPGMpcmV0dXJuO2E8cyYmKHM9YSl9ZWxzZSBpZihoPjApe2lmKGE+cylyZXR1cm47YT5jJiYoYz1hKX1pZihhPW8tZixofHwhKGE8MCkpe2lmKGEvPWgsaDwwKXtpZihhPnMpcmV0dXJuO2E+YyYmKGM9YSl9ZWxzZSBpZihoPjApe2lmKGE8YylyZXR1cm47YTxzJiYocz1hKX1yZXR1cm4gYz4wJiYodFswXT11K2MqbCx0WzFdPWYrYypoKSxzPDEmJihuWzBdPXUrcypsLG5bMV09ZitzKmgpLCEwfX19fX0oZixtLHQsbixlLHIpP3UmJihiLmxpbmVTdGFydCgpLGIucG9pbnQobyxhKSxfPSExKTooZ3x8KGIubGluZVN0YXJ0KCksYi5wb2ludChmWzBdLGZbMV0pKSxiLnBvaW50KG1bMF0sbVsxXSksdXx8Yi5saW5lRW5kKCksXz0hMSl9cD1vLHY9YSxnPXV9cmV0dXJuIHh9fXZhciBRZixKZixLZix0Yz1QYSgpLG5jPXtzcGhlcmU6aXUscG9pbnQ6aXUsbGluZVN0YXJ0OmZ1bmN0aW9uKCl7bmMucG9pbnQ9cmMsbmMubGluZUVuZD1lY30sbGluZUVuZDppdSxwb2x5Z29uU3RhcnQ6aXUscG9seWdvbkVuZDppdX07ZnVuY3Rpb24gZWMoKXtuYy5wb2ludD1uYy5saW5lRW5kPWl1fWZ1bmN0aW9uIHJjKHQsbil7UWY9dCo9SWEsSmY9UWEobio9SWEpLEtmPUdhKG4pLG5jLnBvaW50PWljfWZ1bmN0aW9uIGljKHQsbil7dCo9SWE7dmFyIGU9UWEobio9SWEpLHI9R2EobiksaT1IYSh0LVFmKSxvPUdhKGkpLGE9cipRYShpKSx1PUtmKmUtSmYqcipvLGY9SmYqZStLZipyKm87dGMuYWRkKFhhKEthKGEqYSt1KnUpLGYpKSxRZj10LEpmPWUsS2Y9cn1mdW5jdGlvbiBvYyh0KXtyZXR1cm4gdGMucmVzZXQoKSxzdSh0LG5jKSwrdGN9dmFyIGFjPVtudWxsLG51bGxdLHVjPXt0eXBlOiJMaW5lU3RyaW5nIixjb29yZGluYXRlczphY307ZnVuY3Rpb24gZmModCxuKXtyZXR1cm4gYWNbMF09dCxhY1sxXT1uLG9jKHVjKX12YXIgY2M9e0ZlYXR1cmU6ZnVuY3Rpb24odCxuKXtyZXR1cm4gbGModC5nZW9tZXRyeSxuKX0sRmVhdHVyZUNvbGxlY3Rpb246ZnVuY3Rpb24odCxuKXtmb3IodmFyIGU9dC5mZWF0dXJlcyxyPS0xLGk9ZS5sZW5ndGg7KytyPGk7KWlmKGxjKGVbcl0uZ2VvbWV0cnksbikpcmV0dXJuITA7cmV0dXJuITF9fSxzYz17U3BoZXJlOmZ1bmN0aW9uKCl7cmV0dXJuITB9LFBvaW50OmZ1bmN0aW9uKHQsbil7cmV0dXJuIGhjKHQuY29vcmRpbmF0ZXMsbil9LE11bHRpUG9pbnQ6ZnVuY3Rpb24odCxuKXtmb3IodmFyIGU9dC5jb29yZGluYXRlcyxyPS0xLGk9ZS5sZW5ndGg7KytyPGk7KWlmKGhjKGVbcl0sbikpcmV0dXJuITA7cmV0dXJuITF9LExpbmVTdHJpbmc6ZnVuY3Rpb24odCxuKXtyZXR1cm4gZGModC5jb29yZGluYXRlcyxuKX0sTXVsdGlMaW5lU3RyaW5nOmZ1bmN0aW9uKHQsbil7Zm9yKHZhciBlPXQuY29vcmRpbmF0ZXMscj0tMSxpPWUubGVuZ3RoOysrcjxpOylpZihkYyhlW3JdLG4pKXJldHVybiEwO3JldHVybiExfSxQb2x5Z29uOmZ1bmN0aW9uKHQsbil7cmV0dXJuIHBjKHQuY29vcmRpbmF0ZXMsbil9LE11bHRpUG9seWdvbjpmdW5jdGlvbih0LG4pe2Zvcih2YXIgZT10LmNvb3JkaW5hdGVzLHI9LTEsaT1lLmxlbmd0aDsrK3I8aTspaWYocGMoZVtyXSxuKSlyZXR1cm4hMDtyZXR1cm4hMX0sR2VvbWV0cnlDb2xsZWN0aW9uOmZ1bmN0aW9uKHQsbil7Zm9yKHZhciBlPXQuZ2VvbWV0cmllcyxyPS0xLGk9ZS5sZW5ndGg7KytyPGk7KWlmKGxjKGVbcl0sbikpcmV0dXJuITA7cmV0dXJuITF9fTtmdW5jdGlvbiBsYyh0LG4pe3JldHVybiEoIXR8fCFzYy5oYXNPd25Qcm9wZXJ0eSh0LnR5cGUpKSYmc2NbdC50eXBlXSh0LG4pfWZ1bmN0aW9uIGhjKHQsbil7cmV0dXJuIDA9PT1mYyh0LG4pfWZ1bmN0aW9uIGRjKHQsbil7dmFyIGU9ZmModFswXSx0WzFdKTtyZXR1cm4gZmModFswXSxuKStmYyhuLHRbMV0pPD1lK0RhfWZ1bmN0aW9uIHBjKHQsbil7cmV0dXJuISFJZih0Lm1hcCh2YyksZ2MobikpfWZ1bmN0aW9uIHZjKHQpe3JldHVybih0PXQubWFwKGdjKSkucG9wKCksdH1mdW5jdGlvbiBnYyh0KXtyZXR1cm5bdFswXSpJYSx0WzFdKklhXX1mdW5jdGlvbiB5Yyh0LG4sZSl7dmFyIHI9Zyh0LG4tRGEsZSkuY29uY2F0KG4pO3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gci5tYXAoZnVuY3Rpb24obil7cmV0dXJuW3Qsbl19KX19ZnVuY3Rpb24gX2ModCxuLGUpe3ZhciByPWcodCxuLURhLGUpLmNvbmNhdChuKTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIHIubWFwKGZ1bmN0aW9uKG4pe3JldHVybltuLHRdfSl9fWZ1bmN0aW9uIGJjKCl7dmFyIHQsbixlLHIsaSxvLGEsdSxmLGMscyxsLGg9MTAsZD1oLHA9OTAsdj0zNjAseT0yLjU7ZnVuY3Rpb24gXygpe3JldHVybnt0eXBlOiJNdWx0aUxpbmVTdHJpbmciLGNvb3JkaW5hdGVzOmIoKX19ZnVuY3Rpb24gYigpe3JldHVybiBnKFZhKHIvcCkqcCxlLHApLm1hcChzKS5jb25jYXQoZyhWYSh1L3YpKnYsYSx2KS5tYXAobCkpLmNvbmNhdChnKFZhKG4vaCkqaCx0LGgpLmZpbHRlcihmdW5jdGlvbih0KXtyZXR1cm4gSGEodCVwKT5EYX0pLm1hcChmKSkuY29uY2F0KGcoVmEoby9kKSpkLGksZCkuZmlsdGVyKGZ1bmN0aW9uKHQpe3JldHVybiBIYSh0JXYpPkRhfSkubWFwKGMpKX1yZXR1cm4gXy5saW5lcz1mdW5jdGlvbigpe3JldHVybiBiKCkubWFwKGZ1bmN0aW9uKHQpe3JldHVybnt0eXBlOiJMaW5lU3RyaW5nIixjb29yZGluYXRlczp0fX0pfSxfLm91dGxpbmU9ZnVuY3Rpb24oKXtyZXR1cm57dHlwZToiUG9seWdvbiIsY29vcmRpbmF0ZXM6W3MocikuY29uY2F0KGwoYSkuc2xpY2UoMSkscyhlKS5yZXZlcnNlKCkuc2xpY2UoMSksbCh1KS5yZXZlcnNlKCkuc2xpY2UoMSkpXX19LF8uZXh0ZW50PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP18uZXh0ZW50TWFqb3IodCkuZXh0ZW50TWlub3IodCk6Xy5leHRlbnRNaW5vcigpfSxfLmV4dGVudE1ham9yPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPSt0WzBdWzBdLGU9K3RbMV1bMF0sdT0rdFswXVsxXSxhPSt0WzFdWzFdLHI+ZSYmKHQ9cixyPWUsZT10KSx1PmEmJih0PXUsdT1hLGE9dCksXy5wcmVjaXNpb24oeSkpOltbcix1XSxbZSxhXV19LF8uZXh0ZW50TWlub3I9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49K2VbMF1bMF0sdD0rZVsxXVswXSxvPStlWzBdWzFdLGk9K2VbMV1bMV0sbj50JiYoZT1uLG49dCx0PWUpLG8+aSYmKGU9byxvPWksaT1lKSxfLnByZWNpc2lvbih5KSk6W1tuLG9dLFt0LGldXX0sXy5zdGVwPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP18uc3RlcE1ham9yKHQpLnN0ZXBNaW5vcih0KTpfLnN0ZXBNaW5vcigpfSxfLnN0ZXBNYWpvcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocD0rdFswXSx2PSt0WzFdLF8pOltwLHZdfSxfLnN0ZXBNaW5vcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaD0rdFswXSxkPSt0WzFdLF8pOltoLGRdfSxfLnByZWNpc2lvbj1mdW5jdGlvbihoKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oeT0raCxmPXljKG8saSw5MCksYz1fYyhuLHQseSkscz15Yyh1LGEsOTApLGw9X2MocixlLHkpLF8pOnl9LF8uZXh0ZW50TWFqb3IoW1stMTgwLC05MCtEYV0sWzE4MCw5MC1EYV1dKS5leHRlbnRNaW5vcihbWy0xODAsLTgwLURhXSxbMTgwLDgwK0RhXV0pfWZ1bmN0aW9uIG1jKHQpe3JldHVybiB0fXZhciB4Yyx3YyxNYyxBYyxUYz1QYSgpLE5jPVBhKCksU2M9e3BvaW50Oml1LGxpbmVTdGFydDppdSxsaW5lRW5kOml1LHBvbHlnb25TdGFydDpmdW5jdGlvbigpe1NjLmxpbmVTdGFydD1FYyxTYy5saW5lRW5kPVBjfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7U2MubGluZVN0YXJ0PVNjLmxpbmVFbmQ9U2MucG9pbnQ9aXUsVGMuYWRkKEhhKE5jKSksTmMucmVzZXQoKX0scmVzdWx0OmZ1bmN0aW9uKCl7dmFyIHQ9VGMvMjtyZXR1cm4gVGMucmVzZXQoKSx0fX07ZnVuY3Rpb24gRWMoKXtTYy5wb2ludD1rY31mdW5jdGlvbiBrYyh0LG4pe1NjLnBvaW50PUNjLHhjPU1jPXQsd2M9QWM9bn1mdW5jdGlvbiBDYyh0LG4pe05jLmFkZChBYyp0LU1jKm4pLE1jPXQsQWM9bn1mdW5jdGlvbiBQYygpe0NjKHhjLHdjKX12YXIgemM9MS8wLFJjPXpjLExjPS16YyxEYz1MYyxVYz17cG9pbnQ6ZnVuY3Rpb24odCxuKXt0PHpjJiYoemM9dCk7dD5MYyYmKExjPXQpO248UmMmJihSYz1uKTtuPkRjJiYoRGM9bil9LGxpbmVTdGFydDppdSxsaW5lRW5kOml1LHBvbHlnb25TdGFydDppdSxwb2x5Z29uRW5kOml1LHJlc3VsdDpmdW5jdGlvbigpe3ZhciB0PVtbemMsUmNdLFtMYyxEY11dO3JldHVybiBMYz1EYz0tKFJjPXpjPTEvMCksdH19O3ZhciBxYyxPYyxZYyxCYyxGYz0wLEljPTAsSGM9MCxqYz0wLFhjPTAsR2M9MCxWYz0wLCRjPTAsV2M9MCxaYz17cG9pbnQ6UWMsbGluZVN0YXJ0OkpjLGxpbmVFbmQ6bnMscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7WmMubGluZVN0YXJ0PWVzLFpjLmxpbmVFbmQ9cnN9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXtaYy5wb2ludD1RYyxaYy5saW5lU3RhcnQ9SmMsWmMubGluZUVuZD1uc30scmVzdWx0OmZ1bmN0aW9uKCl7dmFyIHQ9V2M/W1ZjL1djLCRjL1djXTpHYz9bamMvR2MsWGMvR2NdOkhjP1tGYy9IYyxJYy9IY106W05hTixOYU5dO3JldHVybiBGYz1JYz1IYz1qYz1YYz1HYz1WYz0kYz1XYz0wLHR9fTtmdW5jdGlvbiBRYyh0LG4pe0ZjKz10LEljKz1uLCsrSGN9ZnVuY3Rpb24gSmMoKXtaYy5wb2ludD1LY31mdW5jdGlvbiBLYyh0LG4pe1pjLnBvaW50PXRzLFFjKFljPXQsQmM9bil9ZnVuY3Rpb24gdHModCxuKXt2YXIgZT10LVljLHI9bi1CYyxpPUthKGUqZStyKnIpO2pjKz1pKihZYyt0KS8yLFhjKz1pKihCYytuKS8yLEdjKz1pLFFjKFljPXQsQmM9bil9ZnVuY3Rpb24gbnMoKXtaYy5wb2ludD1RY31mdW5jdGlvbiBlcygpe1pjLnBvaW50PWlzfWZ1bmN0aW9uIHJzKCl7b3MocWMsT2MpfWZ1bmN0aW9uIGlzKHQsbil7WmMucG9pbnQ9b3MsUWMocWM9WWM9dCxPYz1CYz1uKX1mdW5jdGlvbiBvcyh0LG4pe3ZhciBlPXQtWWMscj1uLUJjLGk9S2EoZSplK3Iqcik7amMrPWkqKFljK3QpLzIsWGMrPWkqKEJjK24pLzIsR2MrPWksVmMrPShpPUJjKnQtWWMqbikqKFljK3QpLCRjKz1pKihCYytuKSxXYys9MyppLFFjKFljPXQsQmM9bil9ZnVuY3Rpb24gYXModCl7dGhpcy5fY29udGV4dD10fWFzLnByb3RvdHlwZT17X3JhZGl1czo0LjUscG9pbnRSYWRpdXM6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3JhZGl1cz10LHRoaXN9LHBvbHlnb25TdGFydDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9MH0scG9seWdvbkVuZDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7MD09PXRoaXMuX2xpbmUmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCksdGhpcy5fcG9pbnQ9TmFOfSxwb2ludDpmdW5jdGlvbih0LG4pe3N3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX2NvbnRleHQubW92ZVRvKHQsbiksdGhpcy5fcG9pbnQ9MTticmVhaztjYXNlIDE6dGhpcy5fY29udGV4dC5saW5lVG8odCxuKTticmVhaztkZWZhdWx0OnRoaXMuX2NvbnRleHQubW92ZVRvKHQrdGhpcy5fcmFkaXVzLG4pLHRoaXMuX2NvbnRleHQuYXJjKHQsbix0aGlzLl9yYWRpdXMsMCxCYSl9fSxyZXN1bHQ6aXV9O3ZhciB1cyxmcyxjcyxzcyxscyxocz1QYSgpLGRzPXtwb2ludDppdSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXtkcy5wb2ludD1wc30sbGluZUVuZDpmdW5jdGlvbigpe3VzJiZ2cyhmcyxjcyksZHMucG9pbnQ9aXV9LHBvbHlnb25TdGFydDpmdW5jdGlvbigpe3VzPSEwfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7dXM9bnVsbH0scmVzdWx0OmZ1bmN0aW9uKCl7dmFyIHQ9K2hzO3JldHVybiBocy5yZXNldCgpLHR9fTtmdW5jdGlvbiBwcyh0LG4pe2RzLnBvaW50PXZzLGZzPXNzPXQsY3M9bHM9bn1mdW5jdGlvbiB2cyh0LG4pe3NzLT10LGxzLT1uLGhzLmFkZChLYShzcypzcytscypscykpLHNzPXQsbHM9bn1mdW5jdGlvbiBncygpe3RoaXMuX3N0cmluZz1bXX1mdW5jdGlvbiB5cyh0KXtyZXR1cm4ibTAsIit0KyJhIit0KyIsIit0KyIgMCAxLDEgMCwiKy0yKnQrImEiK3QrIiwiK3QrIiAwIDEsMSAwLCIrMip0KyJ6In1mdW5jdGlvbiBfcyh0KXtyZXR1cm4gZnVuY3Rpb24obil7dmFyIGU9bmV3IGJzO2Zvcih2YXIgciBpbiB0KWVbcl09dFtyXTtyZXR1cm4gZS5zdHJlYW09bixlfX1mdW5jdGlvbiBicygpe31mdW5jdGlvbiBtcyh0LG4sZSl7dmFyIHI9dC5jbGlwRXh0ZW50JiZ0LmNsaXBFeHRlbnQoKTtyZXR1cm4gdC5zY2FsZSgxNTApLnRyYW5zbGF0ZShbMCwwXSksbnVsbCE9ciYmdC5jbGlwRXh0ZW50KG51bGwpLHN1KGUsdC5zdHJlYW0oVWMpKSxuKFVjLnJlc3VsdCgpKSxudWxsIT1yJiZ0LmNsaXBFeHRlbnQociksdH1mdW5jdGlvbiB4cyh0LG4sZSl7cmV0dXJuIG1zKHQsZnVuY3Rpb24oZSl7dmFyIHI9blsxXVswXS1uWzBdWzBdLGk9blsxXVsxXS1uWzBdWzFdLG89TWF0aC5taW4oci8oZVsxXVswXS1lWzBdWzBdKSxpLyhlWzFdWzFdLWVbMF1bMV0pKSxhPStuWzBdWzBdKyhyLW8qKGVbMV1bMF0rZVswXVswXSkpLzIsdT0rblswXVsxXSsoaS1vKihlWzFdWzFdK2VbMF1bMV0pKS8yO3Quc2NhbGUoMTUwKm8pLnRyYW5zbGF0ZShbYSx1XSl9LGUpfWZ1bmN0aW9uIHdzKHQsbixlKXtyZXR1cm4geHModCxbWzAsMF0sbl0sZSl9ZnVuY3Rpb24gTXModCxuLGUpe3JldHVybiBtcyh0LGZ1bmN0aW9uKGUpe3ZhciByPStuLGk9ci8oZVsxXVswXS1lWzBdWzBdKSxvPShyLWkqKGVbMV1bMF0rZVswXVswXSkpLzIsYT0taSplWzBdWzFdO3Quc2NhbGUoMTUwKmkpLnRyYW5zbGF0ZShbbyxhXSl9LGUpfWZ1bmN0aW9uIEFzKHQsbixlKXtyZXR1cm4gbXModCxmdW5jdGlvbihlKXt2YXIgcj0rbixpPXIvKGVbMV1bMV0tZVswXVsxXSksbz0taSplWzBdWzBdLGE9KHItaSooZVsxXVsxXStlWzBdWzFdKSkvMjt0LnNjYWxlKDE1MCppKS50cmFuc2xhdGUoW28sYV0pfSxlKX1ncy5wcm90b3R5cGU9e19yYWRpdXM6NC41LF9jaXJjbGU6eXMoNC41KSxwb2ludFJhZGl1czpmdW5jdGlvbih0KXtyZXR1cm4odD0rdCkhPT10aGlzLl9yYWRpdXMmJih0aGlzLl9yYWRpdXM9dCx0aGlzLl9jaXJjbGU9bnVsbCksdGhpc30scG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fbGluZT0wfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7dGhpcy5fbGluZT1OYU59LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24oKXswPT09dGhpcy5fbGluZSYmdGhpcy5fc3RyaW5nLnB1c2goIloiKSx0aGlzLl9wb2ludD1OYU59LHBvaW50OmZ1bmN0aW9uKHQsbil7c3dpdGNoKHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fc3RyaW5nLnB1c2goIk0iLHQsIiwiLG4pLHRoaXMuX3BvaW50PTE7YnJlYWs7Y2FzZSAxOnRoaXMuX3N0cmluZy5wdXNoKCJMIix0LCIsIixuKTticmVhaztkZWZhdWx0Om51bGw9PXRoaXMuX2NpcmNsZSYmKHRoaXMuX2NpcmNsZT15cyh0aGlzLl9yYWRpdXMpKSx0aGlzLl9zdHJpbmcucHVzaCgiTSIsdCwiLCIsbix0aGlzLl9jaXJjbGUpfX0scmVzdWx0OmZ1bmN0aW9uKCl7aWYodGhpcy5fc3RyaW5nLmxlbmd0aCl7dmFyIHQ9dGhpcy5fc3RyaW5nLmpvaW4oIiIpO3JldHVybiB0aGlzLl9zdHJpbmc9W10sdH1yZXR1cm4gbnVsbH19LGJzLnByb3RvdHlwZT17Y29uc3RydWN0b3I6YnMscG9pbnQ6ZnVuY3Rpb24odCxuKXt0aGlzLnN0cmVhbS5wb2ludCh0LG4pfSxzcGhlcmU6ZnVuY3Rpb24oKXt0aGlzLnN0cmVhbS5zcGhlcmUoKX0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5zdHJlYW0ubGluZVN0YXJ0KCl9LGxpbmVFbmQ6ZnVuY3Rpb24oKXt0aGlzLnN0cmVhbS5saW5lRW5kKCl9LHBvbHlnb25TdGFydDpmdW5jdGlvbigpe3RoaXMuc3RyZWFtLnBvbHlnb25TdGFydCgpfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7dGhpcy5zdHJlYW0ucG9seWdvbkVuZCgpfX07dmFyIFRzPTE2LE5zPUdhKDMwKklhKTtmdW5jdGlvbiBTcyh0LG4pe3JldHVybituP2Z1bmN0aW9uKHQsbil7ZnVuY3Rpb24gZShyLGksbyxhLHUsZixjLHMsbCxoLGQscCx2LGcpe3ZhciB5PWMtcixfPXMtaSxiPXkqeStfKl87aWYoYj40Km4mJnYtLSl7dmFyIG09YStoLHg9dStkLHc9ZitwLE09S2EobSptK3gqeCt3KncpLEE9ZXUody89TSksVD1IYShIYSh3KS0xKTxEYXx8SGEoby1sKTxEYT8obytsKS8yOlhhKHgsbSksTj10KFQsQSksUz1OWzBdLEU9TlsxXSxrPVMtcixDPUUtaSxQPV8qay15KkM7KFAqUC9iPm58fEhhKCh5KmsrXypDKS9iLS41KT4uM3x8YSpoK3UqZCtmKnA8TnMpJiYoZShyLGksbyxhLHUsZixTLEUsVCxtLz1NLHgvPU0sdyx2LGcpLGcucG9pbnQoUyxFKSxlKFMsRSxULG0seCx3LGMscyxsLGgsZCxwLHYsZykpfX1yZXR1cm4gZnVuY3Rpb24obil7dmFyIHIsaSxvLGEsdSxmLGMscyxsLGgsZCxwLHY9e3BvaW50OmcsbGluZVN0YXJ0OnksbGluZUVuZDpiLHBvbHlnb25TdGFydDpmdW5jdGlvbigpe24ucG9seWdvblN0YXJ0KCksdi5saW5lU3RhcnQ9bX0scG9seWdvbkVuZDpmdW5jdGlvbigpe24ucG9seWdvbkVuZCgpLHYubGluZVN0YXJ0PXl9fTtmdW5jdGlvbiBnKGUscil7ZT10KGUsciksbi5wb2ludChlWzBdLGVbMV0pfWZ1bmN0aW9uIHkoKXtzPU5hTix2LnBvaW50PV8sbi5saW5lU3RhcnQoKX1mdW5jdGlvbiBfKHIsaSl7dmFyIG89QXUoW3IsaV0pLGE9dChyLGkpO2UocyxsLGMsaCxkLHAscz1hWzBdLGw9YVsxXSxjPXIsaD1vWzBdLGQ9b1sxXSxwPW9bMl0sVHMsbiksbi5wb2ludChzLGwpfWZ1bmN0aW9uIGIoKXt2LnBvaW50PWcsbi5saW5lRW5kKCl9ZnVuY3Rpb24gbSgpe3koKSx2LnBvaW50PXgsdi5saW5lRW5kPXd9ZnVuY3Rpb24geCh0LG4pe18ocj10LG4pLGk9cyxvPWwsYT1oLHU9ZCxmPXAsdi5wb2ludD1ffWZ1bmN0aW9uIHcoKXtlKHMsbCxjLGgsZCxwLGksbyxyLGEsdSxmLFRzLG4pLHYubGluZUVuZD1iLGIoKX1yZXR1cm4gdn19KHQsbik6ZnVuY3Rpb24odCl7cmV0dXJuIF9zKHtwb2ludDpmdW5jdGlvbihuLGUpe249dChuLGUpLHRoaXMuc3RyZWFtLnBvaW50KG5bMF0sblsxXSl9fSl9KHQpfXZhciBFcz1fcyh7cG9pbnQ6ZnVuY3Rpb24odCxuKXt0aGlzLnN0cmVhbS5wb2ludCh0KklhLG4qSWEpfX0pO2Z1bmN0aW9uIGtzKHQsbixlLHIpe3ZhciBpPUdhKHIpLG89UWEociksYT1pKnQsdT1vKnQsZj1pL3QsYz1vL3Qscz0obyplLWkqbikvdCxsPShvKm4raSplKS90O2Z1bmN0aW9uIGgodCxyKXtyZXR1cm5bYSp0LXUqcituLGUtdSp0LWEqcl19cmV0dXJuIGguaW52ZXJ0PWZ1bmN0aW9uKHQsbil7cmV0dXJuW2YqdC1jKm4rcyxsLWMqdC1mKm5dfSxofWZ1bmN0aW9uIENzKHQpe3JldHVybiBQcyhmdW5jdGlvbigpe3JldHVybiB0fSkoKX1mdW5jdGlvbiBQcyh0KXt2YXIgbixlLHIsaSxvLGEsdSxmLGMscyxsPTE1MCxoPTQ4MCxkPTI1MCxwPTAsdj0wLGc9MCx5PTAsXz0wLGI9MCxtPW51bGwseD1HZix3PW51bGwsTT1tYyxBPS41O2Z1bmN0aW9uIFQodCl7cmV0dXJuIGYodFswXSpJYSx0WzFdKklhKX1mdW5jdGlvbiBOKHQpe3JldHVybih0PWYuaW52ZXJ0KHRbMF0sdFsxXSkpJiZbdFswXSpGYSx0WzFdKkZhXX1mdW5jdGlvbiBTKCl7dmFyIHQ9a3MobCwwLDAsYikuYXBwbHkobnVsbCxuKHAsdikpLHI9KGI/a3M6ZnVuY3Rpb24odCxuLGUpe2Z1bmN0aW9uIHIocixpKXtyZXR1cm5bbit0KnIsZS10KmldfXJldHVybiByLmludmVydD1mdW5jdGlvbihyLGkpe3JldHVyblsoci1uKS90LChlLWkpL3RdfSxyfSkobCxoLXRbMF0sZC10WzFdLGIpO3JldHVybiBlPWtmKGcseSxfKSx1PVNmKG4sciksZj1TZihlLHUpLGE9U3ModSxBKSxFKCl9ZnVuY3Rpb24gRSgpe3JldHVybiBjPXM9bnVsbCxUfXJldHVybiBULnN0cmVhbT1mdW5jdGlvbih0KXtyZXR1cm4gYyYmcz09PXQ/YzpjPUVzKGZ1bmN0aW9uKHQpe3JldHVybiBfcyh7cG9pbnQ6ZnVuY3Rpb24obixlKXt2YXIgcj10KG4sZSk7cmV0dXJuIHRoaXMuc3RyZWFtLnBvaW50KHJbMF0sclsxXSl9fSl9KGUpKHgoYShNKHM9dCkpKSkpfSxULnByZWNsaXA9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHg9dCxtPXZvaWQgMCxFKCkpOnh9LFQucG9zdGNsaXA9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KE09dCx3PXI9aT1vPW51bGwsRSgpKTpNfSxULmNsaXBBbmdsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oeD0rdD9WZihtPXQqSWEpOihtPW51bGwsR2YpLEUoKSk6bSpGYX0sVC5jbGlwRXh0ZW50PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhNPW51bGw9PXQ/KHc9cj1pPW89bnVsbCxtYyk6WmYodz0rdFswXVswXSxyPSt0WzBdWzFdLGk9K3RbMV1bMF0sbz0rdFsxXVsxXSksRSgpKTpudWxsPT13P251bGw6W1t3LHJdLFtpLG9dXX0sVC5zY2FsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obD0rdCxTKCkpOmx9LFQudHJhbnNsYXRlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhoPSt0WzBdLGQ9K3RbMV0sUygpKTpbaCxkXX0sVC5jZW50ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHA9dFswXSUzNjAqSWEsdj10WzFdJTM2MCpJYSxTKCkpOltwKkZhLHYqRmFdfSxULnJvdGF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZz10WzBdJTM2MCpJYSx5PXRbMV0lMzYwKklhLF89dC5sZW5ndGg+Mj90WzJdJTM2MCpJYTowLFMoKSk6W2cqRmEseSpGYSxfKkZhXX0sVC5hbmdsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYj10JTM2MCpJYSxTKCkpOmIqRmF9LFQucHJlY2lzaW9uPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPVNzKHUsQT10KnQpLEUoKSk6S2EoQSl9LFQuZml0RXh0ZW50PWZ1bmN0aW9uKHQsbil7cmV0dXJuIHhzKFQsdCxuKX0sVC5maXRTaXplPWZ1bmN0aW9uKHQsbil7cmV0dXJuIHdzKFQsdCxuKX0sVC5maXRXaWR0aD1mdW5jdGlvbih0LG4pe3JldHVybiBNcyhULHQsbil9LFQuZml0SGVpZ2h0PWZ1bmN0aW9uKHQsbil7cmV0dXJuIEFzKFQsdCxuKX0sZnVuY3Rpb24oKXtyZXR1cm4gbj10LmFwcGx5KHRoaXMsYXJndW1lbnRzKSxULmludmVydD1uLmludmVydCYmTixTKCl9fWZ1bmN0aW9uIHpzKHQpe3ZhciBuPTAsZT1xYS8zLHI9UHModCksaT1yKG4sZSk7cmV0dXJuIGkucGFyYWxsZWxzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3Iobj10WzBdKklhLGU9dFsxXSpJYSk6W24qRmEsZSpGYV19LGl9ZnVuY3Rpb24gUnModCxuKXt2YXIgZT1RYSh0KSxyPShlK1FhKG4pKS8yO2lmKEhhKHIpPERhKXJldHVybiBmdW5jdGlvbih0KXt2YXIgbj1HYSh0KTtmdW5jdGlvbiBlKHQsZSl7cmV0dXJuW3QqbixRYShlKS9uXX1yZXR1cm4gZS5pbnZlcnQ9ZnVuY3Rpb24odCxlKXtyZXR1cm5bdC9uLGV1KGUqbildfSxlfSh0KTt2YXIgaT0xK2UqKDIqci1lKSxvPUthKGkpL3I7ZnVuY3Rpb24gYSh0LG4pe3ZhciBlPUthKGktMipyKlFhKG4pKS9yO3JldHVybltlKlFhKHQqPXIpLG8tZSpHYSh0KV19cmV0dXJuIGEuaW52ZXJ0PWZ1bmN0aW9uKHQsbil7dmFyIGU9by1uO3JldHVybltYYSh0LEhhKGUpKS9yKkphKGUpLGV1KChpLSh0KnQrZSplKSpyKnIpLygyKnIpKV19LGF9ZnVuY3Rpb24gTHMoKXtyZXR1cm4genMoUnMpLnNjYWxlKDE1NS40MjQpLmNlbnRlcihbMCwzMy42NDQyXSl9ZnVuY3Rpb24gRHMoKXtyZXR1cm4gTHMoKS5wYXJhbGxlbHMoWzI5LjUsNDUuNV0pLnNjYWxlKDEwNzApLnRyYW5zbGF0ZShbNDgwLDI1MF0pLnJvdGF0ZShbOTYsMF0pLmNlbnRlcihbLS42LDM4LjddKX1mdW5jdGlvbiBVcyh0KXtyZXR1cm4gZnVuY3Rpb24obixlKXt2YXIgcj1HYShuKSxpPUdhKGUpLG89dChyKmkpO3JldHVybltvKmkqUWEobiksbypRYShlKV19fWZ1bmN0aW9uIHFzKHQpe3JldHVybiBmdW5jdGlvbihuLGUpe3ZhciByPUthKG4qbitlKmUpLGk9dChyKSxvPVFhKGkpLGE9R2EoaSk7cmV0dXJuW1hhKG4qbyxyKmEpLGV1KHImJmUqby9yKV19fXZhciBPcz1VcyhmdW5jdGlvbih0KXtyZXR1cm4gS2EoMi8oMSt0KSl9KTtPcy5pbnZlcnQ9cXMoZnVuY3Rpb24odCl7cmV0dXJuIDIqZXUodC8yKX0pO3ZhciBZcz1VcyhmdW5jdGlvbih0KXtyZXR1cm4odD1udSh0KSkmJnQvUWEodCl9KTtmdW5jdGlvbiBCcyh0LG4pe3JldHVyblt0LFdhKHR1KChPYStuKS8yKSldfWZ1bmN0aW9uIEZzKHQpe3ZhciBuLGUscixpPUNzKHQpLG89aS5jZW50ZXIsYT1pLnNjYWxlLHU9aS50cmFuc2xhdGUsZj1pLmNsaXBFeHRlbnQsYz1udWxsO2Z1bmN0aW9uIHMoKXt2YXIgbz1xYSphKCksdT1pKFJmKGkucm90YXRlKCkpLmludmVydChbMCwwXSkpO3JldHVybiBmKG51bGw9PWM/W1t1WzBdLW8sdVsxXS1vXSxbdVswXStvLHVbMV0rb11dOnQ9PT1Ccz9bW01hdGgubWF4KHVbMF0tbyxjKSxuXSxbTWF0aC5taW4odVswXStvLGUpLHJdXTpbW2MsTWF0aC5tYXgodVsxXS1vLG4pXSxbZSxNYXRoLm1pbih1WzFdK28scildXSl9cmV0dXJuIGkuc2NhbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGEodCkscygpKTphKCl9LGkudHJhbnNsYXRlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1KHQpLHMoKSk6dSgpfSxpLmNlbnRlcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obyh0KSxzKCkpOm8oKX0saS5jbGlwRXh0ZW50PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhudWxsPT10P2M9bj1lPXI9bnVsbDooYz0rdFswXVswXSxuPSt0WzBdWzFdLGU9K3RbMV1bMF0scj0rdFsxXVsxXSkscygpKTpudWxsPT1jP251bGw6W1tjLG5dLFtlLHJdXX0scygpfWZ1bmN0aW9uIElzKHQpe3JldHVybiB0dSgoT2ErdCkvMil9ZnVuY3Rpb24gSHModCxuKXt2YXIgZT1HYSh0KSxyPXQ9PT1uP1FhKHQpOldhKGUvR2EobikpL1dhKElzKG4pL0lzKHQpKSxpPWUqWmEoSXModCkscikvcjtpZighcilyZXR1cm4gQnM7ZnVuY3Rpb24gbyh0LG4pe2k+MD9uPC1PYStEYSYmKG49LU9hK0RhKTpuPk9hLURhJiYobj1PYS1EYSk7dmFyIGU9aS9aYShJcyhuKSxyKTtyZXR1cm5bZSpRYShyKnQpLGktZSpHYShyKnQpXX1yZXR1cm4gby5pbnZlcnQ9ZnVuY3Rpb24odCxuKXt2YXIgZT1pLW4sbz1KYShyKSpLYSh0KnQrZSplKTtyZXR1cm5bWGEodCxIYShlKSkvcipKYShlKSwyKmphKFphKGkvbywxL3IpKS1PYV19LG99ZnVuY3Rpb24ganModCxuKXtyZXR1cm5bdCxuXX1mdW5jdGlvbiBYcyh0LG4pe3ZhciBlPUdhKHQpLHI9dD09PW4/UWEodCk6KGUtR2EobikpLyhuLXQpLGk9ZS9yK3Q7aWYoSGEocik8RGEpcmV0dXJuIGpzO2Z1bmN0aW9uIG8odCxuKXt2YXIgZT1pLW4sbz1yKnQ7cmV0dXJuW2UqUWEobyksaS1lKkdhKG8pXX1yZXR1cm4gby5pbnZlcnQ9ZnVuY3Rpb24odCxuKXt2YXIgZT1pLW47cmV0dXJuW1hhKHQsSGEoZSkpL3IqSmEoZSksaS1KYShyKSpLYSh0KnQrZSplKV19LG99WXMuaW52ZXJ0PXFzKGZ1bmN0aW9uKHQpe3JldHVybiB0fSksQnMuaW52ZXJ0PWZ1bmN0aW9uKHQsbil7cmV0dXJuW3QsMipqYSgkYShuKSktT2FdfSxqcy5pbnZlcnQ9anM7dmFyIEdzPTEuMzQwMjY0LFZzPS0uMDgxMTA2LCRzPTg5M2UtNixXcz0uMDAzNzk2LFpzPUthKDMpLzI7ZnVuY3Rpb24gUXModCxuKXt2YXIgZT1ldShacypRYShuKSkscj1lKmUsaT1yKnIqcjtyZXR1cm5bdCpHYShlKS8oWnMqKEdzKzMqVnMqcitpKig3KiRzKzkqV3MqcikpKSxlKihHcytWcypyK2kqKCRzK1dzKnIpKV19ZnVuY3Rpb24gSnModCxuKXt2YXIgZT1HYShuKSxyPUdhKHQpKmU7cmV0dXJuW2UqUWEodCkvcixRYShuKS9yXX1mdW5jdGlvbiBLcyh0LG4sZSxyKXtyZXR1cm4gMT09PXQmJjE9PT1uJiYwPT09ZSYmMD09PXI/bWM6X3Moe3BvaW50OmZ1bmN0aW9uKGksbyl7dGhpcy5zdHJlYW0ucG9pbnQoaSp0K2UsbypuK3IpfX0pfWZ1bmN0aW9uIHRsKHQsbil7dmFyIGU9bipuLHI9ZSplO3JldHVyblt0KiguODcwNy0uMTMxOTc5KmUrcioociooLjAwMzk3MSplLS4wMDE1MjkqciktLjAxMzc5MSkpLG4qKDEuMDA3MjI2K2UqKC4wMTUwODUrciooLjAyODg3NCplLS4wNDQ0NzUtLjAwNTkxNipyKSkpXX1mdW5jdGlvbiBubCh0LG4pe3JldHVybltHYShuKSpRYSh0KSxRYShuKV19ZnVuY3Rpb24gZWwodCxuKXt2YXIgZT1HYShuKSxyPTErR2EodCkqZTtyZXR1cm5bZSpRYSh0KS9yLFFhKG4pL3JdfWZ1bmN0aW9uIHJsKHQsbil7cmV0dXJuW1dhKHR1KChPYStuKS8yKSksLXRdfWZ1bmN0aW9uIGlsKHQsbil7cmV0dXJuIHQucGFyZW50PT09bi5wYXJlbnQ/MToyfWZ1bmN0aW9uIG9sKHQsbil7cmV0dXJuIHQrbi54fWZ1bmN0aW9uIGFsKHQsbil7cmV0dXJuIE1hdGgubWF4KHQsbi55KX1mdW5jdGlvbiB1bCh0KXt2YXIgbj0wLGU9dC5jaGlsZHJlbixyPWUmJmUubGVuZ3RoO2lmKHIpZm9yKDstLXI+PTA7KW4rPWVbcl0udmFsdWU7ZWxzZSBuPTE7dC52YWx1ZT1ufWZ1bmN0aW9uIGZsKHQsbil7dmFyIGUscixpLG8sYSx1PW5ldyBobCh0KSxmPSt0LnZhbHVlJiYodS52YWx1ZT10LnZhbHVlKSxjPVt1XTtmb3IobnVsbD09biYmKG49Y2wpO2U9Yy5wb3AoKTspaWYoZiYmKGUudmFsdWU9K2UuZGF0YS52YWx1ZSksKGk9bihlLmRhdGEpKSYmKGE9aS5sZW5ndGgpKWZvcihlLmNoaWxkcmVuPW5ldyBBcnJheShhKSxvPWEtMTtvPj0wOy0tbyljLnB1c2gocj1lLmNoaWxkcmVuW29dPW5ldyBobChpW29dKSksci5wYXJlbnQ9ZSxyLmRlcHRoPWUuZGVwdGgrMTtyZXR1cm4gdS5lYWNoQmVmb3JlKGxsKX1mdW5jdGlvbiBjbCh0KXtyZXR1cm4gdC5jaGlsZHJlbn1mdW5jdGlvbiBzbCh0KXt0LmRhdGE9dC5kYXRhLmRhdGF9ZnVuY3Rpb24gbGwodCl7dmFyIG49MDtkb3t0LmhlaWdodD1ufXdoaWxlKCh0PXQucGFyZW50KSYmdC5oZWlnaHQ8KytuKX1mdW5jdGlvbiBobCh0KXt0aGlzLmRhdGE9dCx0aGlzLmRlcHRoPXRoaXMuaGVpZ2h0PTAsdGhpcy5wYXJlbnQ9bnVsbH1Rcy5pbnZlcnQ9ZnVuY3Rpb24odCxuKXtmb3IodmFyIGUscj1uLGk9cipyLG89aSppKmksYT0wO2E8MTImJihvPShpPShyLT1lPShyKihHcytWcyppK28qKCRzK1dzKmkpKS1uKS8oR3MrMypWcyppK28qKDcqJHMrOSpXcyppKSkpKnIpKmkqaSwhKEhhKGUpPFVhKSk7KythKTtyZXR1cm5bWnMqdCooR3MrMypWcyppK28qKDcqJHMrOSpXcyppKSkvR2EociksZXUoUWEocikvWnMpXX0sSnMuaW52ZXJ0PXFzKGphKSx0bC5pbnZlcnQ9ZnVuY3Rpb24odCxuKXt2YXIgZSxyPW4saT0yNTtkb3t2YXIgbz1yKnIsYT1vKm87ci09ZT0ociooMS4wMDcyMjYrbyooLjAxNTA4NSthKiguMDI4ODc0Km8tLjA0NDQ3NS0uMDA1OTE2KmEpKSktbikvKDEuMDA3MjI2K28qKC4wNDUyNTUrYSooLjI1OTg2NipvLS4zMTEzMjUtLjAwNTkxNioxMSphKSkpfXdoaWxlKEhhKGUpPkRhJiYtLWk+MCk7cmV0dXJuW3QvKC44NzA3KyhvPXIqcikqKG8qKG8qbypvKiguMDAzOTcxLS4wMDE1MjkqbyktLjAxMzc5MSktLjEzMTk3OSkpLHJdfSxubC5pbnZlcnQ9cXMoZXUpLGVsLmludmVydD1xcyhmdW5jdGlvbih0KXtyZXR1cm4gMipqYSh0KX0pLHJsLmludmVydD1mdW5jdGlvbih0LG4pe3JldHVyblstbiwyKmphKCRhKHQpKS1PYV19LGhsLnByb3RvdHlwZT1mbC5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOmhsLGNvdW50OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWFjaEFmdGVyKHVsKX0sZWFjaDpmdW5jdGlvbih0KXt2YXIgbixlLHIsaSxvPXRoaXMsYT1bb107ZG97Zm9yKG49YS5yZXZlcnNlKCksYT1bXTtvPW4ucG9wKCk7KWlmKHQobyksZT1vLmNoaWxkcmVuKWZvcihyPTAsaT1lLmxlbmd0aDtyPGk7KytyKWEucHVzaChlW3JdKX13aGlsZShhLmxlbmd0aCk7cmV0dXJuIHRoaXN9LGVhY2hBZnRlcjpmdW5jdGlvbih0KXtmb3IodmFyIG4sZSxyLGk9dGhpcyxvPVtpXSxhPVtdO2k9by5wb3AoKTspaWYoYS5wdXNoKGkpLG49aS5jaGlsZHJlbilmb3IoZT0wLHI9bi5sZW5ndGg7ZTxyOysrZSlvLnB1c2gobltlXSk7Zm9yKDtpPWEucG9wKCk7KXQoaSk7cmV0dXJuIHRoaXN9LGVhY2hCZWZvcmU6ZnVuY3Rpb24odCl7Zm9yKHZhciBuLGUscj10aGlzLGk9W3JdO3I9aS5wb3AoKTspaWYodChyKSxuPXIuY2hpbGRyZW4pZm9yKGU9bi5sZW5ndGgtMTtlPj0wOy0tZSlpLnB1c2gobltlXSk7cmV0dXJuIHRoaXN9LHN1bTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5lYWNoQWZ0ZXIoZnVuY3Rpb24obil7Zm9yKHZhciBlPSt0KG4uZGF0YSl8fDAscj1uLmNoaWxkcmVuLGk9ciYmci5sZW5ndGg7LS1pPj0wOyllKz1yW2ldLnZhbHVlO24udmFsdWU9ZX0pfSxzb3J0OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmVhY2hCZWZvcmUoZnVuY3Rpb24obil7bi5jaGlsZHJlbiYmbi5jaGlsZHJlbi5zb3J0KHQpfSl9LHBhdGg6ZnVuY3Rpb24odCl7Zm9yKHZhciBuPXRoaXMsZT1mdW5jdGlvbih0LG4pe2lmKHQ9PT1uKXJldHVybiB0O3ZhciBlPXQuYW5jZXN0b3JzKCkscj1uLmFuY2VzdG9ycygpLGk9bnVsbDtmb3IodD1lLnBvcCgpLG49ci5wb3AoKTt0PT09bjspaT10LHQ9ZS5wb3AoKSxuPXIucG9wKCk7cmV0dXJuIGl9KG4sdCkscj1bbl07biE9PWU7KW49bi5wYXJlbnQsci5wdXNoKG4pO2Zvcih2YXIgaT1yLmxlbmd0aDt0IT09ZTspci5zcGxpY2UoaSwwLHQpLHQ9dC5wYXJlbnQ7cmV0dXJuIHJ9LGFuY2VzdG9yczpmdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLG49W3RdO3Q9dC5wYXJlbnQ7KW4ucHVzaCh0KTtyZXR1cm4gbn0sZGVzY2VuZGFudHM6ZnVuY3Rpb24oKXt2YXIgdD1bXTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKG4pe3QucHVzaChuKX0pLHR9LGxlYXZlczpmdW5jdGlvbigpe3ZhciB0PVtdO3JldHVybiB0aGlzLmVhY2hCZWZvcmUoZnVuY3Rpb24obil7bi5jaGlsZHJlbnx8dC5wdXNoKG4pfSksdH0sbGlua3M6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLG49W107cmV0dXJuIHQuZWFjaChmdW5jdGlvbihlKXtlIT09dCYmbi5wdXNoKHtzb3VyY2U6ZS5wYXJlbnQsdGFyZ2V0OmV9KX0pLG59LGNvcHk6ZnVuY3Rpb24oKXtyZXR1cm4gZmwodGhpcykuZWFjaEJlZm9yZShzbCl9fTt2YXIgZGw9QXJyYXkucHJvdG90eXBlLnNsaWNlO2Z1bmN0aW9uIHBsKHQpe2Zvcih2YXIgbixlLHI9MCxpPSh0PWZ1bmN0aW9uKHQpe2Zvcih2YXIgbixlLHI9dC5sZW5ndGg7cjspZT1NYXRoLnJhbmRvbSgpKnItLXwwLG49dFtyXSx0W3JdPXRbZV0sdFtlXT1uO3JldHVybiB0fShkbC5jYWxsKHQpKSkubGVuZ3RoLG89W107cjxpOyluPXRbcl0sZSYmeWwoZSxuKT8rK3I6KGU9Ymwobz12bChvLG4pKSxyPTApO3JldHVybiBlfWZ1bmN0aW9uIHZsKHQsbil7dmFyIGUscjtpZihfbChuLHQpKXJldHVybltuXTtmb3IoZT0wO2U8dC5sZW5ndGg7KytlKWlmKGdsKG4sdFtlXSkmJl9sKG1sKHRbZV0sbiksdCkpcmV0dXJuW3RbZV0sbl07Zm9yKGU9MDtlPHQubGVuZ3RoLTE7KytlKWZvcihyPWUrMTtyPHQubGVuZ3RoOysrcilpZihnbChtbCh0W2VdLHRbcl0pLG4pJiZnbChtbCh0W2VdLG4pLHRbcl0pJiZnbChtbCh0W3JdLG4pLHRbZV0pJiZfbCh4bCh0W2VdLHRbcl0sbiksdCkpcmV0dXJuW3RbZV0sdFtyXSxuXTt0aHJvdyBuZXcgRXJyb3J9ZnVuY3Rpb24gZ2wodCxuKXt2YXIgZT10LnItbi5yLHI9bi54LXQueCxpPW4ueS10Lnk7cmV0dXJuIGU8MHx8ZSplPHIqcitpKml9ZnVuY3Rpb24geWwodCxuKXt2YXIgZT10LnItbi5yKzFlLTYscj1uLngtdC54LGk9bi55LXQueTtyZXR1cm4gZT4wJiZlKmU+cipyK2kqaX1mdW5jdGlvbiBfbCh0LG4pe2Zvcih2YXIgZT0wO2U8bi5sZW5ndGg7KytlKWlmKCF5bCh0LG5bZV0pKXJldHVybiExO3JldHVybiEwfWZ1bmN0aW9uIGJsKHQpe3N3aXRjaCh0Lmxlbmd0aCl7Y2FzZSAxOnJldHVybnt4OihuPXRbMF0pLngseTpuLnkscjpuLnJ9O2Nhc2UgMjpyZXR1cm4gbWwodFswXSx0WzFdKTtjYXNlIDM6cmV0dXJuIHhsKHRbMF0sdFsxXSx0WzJdKX12YXIgbn1mdW5jdGlvbiBtbCh0LG4pe3ZhciBlPXQueCxyPXQueSxpPXQucixvPW4ueCxhPW4ueSx1PW4ucixmPW8tZSxjPWEtcixzPXUtaSxsPU1hdGguc3FydChmKmYrYypjKTtyZXR1cm57eDooZStvK2YvbCpzKS8yLHk6KHIrYStjL2wqcykvMixyOihsK2krdSkvMn19ZnVuY3Rpb24geGwodCxuLGUpe3ZhciByPXQueCxpPXQueSxvPXQucixhPW4ueCx1PW4ueSxmPW4ucixjPWUueCxzPWUueSxsPWUucixoPXItYSxkPXItYyxwPWktdSx2PWktcyxnPWYtbyx5PWwtbyxfPXIqcitpKmktbypvLGI9Xy1hKmEtdSp1K2YqZixtPV8tYypjLXMqcytsKmwseD1kKnAtaCp2LHc9KHAqbS12KmIpLygyKngpLXIsTT0odipnLXAqeSkveCxBPShkKmItaCptKS8oMip4KS1pLFQ9KGgqeS1kKmcpL3gsTj1NKk0rVCpULTEsUz0yKihvK3cqTStBKlQpLEU9dyp3K0EqQS1vKm8saz0tKE4/KFMrTWF0aC5zcXJ0KFMqUy00Kk4qRSkpLygyKk4pOkUvUyk7cmV0dXJue3g6cit3K00qayx5OmkrQStUKmsscjprfX1mdW5jdGlvbiB3bCh0LG4sZSl7dmFyIHIsaSxvLGEsdT10Lngtbi54LGY9dC55LW4ueSxjPXUqdStmKmY7Yz8oaT1uLnIrZS5yLGkqPWksYT10LnIrZS5yLGk+KGEqPWEpPyhyPShjK2EtaSkvKDIqYyksbz1NYXRoLnNxcnQoTWF0aC5tYXgoMCxhL2MtcipyKSksZS54PXQueC1yKnUtbypmLGUueT10LnktcipmK28qdSk6KHI9KGMraS1hKS8oMipjKSxvPU1hdGguc3FydChNYXRoLm1heCgwLGkvYy1yKnIpKSxlLng9bi54K3IqdS1vKmYsZS55PW4ueStyKmYrbyp1KSk6KGUueD1uLngrZS5yLGUueT1uLnkpfWZ1bmN0aW9uIE1sKHQsbil7dmFyIGU9dC5yK24uci0xZS02LHI9bi54LXQueCxpPW4ueS10Lnk7cmV0dXJuIGU+MCYmZSplPnIqcitpKml9ZnVuY3Rpb24gQWwodCl7dmFyIG49dC5fLGU9dC5uZXh0Ll8scj1uLnIrZS5yLGk9KG4ueCplLnIrZS54Km4ucikvcixvPShuLnkqZS5yK2UueSpuLnIpL3I7cmV0dXJuIGkqaStvKm99ZnVuY3Rpb24gVGwodCl7dGhpcy5fPXQsdGhpcy5uZXh0PW51bGwsdGhpcy5wcmV2aW91cz1udWxsfWZ1bmN0aW9uIE5sKHQpe2lmKCEoaT10Lmxlbmd0aCkpcmV0dXJuIDA7dmFyIG4sZSxyLGksbyxhLHUsZixjLHMsbDtpZigobj10WzBdKS54PTAsbi55PTAsIShpPjEpKXJldHVybiBuLnI7aWYoZT10WzFdLG4ueD0tZS5yLGUueD1uLnIsZS55PTAsIShpPjIpKXJldHVybiBuLnIrZS5yO3dsKGUsbixyPXRbMl0pLG49bmV3IFRsKG4pLGU9bmV3IFRsKGUpLHI9bmV3IFRsKHIpLG4ubmV4dD1yLnByZXZpb3VzPWUsZS5uZXh0PW4ucHJldmlvdXM9cixyLm5leHQ9ZS5wcmV2aW91cz1uO3Q6Zm9yKHU9Mzt1PGk7Kyt1KXt3bChuLl8sZS5fLHI9dFt1XSkscj1uZXcgVGwociksZj1lLm5leHQsYz1uLnByZXZpb3VzLHM9ZS5fLnIsbD1uLl8ucjtkb3tpZihzPD1sKXtpZihNbChmLl8sci5fKSl7ZT1mLG4ubmV4dD1lLGUucHJldmlvdXM9biwtLXU7Y29udGludWUgdH1zKz1mLl8ucixmPWYubmV4dH1lbHNle2lmKE1sKGMuXyxyLl8pKXsobj1jKS5uZXh0PWUsZS5wcmV2aW91cz1uLC0tdTtjb250aW51ZSB0fWwrPWMuXy5yLGM9Yy5wcmV2aW91c319d2hpbGUoZiE9PWMubmV4dCk7Zm9yKHIucHJldmlvdXM9bixyLm5leHQ9ZSxuLm5leHQ9ZS5wcmV2aW91cz1lPXIsbz1BbChuKTsocj1yLm5leHQpIT09ZTspKGE9QWwocikpPG8mJihuPXIsbz1hKTtlPW4ubmV4dH1mb3Iobj1bZS5fXSxyPWU7KHI9ci5uZXh0KSE9PWU7KW4ucHVzaChyLl8pO2ZvcihyPXBsKG4pLHU9MDt1PGk7Kyt1KShuPXRbdV0pLngtPXIueCxuLnktPXIueTtyZXR1cm4gci5yfWZ1bmN0aW9uIFNsKHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0KXRocm93IG5ldyBFcnJvcjtyZXR1cm4gdH1mdW5jdGlvbiBFbCgpe3JldHVybiAwfWZ1bmN0aW9uIGtsKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fX1mdW5jdGlvbiBDbCh0KXtyZXR1cm4gTWF0aC5zcXJ0KHQudmFsdWUpfWZ1bmN0aW9uIFBsKHQpe3JldHVybiBmdW5jdGlvbihuKXtuLmNoaWxkcmVufHwobi5yPU1hdGgubWF4KDAsK3Qobil8fDApKX19ZnVuY3Rpb24gemwodCxuKXtyZXR1cm4gZnVuY3Rpb24oZSl7aWYocj1lLmNoaWxkcmVuKXt2YXIgcixpLG8sYT1yLmxlbmd0aCx1PXQoZSkqbnx8MDtpZih1KWZvcihpPTA7aTxhOysraSlyW2ldLnIrPXU7aWYobz1ObChyKSx1KWZvcihpPTA7aTxhOysraSlyW2ldLnItPXU7ZS5yPW8rdX19fWZ1bmN0aW9uIFJsKHQpe3JldHVybiBmdW5jdGlvbihuKXt2YXIgZT1uLnBhcmVudDtuLnIqPXQsZSYmKG4ueD1lLngrdCpuLngsbi55PWUueSt0Km4ueSl9fWZ1bmN0aW9uIExsKHQpe3QueDA9TWF0aC5yb3VuZCh0LngwKSx0LnkwPU1hdGgucm91bmQodC55MCksdC54MT1NYXRoLnJvdW5kKHQueDEpLHQueTE9TWF0aC5yb3VuZCh0LnkxKX1mdW5jdGlvbiBEbCh0LG4sZSxyLGkpe2Zvcih2YXIgbyxhPXQuY2hpbGRyZW4sdT0tMSxmPWEubGVuZ3RoLGM9dC52YWx1ZSYmKHItbikvdC52YWx1ZTsrK3U8ZjspKG89YVt1XSkueTA9ZSxvLnkxPWksby54MD1uLG8ueDE9bis9by52YWx1ZSpjfXZhciBVbD0iJCIscWw9e2RlcHRoOi0xfSxPbD17fTtmdW5jdGlvbiBZbCh0KXtyZXR1cm4gdC5pZH1mdW5jdGlvbiBCbCh0KXtyZXR1cm4gdC5wYXJlbnRJZH1mdW5jdGlvbiBGbCh0LG4pe3JldHVybiB0LnBhcmVudD09PW4ucGFyZW50PzE6Mn1mdW5jdGlvbiBJbCh0KXt2YXIgbj10LmNoaWxkcmVuO3JldHVybiBuP25bMF06dC50fWZ1bmN0aW9uIEhsKHQpe3ZhciBuPXQuY2hpbGRyZW47cmV0dXJuIG4/bltuLmxlbmd0aC0xXTp0LnR9ZnVuY3Rpb24gamwodCxuLGUpe3ZhciByPWUvKG4uaS10LmkpO24uYy09cixuLnMrPWUsdC5jKz1yLG4ueis9ZSxuLm0rPWV9ZnVuY3Rpb24gWGwodCxuLGUpe3JldHVybiB0LmEucGFyZW50PT09bi5wYXJlbnQ/dC5hOmV9ZnVuY3Rpb24gR2wodCxuKXt0aGlzLl89dCx0aGlzLnBhcmVudD1udWxsLHRoaXMuY2hpbGRyZW49bnVsbCx0aGlzLkE9bnVsbCx0aGlzLmE9dGhpcyx0aGlzLno9MCx0aGlzLm09MCx0aGlzLmM9MCx0aGlzLnM9MCx0aGlzLnQ9bnVsbCx0aGlzLmk9bn1mdW5jdGlvbiBWbCh0LG4sZSxyLGkpe2Zvcih2YXIgbyxhPXQuY2hpbGRyZW4sdT0tMSxmPWEubGVuZ3RoLGM9dC52YWx1ZSYmKGktZSkvdC52YWx1ZTsrK3U8ZjspKG89YVt1XSkueDA9bixvLngxPXIsby55MD1lLG8ueTE9ZSs9by52YWx1ZSpjfUdsLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGhsLnByb3RvdHlwZSk7dmFyICRsPSgxK01hdGguc3FydCg1KSkvMjtmdW5jdGlvbiBXbCh0LG4sZSxyLGksbyl7Zm9yKHZhciBhLHUsZixjLHMsbCxoLGQscCx2LGcseT1bXSxfPW4uY2hpbGRyZW4sYj0wLG09MCx4PV8ubGVuZ3RoLHc9bi52YWx1ZTtiPHg7KXtmPWktZSxjPW8tcjtkb3tzPV9bbSsrXS52YWx1ZX13aGlsZSghcyYmbTx4KTtmb3IobD1oPXMsZz1zKnMqKHY9TWF0aC5tYXgoYy9mLGYvYykvKHcqdCkpLHA9TWF0aC5tYXgoaC9nLGcvbCk7bTx4OysrbSl7aWYocys9dT1fW21dLnZhbHVlLHU8bCYmKGw9dSksdT5oJiYoaD11KSxnPXMqcyp2LChkPU1hdGgubWF4KGgvZyxnL2wpKT5wKXtzLT11O2JyZWFrfXA9ZH15LnB1c2goYT17dmFsdWU6cyxkaWNlOmY8YyxjaGlsZHJlbjpfLnNsaWNlKGIsbSl9KSxhLmRpY2U/RGwoYSxlLHIsaSx3P3IrPWMqcy93Om8pOlZsKGEsZSxyLHc/ZSs9ZipzL3c6aSxvKSx3LT1zLGI9bX1yZXR1cm4geX12YXIgWmw9ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiBlKHQsZSxyLGksbyl7V2wobix0LGUscixpLG8pfXJldHVybiBlLnJhdGlvPWZ1bmN0aW9uKG4pe3JldHVybiB0KChuPStuKT4xP246MSl9LGV9KCRsKTt2YXIgUWw9ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiBlKHQsZSxyLGksbyl7aWYoKGE9dC5fc3F1YXJpZnkpJiZhLnJhdGlvPT09bilmb3IodmFyIGEsdSxmLGMscyxsPS0xLGg9YS5sZW5ndGgsZD10LnZhbHVlOysrbDxoOyl7Zm9yKGY9KHU9YVtsXSkuY2hpbGRyZW4sYz11LnZhbHVlPTAscz1mLmxlbmd0aDtjPHM7KytjKXUudmFsdWUrPWZbY10udmFsdWU7dS5kaWNlP0RsKHUsZSxyLGkscis9KG8tcikqdS52YWx1ZS9kKTpWbCh1LGUscixlKz0oaS1lKSp1LnZhbHVlL2QsbyksZC09dS52YWx1ZX1lbHNlIHQuX3NxdWFyaWZ5PWE9V2wobix0LGUscixpLG8pLGEucmF0aW89bn1yZXR1cm4gZS5yYXRpbz1mdW5jdGlvbihuKXtyZXR1cm4gdCgobj0rbik+MT9uOjEpfSxlfSgkbCk7ZnVuY3Rpb24gSmwodCxuKXtyZXR1cm4gdFswXS1uWzBdfHx0WzFdLW5bMV19ZnVuY3Rpb24gS2wodCl7Zm9yKHZhciBuLGUscixpPXQubGVuZ3RoLG89WzAsMV0sYT0yLHU9Mjt1PGk7Kyt1KXtmb3IoO2E+MSYmKG49dFtvW2EtMl1dLGU9dFtvW2EtMV1dLHI9dFt1XSwoZVswXS1uWzBdKSooclsxXS1uWzFdKS0oZVsxXS1uWzFdKSooclswXS1uWzBdKTw9MCk7KS0tYTtvW2ErK109dX1yZXR1cm4gby5zbGljZSgwLGEpfWZ1bmN0aW9uIHRoKCl7cmV0dXJuIE1hdGgucmFuZG9tKCl9dmFyIG5oPWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0LGUpe3JldHVybiB0PW51bGw9PXQ/MDordCxlPW51bGw9PWU/MTorZSwxPT09YXJndW1lbnRzLmxlbmd0aD8oZT10LHQ9MCk6ZS09dCxmdW5jdGlvbigpe3JldHVybiBuKCkqZSt0fX1yZXR1cm4gZS5zb3VyY2U9dCxlfSh0aCksZWg9ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiBlKHQsZSl7dmFyIHIsaTtyZXR1cm4gdD1udWxsPT10PzA6K3QsZT1udWxsPT1lPzE6K2UsZnVuY3Rpb24oKXt2YXIgbztpZihudWxsIT1yKW89cixyPW51bGw7ZWxzZSBkb3tyPTIqbigpLTEsbz0yKm4oKS0xLGk9cipyK28qb313aGlsZSghaXx8aT4xKTtyZXR1cm4gdCtlKm8qTWF0aC5zcXJ0KC0yKk1hdGgubG9nKGkpL2kpfX1yZXR1cm4gZS5zb3VyY2U9dCxlfSh0aCkscmg9ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiBlKCl7dmFyIHQ9ZWguc291cmNlKG4pLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5leHAodCgpKX19cmV0dXJuIGUuc291cmNlPXQsZX0odGgpLGloPWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4gZnVuY3Rpb24oKXtmb3IodmFyIGU9MCxyPTA7cjx0OysrcillKz1uKCk7cmV0dXJuIGV9fXJldHVybiBlLnNvdXJjZT10LGV9KHRoKSxvaD1mdW5jdGlvbiB0KG4pe2Z1bmN0aW9uIGUodCl7dmFyIGU9aWguc291cmNlKG4pKHQpO3JldHVybiBmdW5jdGlvbigpe3JldHVybiBlKCkvdH19cmV0dXJuIGUuc291cmNlPXQsZX0odGgpLGFoPWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4tTWF0aC5sb2coMS1uKCkpL3R9fXJldHVybiBlLnNvdXJjZT10LGV9KHRoKSx1aD1BcnJheS5wcm90b3R5cGUsZmg9dWgubWFwLGNoPXVoLnNsaWNlLHNoPXtuYW1lOiJpbXBsaWNpdCJ9O2Z1bmN0aW9uIGxoKHQpe3ZhciBuPUtpKCksZT1bXSxyPXNoO2Z1bmN0aW9uIGkoaSl7dmFyIG89aSsiIixhPW4uZ2V0KG8pO2lmKCFhKXtpZihyIT09c2gpcmV0dXJuIHI7bi5zZXQobyxhPWUucHVzaChpKSl9cmV0dXJuIHRbKGEtMSkldC5sZW5ndGhdfXJldHVybiB0PW51bGw9PXQ/W106Y2guY2FsbCh0KSxpLmRvbWFpbj1mdW5jdGlvbih0KXtpZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gZS5zbGljZSgpO2U9W10sbj1LaSgpO2Zvcih2YXIgcixvLGE9LTEsdT10Lmxlbmd0aDsrK2E8dTspbi5oYXMobz0ocj10W2FdKSsiIil8fG4uc2V0KG8sZS5wdXNoKHIpKTtyZXR1cm4gaX0saS5yYW5nZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1jaC5jYWxsKG4pLGkpOnQuc2xpY2UoKX0saS51bmtub3duPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPXQsaSk6cn0saS5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIGxoKCkuZG9tYWluKGUpLnJhbmdlKHQpLnVua25vd24ocil9LGl9ZnVuY3Rpb24gaGgoKXt2YXIgdCxuLGU9bGgoKS51bmtub3duKHZvaWQgMCkscj1lLmRvbWFpbixpPWUucmFuZ2Usbz1bMCwxXSxhPSExLHU9MCxmPTAsYz0uNTtmdW5jdGlvbiBzKCl7dmFyIGU9cigpLmxlbmd0aCxzPW9bMV08b1swXSxsPW9bcy0wXSxoPW9bMS1zXTt0PShoLWwpL01hdGgubWF4KDEsZS11KzIqZiksYSYmKHQ9TWF0aC5mbG9vcih0KSksbCs9KGgtbC10KihlLXUpKSpjLG49dCooMS11KSxhJiYobD1NYXRoLnJvdW5kKGwpLG49TWF0aC5yb3VuZChuKSk7dmFyIGQ9ZyhlKS5tYXAoZnVuY3Rpb24obil7cmV0dXJuIGwrdCpufSk7cmV0dXJuIGkocz9kLnJldmVyc2UoKTpkKX1yZXR1cm4gZGVsZXRlIGUudW5rbm93bixlLmRvbWFpbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocih0KSxzKCkpOnIoKX0sZS5yYW5nZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz1bK3RbMF0sK3RbMV1dLHMoKSk6by5zbGljZSgpfSxlLnJhbmdlUm91bmQ9ZnVuY3Rpb24odCl7cmV0dXJuIG89Wyt0WzBdLCt0WzFdXSxhPSEwLHMoKX0sZS5iYW5kd2lkdGg9ZnVuY3Rpb24oKXtyZXR1cm4gbn0sZS5zdGVwPWZ1bmN0aW9uKCl7cmV0dXJuIHR9LGUucm91bmQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9ISF0LHMoKSk6YX0sZS5wYWRkaW5nPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PWY9TWF0aC5tYXgoMCxNYXRoLm1pbigxLHQpKSxzKCkpOnV9LGUucGFkZGluZ0lubmVyPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PU1hdGgubWF4KDAsTWF0aC5taW4oMSx0KSkscygpKTp1fSxlLnBhZGRpbmdPdXRlcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZj1NYXRoLm1heCgwLE1hdGgubWluKDEsdCkpLHMoKSk6Zn0sZS5hbGlnbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYz1NYXRoLm1heCgwLE1hdGgubWluKDEsdCkpLHMoKSk6Y30sZS5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIGhoKCkuZG9tYWluKHIoKSkucmFuZ2Uobykucm91bmQoYSkucGFkZGluZ0lubmVyKHUpLnBhZGRpbmdPdXRlcihmKS5hbGlnbihjKX0scygpfWZ1bmN0aW9uIGRoKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fX1mdW5jdGlvbiBwaCh0KXtyZXR1cm4rdH12YXIgdmg9WzAsMV07ZnVuY3Rpb24gZ2godCxuKXtyZXR1cm4obi09dD0rdCk/ZnVuY3Rpb24oZSl7cmV0dXJuKGUtdCkvbn06ZGgobil9ZnVuY3Rpb24geWgodCxuLGUscil7dmFyIGk9dFswXSxvPXRbMV0sYT1uWzBdLHU9blsxXTtyZXR1cm4gbzxpPyhpPWUobyxpKSxhPXIodSxhKSk6KGk9ZShpLG8pLGE9cihhLHUpKSxmdW5jdGlvbih0KXtyZXR1cm4gYShpKHQpKX19ZnVuY3Rpb24gX2godCxuLGUscil7dmFyIG89TWF0aC5taW4odC5sZW5ndGgsbi5sZW5ndGgpLTEsYT1uZXcgQXJyYXkobyksdT1uZXcgQXJyYXkobyksZj0tMTtmb3IodFtvXTx0WzBdJiYodD10LnNsaWNlKCkucmV2ZXJzZSgpLG49bi5zbGljZSgpLnJldmVyc2UoKSk7KytmPG87KWFbZl09ZSh0W2ZdLHRbZisxXSksdVtmXT1yKG5bZl0sbltmKzFdKTtyZXR1cm4gZnVuY3Rpb24obil7dmFyIGU9aSh0LG4sMSxvKS0xO3JldHVybiB1W2VdKGFbZV0obikpfX1mdW5jdGlvbiBiaCh0LG4pe3JldHVybiBuLmRvbWFpbih0LmRvbWFpbigpKS5yYW5nZSh0LnJhbmdlKCkpLmludGVycG9sYXRlKHQuaW50ZXJwb2xhdGUoKSkuY2xhbXAodC5jbGFtcCgpKX1mdW5jdGlvbiBtaCh0LG4pe3ZhciBlLHIsaSxvPXZoLGE9dmgsdT1tZSxmPSExO2Z1bmN0aW9uIGMoKXtyZXR1cm4gZT1NYXRoLm1pbihvLmxlbmd0aCxhLmxlbmd0aCk+Mj9faDp5aCxyPWk9bnVsbCxzfWZ1bmN0aW9uIHMobil7cmV0dXJuKHJ8fChyPWUobyxhLGY/ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKG4sZSl7dmFyIHI9dChuPStuLGU9K2UpO3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gdDw9bj8wOnQ+PWU/MTpyKHQpfX19KHQpOnQsdSkpKSgrbil9cmV0dXJuIHMuaW52ZXJ0PWZ1bmN0aW9uKHQpe3JldHVybihpfHwoaT1lKGEsbyxnaCxmP2Z1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihuLGUpe3ZhciByPXQobj0rbixlPStlKTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIHQ8PTA/bjp0Pj0xP2U6cih0KX19fShuKTpuKSkpKCt0KX0scy5kb21haW49ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89ZmguY2FsbCh0LHBoKSxjKCkpOm8uc2xpY2UoKX0scy5yYW5nZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT1jaC5jYWxsKHQpLGMoKSk6YS5zbGljZSgpfSxzLnJhbmdlUm91bmQ9ZnVuY3Rpb24odCl7cmV0dXJuIGE9Y2guY2FsbCh0KSx1PXhlLGMoKX0scy5jbGFtcD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZj0hIXQsYygpKTpmfSxzLmludGVycG9sYXRlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PXQsYygpKTp1fSxjKCl9ZnVuY3Rpb24geGgobil7dmFyIGU9bi5kb21haW47cmV0dXJuIG4udGlja3M9ZnVuY3Rpb24odCl7dmFyIG49ZSgpO3JldHVybiBtKG5bMF0sbltuLmxlbmd0aC0xXSxudWxsPT10PzEwOnQpfSxuLnRpY2tGb3JtYXQ9ZnVuY3Rpb24obixyKXtyZXR1cm4gZnVuY3Rpb24obixlLHIpe3ZhciBpLG89blswXSxhPW5bbi5sZW5ndGgtMV0sdT13KG8sYSxudWxsPT1lPzEwOmUpO3N3aXRjaCgocj1iYShudWxsPT1yPyIsZiI6cikpLnR5cGUpe2Nhc2UicyI6dmFyIGY9TWF0aC5tYXgoTWF0aC5hYnMobyksTWF0aC5hYnMoYSkpO3JldHVybiBudWxsIT1yLnByZWNpc2lvbnx8aXNOYU4oaT1rYSh1LGYpKXx8KHIucHJlY2lzaW9uPWkpLHQuZm9ybWF0UHJlZml4KHIsZik7Y2FzZSIiOmNhc2UiZSI6Y2FzZSJnIjpjYXNlInAiOmNhc2UiciI6bnVsbCE9ci5wcmVjaXNpb258fGlzTmFOKGk9Q2EodSxNYXRoLm1heChNYXRoLmFicyhvKSxNYXRoLmFicyhhKSkpKXx8KHIucHJlY2lzaW9uPWktKCJlIj09PXIudHlwZSkpO2JyZWFrO2Nhc2UiZiI6Y2FzZSIlIjpudWxsIT1yLnByZWNpc2lvbnx8aXNOYU4oaT1FYSh1KSl8fChyLnByZWNpc2lvbj1pLTIqKCIlIj09PXIudHlwZSkpfXJldHVybiB0LmZvcm1hdChyKX0oZSgpLG4scil9LG4ubmljZT1mdW5jdGlvbih0KXtudWxsPT10JiYodD0xMCk7dmFyIHIsaT1lKCksbz0wLGE9aS5sZW5ndGgtMSx1PWlbb10sZj1pW2FdO3JldHVybiBmPHUmJihyPXUsdT1mLGY9cixyPW8sbz1hLGE9ciksKHI9eCh1LGYsdCkpPjA/cj14KHU9TWF0aC5mbG9vcih1L3IpKnIsZj1NYXRoLmNlaWwoZi9yKSpyLHQpOnI8MCYmKHI9eCh1PU1hdGguY2VpbCh1KnIpL3IsZj1NYXRoLmZsb29yKGYqcikvcix0KSkscj4wPyhpW29dPU1hdGguZmxvb3IodS9yKSpyLGlbYV09TWF0aC5jZWlsKGYvcikqcixlKGkpKTpyPDAmJihpW29dPU1hdGguY2VpbCh1KnIpL3IsaVthXT1NYXRoLmZsb29yKGYqcikvcixlKGkpKSxufSxufWZ1bmN0aW9uIHdoKHQsbil7dmFyIGUscj0wLGk9KHQ9dC5zbGljZSgpKS5sZW5ndGgtMSxvPXRbcl0sYT10W2ldO3JldHVybiBhPG8mJihlPXIscj1pLGk9ZSxlPW8sbz1hLGE9ZSksdFtyXT1uLmZsb29yKG8pLHRbaV09bi5jZWlsKGEpLHR9ZnVuY3Rpb24gTWgodCxuKXtyZXR1cm4obj1NYXRoLmxvZyhuL3QpKT9mdW5jdGlvbihlKXtyZXR1cm4gTWF0aC5sb2coZS90KS9ufTpkaChuKX1mdW5jdGlvbiBBaCh0LG4pe3JldHVybiB0PDA/ZnVuY3Rpb24oZSl7cmV0dXJuLU1hdGgucG93KC1uLGUpKk1hdGgucG93KC10LDEtZSl9OmZ1bmN0aW9uKGUpe3JldHVybiBNYXRoLnBvdyhuLGUpKk1hdGgucG93KHQsMS1lKX19ZnVuY3Rpb24gVGgodCl7cmV0dXJuIGlzRmluaXRlKHQpPysoIjFlIit0KTp0PDA/MDp0fWZ1bmN0aW9uIE5oKHQpe3JldHVybiAxMD09PXQ/VGg6dD09PU1hdGguRT9NYXRoLmV4cDpmdW5jdGlvbihuKXtyZXR1cm4gTWF0aC5wb3codCxuKX19ZnVuY3Rpb24gU2godCl7cmV0dXJuIHQ9PT1NYXRoLkU/TWF0aC5sb2c6MTA9PT10JiZNYXRoLmxvZzEwfHwyPT09dCYmTWF0aC5sb2cyfHwodD1NYXRoLmxvZyh0KSxmdW5jdGlvbihuKXtyZXR1cm4gTWF0aC5sb2cobikvdH0pfWZ1bmN0aW9uIEVoKHQpe3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4tdCgtbil9fWZ1bmN0aW9uIGtoKHQsbil7cmV0dXJuIHQ8MD8tTWF0aC5wb3coLXQsbik6TWF0aC5wb3codCxuKX1mdW5jdGlvbiBDaCgpe3ZhciB0PTEsbj1taChmdW5jdGlvbihuLGUpe3JldHVybihlPWtoKGUsdCktKG49a2gobix0KSkpP2Z1bmN0aW9uKHIpe3JldHVybihraChyLHQpLW4pL2V9OmRoKGUpfSxmdW5jdGlvbihuLGUpe3JldHVybiBlPWtoKGUsdCktKG49a2gobix0KSksZnVuY3Rpb24ocil7cmV0dXJuIGtoKG4rZSpyLDEvdCl9fSksZT1uLmRvbWFpbjtyZXR1cm4gbi5leHBvbmVudD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0rbixlKGUoKSkpOnR9LG4uY29weT1mdW5jdGlvbigpe3JldHVybiBiaChuLENoKCkuZXhwb25lbnQodCkpfSx4aChuKX12YXIgUGg9bmV3IERhdGUsemg9bmV3IERhdGU7ZnVuY3Rpb24gUmgodCxuLGUscil7ZnVuY3Rpb24gaShuKXtyZXR1cm4gdChuPW5ldyBEYXRlKCtuKSksbn1yZXR1cm4gaS5mbG9vcj1pLGkuY2VpbD1mdW5jdGlvbihlKXtyZXR1cm4gdChlPW5ldyBEYXRlKGUtMSkpLG4oZSwxKSx0KGUpLGV9LGkucm91bmQ9ZnVuY3Rpb24odCl7dmFyIG49aSh0KSxlPWkuY2VpbCh0KTtyZXR1cm4gdC1uPGUtdD9uOmV9LGkub2Zmc2V0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG4odD1uZXcgRGF0ZSgrdCksbnVsbD09ZT8xOk1hdGguZmxvb3IoZSkpLHR9LGkucmFuZ2U9ZnVuY3Rpb24oZSxyLG8pe3ZhciBhLHU9W107aWYoZT1pLmNlaWwoZSksbz1udWxsPT1vPzE6TWF0aC5mbG9vcihvKSwhKGU8ciYmbz4wKSlyZXR1cm4gdTtkb3t1LnB1c2goYT1uZXcgRGF0ZSgrZSkpLG4oZSxvKSx0KGUpfXdoaWxlKGE8ZSYmZTxyKTtyZXR1cm4gdX0saS5maWx0ZXI9ZnVuY3Rpb24oZSl7cmV0dXJuIFJoKGZ1bmN0aW9uKG4pe2lmKG4+PW4pZm9yKDt0KG4pLCFlKG4pOyluLnNldFRpbWUobi0xKX0sZnVuY3Rpb24odCxyKXtpZih0Pj10KWlmKHI8MClmb3IoOysrcjw9MDspZm9yKDtuKHQsLTEpLCFlKHQpOyk7ZWxzZSBmb3IoOy0tcj49MDspZm9yKDtuKHQsMSksIWUodCk7KTt9KX0sZSYmKGkuY291bnQ9ZnVuY3Rpb24obixyKXtyZXR1cm4gUGguc2V0VGltZSgrbiksemguc2V0VGltZSgrciksdChQaCksdCh6aCksTWF0aC5mbG9vcihlKFBoLHpoKSl9LGkuZXZlcnk9ZnVuY3Rpb24odCl7cmV0dXJuIHQ9TWF0aC5mbG9vcih0KSxpc0Zpbml0ZSh0KSYmdD4wP3Q+MT9pLmZpbHRlcihyP2Z1bmN0aW9uKG4pe3JldHVybiByKG4pJXQ9PTB9OmZ1bmN0aW9uKG4pe3JldHVybiBpLmNvdW50KDAsbikldD09MH0pOmk6bnVsbH0pLGl9dmFyIExoPVJoKGZ1bmN0aW9uKCl7fSxmdW5jdGlvbih0LG4pe3Quc2V0VGltZSgrdCtuKX0sZnVuY3Rpb24odCxuKXtyZXR1cm4gbi10fSk7TGguZXZlcnk9ZnVuY3Rpb24odCl7cmV0dXJuIHQ9TWF0aC5mbG9vcih0KSxpc0Zpbml0ZSh0KSYmdD4wP3Q+MT9SaChmdW5jdGlvbihuKXtuLnNldFRpbWUoTWF0aC5mbG9vcihuL3QpKnQpfSxmdW5jdGlvbihuLGUpe24uc2V0VGltZSgrbitlKnQpfSxmdW5jdGlvbihuLGUpe3JldHVybihlLW4pL3R9KTpMaDpudWxsfTt2YXIgRGg9TGgucmFuZ2UsVWg9NmU0LHFoPTYwNDhlNSxPaD1SaChmdW5jdGlvbih0KXt0LnNldFRpbWUoMWUzKk1hdGguZmxvb3IodC8xZTMpKX0sZnVuY3Rpb24odCxuKXt0LnNldFRpbWUoK3QrMWUzKm4pfSxmdW5jdGlvbih0LG4pe3JldHVybihuLXQpLzFlM30sZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0VVRDU2Vjb25kcygpfSksWWg9T2gucmFuZ2UsQmg9UmgoZnVuY3Rpb24odCl7dC5zZXRUaW1lKE1hdGguZmxvb3IodC9VaCkqVWgpfSxmdW5jdGlvbih0LG4pe3Quc2V0VGltZSgrdCtuKlVoKX0sZnVuY3Rpb24odCxuKXtyZXR1cm4obi10KS9VaH0sZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0TWludXRlcygpfSksRmg9QmgucmFuZ2UsSWg9UmgoZnVuY3Rpb24odCl7dmFyIG49dC5nZXRUaW1lem9uZU9mZnNldCgpKlVoJTM2ZTU7bjwwJiYobis9MzZlNSksdC5zZXRUaW1lKDM2ZTUqTWF0aC5mbG9vcigoK3QtbikvMzZlNSkrbil9LGZ1bmN0aW9uKHQsbil7dC5zZXRUaW1lKCt0KzM2ZTUqbil9LGZ1bmN0aW9uKHQsbil7cmV0dXJuKG4tdCkvMzZlNX0sZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0SG91cnMoKX0pLEhoPUloLnJhbmdlLGpoPVJoKGZ1bmN0aW9uKHQpe3Quc2V0SG91cnMoMCwwLDAsMCl9LGZ1bmN0aW9uKHQsbil7dC5zZXREYXRlKHQuZ2V0RGF0ZSgpK24pfSxmdW5jdGlvbih0LG4pe3JldHVybihuLXQtKG4uZ2V0VGltZXpvbmVPZmZzZXQoKS10LmdldFRpbWV6b25lT2Zmc2V0KCkpKlVoKS84NjRlNX0sZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0RGF0ZSgpLTF9KSxYaD1qaC5yYW5nZTtmdW5jdGlvbiBHaCh0KXtyZXR1cm4gUmgoZnVuY3Rpb24obil7bi5zZXREYXRlKG4uZ2V0RGF0ZSgpLShuLmdldERheSgpKzctdCklNyksbi5zZXRIb3VycygwLDAsMCwwKX0sZnVuY3Rpb24odCxuKXt0LnNldERhdGUodC5nZXREYXRlKCkrNypuKX0sZnVuY3Rpb24odCxuKXtyZXR1cm4obi10LShuLmdldFRpbWV6b25lT2Zmc2V0KCktdC5nZXRUaW1lem9uZU9mZnNldCgpKSpVaCkvcWh9KX12YXIgVmg9R2goMCksJGg9R2goMSksV2g9R2goMiksWmg9R2goMyksUWg9R2goNCksSmg9R2goNSksS2g9R2goNiksdGQ9VmgucmFuZ2UsbmQ9JGgucmFuZ2UsZWQ9V2gucmFuZ2UscmQ9WmgucmFuZ2UsaWQ9UWgucmFuZ2Usb2Q9SmgucmFuZ2UsYWQ9S2gucmFuZ2UsdWQ9UmgoZnVuY3Rpb24odCl7dC5zZXREYXRlKDEpLHQuc2V0SG91cnMoMCwwLDAsMCl9LGZ1bmN0aW9uKHQsbil7dC5zZXRNb250aCh0LmdldE1vbnRoKCkrbil9LGZ1bmN0aW9uKHQsbil7cmV0dXJuIG4uZ2V0TW9udGgoKS10LmdldE1vbnRoKCkrMTIqKG4uZ2V0RnVsbFllYXIoKS10LmdldEZ1bGxZZWFyKCkpfSxmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXRNb250aCgpfSksZmQ9dWQucmFuZ2UsY2Q9UmgoZnVuY3Rpb24odCl7dC5zZXRNb250aCgwLDEpLHQuc2V0SG91cnMoMCwwLDAsMCl9LGZ1bmN0aW9uKHQsbil7dC5zZXRGdWxsWWVhcih0LmdldEZ1bGxZZWFyKCkrbil9LGZ1bmN0aW9uKHQsbil7cmV0dXJuIG4uZ2V0RnVsbFllYXIoKS10LmdldEZ1bGxZZWFyKCl9LGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldEZ1bGxZZWFyKCl9KTtjZC5ldmVyeT1mdW5jdGlvbih0KXtyZXR1cm4gaXNGaW5pdGUodD1NYXRoLmZsb29yKHQpKSYmdD4wP1JoKGZ1bmN0aW9uKG4pe24uc2V0RnVsbFllYXIoTWF0aC5mbG9vcihuLmdldEZ1bGxZZWFyKCkvdCkqdCksbi5zZXRNb250aCgwLDEpLG4uc2V0SG91cnMoMCwwLDAsMCl9LGZ1bmN0aW9uKG4sZSl7bi5zZXRGdWxsWWVhcihuLmdldEZ1bGxZZWFyKCkrZSp0KX0pOm51bGx9O3ZhciBzZD1jZC5yYW5nZSxsZD1SaChmdW5jdGlvbih0KXt0LnNldFVUQ1NlY29uZHMoMCwwKX0sZnVuY3Rpb24odCxuKXt0LnNldFRpbWUoK3QrbipVaCl9LGZ1bmN0aW9uKHQsbil7cmV0dXJuKG4tdCkvVWh9LGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldFVUQ01pbnV0ZXMoKX0pLGhkPWxkLnJhbmdlLGRkPVJoKGZ1bmN0aW9uKHQpe3Quc2V0VVRDTWludXRlcygwLDAsMCl9LGZ1bmN0aW9uKHQsbil7dC5zZXRUaW1lKCt0KzM2ZTUqbil9LGZ1bmN0aW9uKHQsbil7cmV0dXJuKG4tdCkvMzZlNX0sZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0VVRDSG91cnMoKX0pLHBkPWRkLnJhbmdlLHZkPVJoKGZ1bmN0aW9uKHQpe3Quc2V0VVRDSG91cnMoMCwwLDAsMCl9LGZ1bmN0aW9uKHQsbil7dC5zZXRVVENEYXRlKHQuZ2V0VVRDRGF0ZSgpK24pfSxmdW5jdGlvbih0LG4pe3JldHVybihuLXQpLzg2NGU1fSxmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXRVVENEYXRlKCktMX0pLGdkPXZkLnJhbmdlO2Z1bmN0aW9uIHlkKHQpe3JldHVybiBSaChmdW5jdGlvbihuKXtuLnNldFVUQ0RhdGUobi5nZXRVVENEYXRlKCktKG4uZ2V0VVRDRGF5KCkrNy10KSU3KSxuLnNldFVUQ0hvdXJzKDAsMCwwLDApfSxmdW5jdGlvbih0LG4pe3Quc2V0VVRDRGF0ZSh0LmdldFVUQ0RhdGUoKSs3Km4pfSxmdW5jdGlvbih0LG4pe3JldHVybihuLXQpL3FofSl9dmFyIF9kPXlkKDApLGJkPXlkKDEpLG1kPXlkKDIpLHhkPXlkKDMpLHdkPXlkKDQpLE1kPXlkKDUpLEFkPXlkKDYpLFRkPV9kLnJhbmdlLE5kPWJkLnJhbmdlLFNkPW1kLnJhbmdlLEVkPXhkLnJhbmdlLGtkPXdkLnJhbmdlLENkPU1kLnJhbmdlLFBkPUFkLnJhbmdlLHpkPVJoKGZ1bmN0aW9uKHQpe3Quc2V0VVRDRGF0ZSgxKSx0LnNldFVUQ0hvdXJzKDAsMCwwLDApfSxmdW5jdGlvbih0LG4pe3Quc2V0VVRDTW9udGgodC5nZXRVVENNb250aCgpK24pfSxmdW5jdGlvbih0LG4pe3JldHVybiBuLmdldFVUQ01vbnRoKCktdC5nZXRVVENNb250aCgpKzEyKihuLmdldFVUQ0Z1bGxZZWFyKCktdC5nZXRVVENGdWxsWWVhcigpKX0sZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0VVRDTW9udGgoKX0pLFJkPXpkLnJhbmdlLExkPVJoKGZ1bmN0aW9uKHQpe3Quc2V0VVRDTW9udGgoMCwxKSx0LnNldFVUQ0hvdXJzKDAsMCwwLDApfSxmdW5jdGlvbih0LG4pe3Quc2V0VVRDRnVsbFllYXIodC5nZXRVVENGdWxsWWVhcigpK24pfSxmdW5jdGlvbih0LG4pe3JldHVybiBuLmdldFVUQ0Z1bGxZZWFyKCktdC5nZXRVVENGdWxsWWVhcigpfSxmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXRVVENGdWxsWWVhcigpfSk7TGQuZXZlcnk9ZnVuY3Rpb24odCl7cmV0dXJuIGlzRmluaXRlKHQ9TWF0aC5mbG9vcih0KSkmJnQ+MD9SaChmdW5jdGlvbihuKXtuLnNldFVUQ0Z1bGxZZWFyKE1hdGguZmxvb3Iobi5nZXRVVENGdWxsWWVhcigpL3QpKnQpLG4uc2V0VVRDTW9udGgoMCwxKSxuLnNldFVUQ0hvdXJzKDAsMCwwLDApfSxmdW5jdGlvbihuLGUpe24uc2V0VVRDRnVsbFllYXIobi5nZXRVVENGdWxsWWVhcigpK2UqdCl9KTpudWxsfTt2YXIgRGQ9TGQucmFuZ2U7ZnVuY3Rpb24gVWQodCl7aWYoMDw9dC55JiZ0Lnk8MTAwKXt2YXIgbj1uZXcgRGF0ZSgtMSx0Lm0sdC5kLHQuSCx0Lk0sdC5TLHQuTCk7cmV0dXJuIG4uc2V0RnVsbFllYXIodC55KSxufXJldHVybiBuZXcgRGF0ZSh0LnksdC5tLHQuZCx0LkgsdC5NLHQuUyx0LkwpfWZ1bmN0aW9uIHFkKHQpe2lmKDA8PXQueSYmdC55PDEwMCl7dmFyIG49bmV3IERhdGUoRGF0ZS5VVEMoLTEsdC5tLHQuZCx0LkgsdC5NLHQuUyx0LkwpKTtyZXR1cm4gbi5zZXRVVENGdWxsWWVhcih0LnkpLG59cmV0dXJuIG5ldyBEYXRlKERhdGUuVVRDKHQueSx0Lm0sdC5kLHQuSCx0Lk0sdC5TLHQuTCkpfWZ1bmN0aW9uIE9kKHQpe3JldHVybnt5OnQsbTowLGQ6MSxIOjAsTTowLFM6MCxMOjB9fWZ1bmN0aW9uIFlkKHQpe3ZhciBuPXQuZGF0ZVRpbWUsZT10LmRhdGUscj10LnRpbWUsaT10LnBlcmlvZHMsbz10LmRheXMsYT10LnNob3J0RGF5cyx1PXQubW9udGhzLGY9dC5zaG9ydE1vbnRocyxjPVZkKGkpLHM9JGQoaSksbD1WZChvKSxoPSRkKG8pLGQ9VmQoYSkscD0kZChhKSx2PVZkKHUpLGc9JGQodSkseT1WZChmKSxfPSRkKGYpLGI9e2E6ZnVuY3Rpb24odCl7cmV0dXJuIGFbdC5nZXREYXkoKV19LEE6ZnVuY3Rpb24odCl7cmV0dXJuIG9bdC5nZXREYXkoKV19LGI6ZnVuY3Rpb24odCl7cmV0dXJuIGZbdC5nZXRNb250aCgpXX0sQjpmdW5jdGlvbih0KXtyZXR1cm4gdVt0LmdldE1vbnRoKCldfSxjOm51bGwsZDpwcCxlOnBwLGY6YnAsSDp2cCxJOmdwLGo6eXAsTDpfcCxtOm1wLE06eHAscDpmdW5jdGlvbih0KXtyZXR1cm4gaVsrKHQuZ2V0SG91cnMoKT49MTIpXX0sUTpXcCxzOlpwLFM6d3AsdTpNcCxVOkFwLFY6VHAsdzpOcCxXOlNwLHg6bnVsbCxYOm51bGwseTpFcCxZOmtwLFo6Q3AsIiUiOiRwfSxtPXthOmZ1bmN0aW9uKHQpe3JldHVybiBhW3QuZ2V0VVRDRGF5KCldfSxBOmZ1bmN0aW9uKHQpe3JldHVybiBvW3QuZ2V0VVRDRGF5KCldfSxiOmZ1bmN0aW9uKHQpe3JldHVybiBmW3QuZ2V0VVRDTW9udGgoKV19LEI6ZnVuY3Rpb24odCl7cmV0dXJuIHVbdC5nZXRVVENNb250aCgpXX0sYzpudWxsLGQ6UHAsZTpQcCxmOlVwLEg6enAsSTpScCxqOkxwLEw6RHAsbTpxcCxNOk9wLHA6ZnVuY3Rpb24odCl7cmV0dXJuIGlbKyh0LmdldFVUQ0hvdXJzKCk+PTEyKV19LFE6V3AsczpacCxTOllwLHU6QnAsVTpGcCxWOklwLHc6SHAsVzpqcCx4Om51bGwsWDpudWxsLHk6WHAsWTpHcCxaOlZwLCIlIjokcH0seD17YTpmdW5jdGlvbih0LG4sZSl7dmFyIHI9ZC5leGVjKG4uc2xpY2UoZSkpO3JldHVybiByPyh0Lnc9cFtyWzBdLnRvTG93ZXJDYXNlKCldLGUrclswXS5sZW5ndGgpOi0xfSxBOmZ1bmN0aW9uKHQsbixlKXt2YXIgcj1sLmV4ZWMobi5zbGljZShlKSk7cmV0dXJuIHI/KHQudz1oW3JbMF0udG9Mb3dlckNhc2UoKV0sZStyWzBdLmxlbmd0aCk6LTF9LGI6ZnVuY3Rpb24odCxuLGUpe3ZhciByPXkuZXhlYyhuLnNsaWNlKGUpKTtyZXR1cm4gcj8odC5tPV9bclswXS50b0xvd2VyQ2FzZSgpXSxlK3JbMF0ubGVuZ3RoKTotMX0sQjpmdW5jdGlvbih0LG4sZSl7dmFyIHI9di5leGVjKG4uc2xpY2UoZSkpO3JldHVybiByPyh0Lm09Z1tyWzBdLnRvTG93ZXJDYXNlKCldLGUrclswXS5sZW5ndGgpOi0xfSxjOmZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gQSh0LG4sZSxyKX0sZDppcCxlOmlwLGY6c3AsSDphcCxJOmFwLGo6b3AsTDpjcCxtOnJwLE06dXAscDpmdW5jdGlvbih0LG4sZSl7dmFyIHI9Yy5leGVjKG4uc2xpY2UoZSkpO3JldHVybiByPyh0LnA9c1tyWzBdLnRvTG93ZXJDYXNlKCldLGUrclswXS5sZW5ndGgpOi0xfSxROmhwLHM6ZHAsUzpmcCx1OlpkLFU6UWQsVjpKZCx3OldkLFc6S2QseDpmdW5jdGlvbih0LG4scil7cmV0dXJuIEEodCxlLG4scil9LFg6ZnVuY3Rpb24odCxuLGUpe3JldHVybiBBKHQscixuLGUpfSx5Om5wLFk6dHAsWjplcCwiJSI6bHB9O2Z1bmN0aW9uIHcodCxuKXtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIHIsaSxvLGE9W10sdT0tMSxmPTAsYz10Lmxlbmd0aDtmb3IoZSBpbnN0YW5jZW9mIERhdGV8fChlPW5ldyBEYXRlKCtlKSk7Kyt1PGM7KTM3PT09dC5jaGFyQ29kZUF0KHUpJiYoYS5wdXNoKHQuc2xpY2UoZix1KSksbnVsbCE9KGk9RmRbcj10LmNoYXJBdCgrK3UpXSk/cj10LmNoYXJBdCgrK3UpOmk9ImUiPT09cj8iICI6IjAiLChvPW5bcl0pJiYocj1vKGUsaSkpLGEucHVzaChyKSxmPXUrMSk7cmV0dXJuIGEucHVzaCh0LnNsaWNlKGYsdSkpLGEuam9pbigiIil9fWZ1bmN0aW9uIE0odCxuKXtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIHIsaSxvPU9kKDE5MDApO2lmKEEobyx0LGUrPSIiLDApIT1lLmxlbmd0aClyZXR1cm4gbnVsbDtpZigiUSJpbiBvKXJldHVybiBuZXcgRGF0ZShvLlEpO2lmKCJwImluIG8mJihvLkg9by5IJTEyKzEyKm8ucCksIlYiaW4gbyl7aWYoby5WPDF8fG8uVj41MylyZXR1cm4gbnVsbDsidyJpbiBvfHwoby53PTEpLCJaImluIG8/KGk9KHI9cWQoT2Qoby55KSkpLmdldFVUQ0RheSgpLHI9aT40fHwwPT09aT9iZC5jZWlsKHIpOmJkKHIpLHI9dmQub2Zmc2V0KHIsNyooby5WLTEpKSxvLnk9ci5nZXRVVENGdWxsWWVhcigpLG8ubT1yLmdldFVUQ01vbnRoKCksby5kPXIuZ2V0VVRDRGF0ZSgpKyhvLncrNiklNyk6KGk9KHI9bihPZChvLnkpKSkuZ2V0RGF5KCkscj1pPjR8fDA9PT1pPyRoLmNlaWwocik6JGgocikscj1qaC5vZmZzZXQociw3KihvLlYtMSkpLG8ueT1yLmdldEZ1bGxZZWFyKCksby5tPXIuZ2V0TW9udGgoKSxvLmQ9ci5nZXREYXRlKCkrKG8udys2KSU3KX1lbHNlKCJXImluIG98fCJVImluIG8pJiYoInciaW4gb3x8KG8udz0idSJpbiBvP28udSU3OiJXImluIG8/MTowKSxpPSJaImluIG8/cWQoT2Qoby55KSkuZ2V0VVRDRGF5KCk6bihPZChvLnkpKS5nZXREYXkoKSxvLm09MCxvLmQ9IlciaW4gbz8oby53KzYpJTcrNypvLlctKGkrNSklNzpvLncrNypvLlUtKGkrNiklNyk7cmV0dXJuIloiaW4gbz8oby5IKz1vLlovMTAwfDAsby5NKz1vLlolMTAwLHFkKG8pKTpuKG8pfX1mdW5jdGlvbiBBKHQsbixlLHIpe2Zvcih2YXIgaSxvLGE9MCx1PW4ubGVuZ3RoLGY9ZS5sZW5ndGg7YTx1Oyl7aWYocj49ZilyZXR1cm4tMTtpZigzNz09PShpPW4uY2hhckNvZGVBdChhKyspKSl7aWYoaT1uLmNoYXJBdChhKyspLCEobz14W2kgaW4gRmQ/bi5jaGFyQXQoYSsrKTppXSl8fChyPW8odCxlLHIpKTwwKXJldHVybi0xfWVsc2UgaWYoaSE9ZS5jaGFyQ29kZUF0KHIrKykpcmV0dXJuLTF9cmV0dXJuIHJ9cmV0dXJuIGIueD13KGUsYiksYi5YPXcocixiKSxiLmM9dyhuLGIpLG0ueD13KGUsbSksbS5YPXcocixtKSxtLmM9dyhuLG0pLHtmb3JtYXQ6ZnVuY3Rpb24odCl7dmFyIG49dyh0Kz0iIixiKTtyZXR1cm4gbi50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0fSxufSxwYXJzZTpmdW5jdGlvbih0KXt2YXIgbj1NKHQrPSIiLFVkKTtyZXR1cm4gbi50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0fSxufSx1dGNGb3JtYXQ6ZnVuY3Rpb24odCl7dmFyIG49dyh0Kz0iIixtKTtyZXR1cm4gbi50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0fSxufSx1dGNQYXJzZTpmdW5jdGlvbih0KXt2YXIgbj1NKHQscWQpO3JldHVybiBuLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHR9LG59fX12YXIgQmQsRmQ9eyItIjoiIixfOiIgIiwwOiIwIn0sSWQ9L15ccypcZCsvLEhkPS9eJS8samQ9L1tcXF4kKis/fFtcXSgpLnt9XS9nO2Z1bmN0aW9uIFhkKHQsbixlKXt2YXIgcj10PDA/Ii0iOiIiLGk9KHI/LXQ6dCkrIiIsbz1pLmxlbmd0aDtyZXR1cm4gcisobzxlP25ldyBBcnJheShlLW8rMSkuam9pbihuKStpOmkpfWZ1bmN0aW9uIEdkKHQpe3JldHVybiB0LnJlcGxhY2UoamQsIlxcJCYiKX1mdW5jdGlvbiBWZCh0KXtyZXR1cm4gbmV3IFJlZ0V4cCgiXig/OiIrdC5tYXAoR2QpLmpvaW4oInwiKSsiKSIsImkiKX1mdW5jdGlvbiAkZCh0KXtmb3IodmFyIG49e30sZT0tMSxyPXQubGVuZ3RoOysrZTxyOyluW3RbZV0udG9Mb3dlckNhc2UoKV09ZTtyZXR1cm4gbn1mdW5jdGlvbiBXZCh0LG4sZSl7dmFyIHI9SWQuZXhlYyhuLnNsaWNlKGUsZSsxKSk7cmV0dXJuIHI/KHQudz0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBaZCh0LG4sZSl7dmFyIHI9SWQuZXhlYyhuLnNsaWNlKGUsZSsxKSk7cmV0dXJuIHI/KHQudT0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBRZCh0LG4sZSl7dmFyIHI9SWQuZXhlYyhuLnNsaWNlKGUsZSsyKSk7cmV0dXJuIHI/KHQuVT0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBKZCh0LG4sZSl7dmFyIHI9SWQuZXhlYyhuLnNsaWNlKGUsZSsyKSk7cmV0dXJuIHI/KHQuVj0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBLZCh0LG4sZSl7dmFyIHI9SWQuZXhlYyhuLnNsaWNlKGUsZSsyKSk7cmV0dXJuIHI/KHQuVz0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiB0cCh0LG4sZSl7dmFyIHI9SWQuZXhlYyhuLnNsaWNlKGUsZSs0KSk7cmV0dXJuIHI/KHQueT0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBucCh0LG4sZSl7dmFyIHI9SWQuZXhlYyhuLnNsaWNlKGUsZSsyKSk7cmV0dXJuIHI/KHQueT0rclswXSsoK3JbMF0+Njg/MTkwMDoyZTMpLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGVwKHQsbixlKXt2YXIgcj0vXihaKXwoWystXVxkXGQpKD86Oj8oXGRcZCkpPy8uZXhlYyhuLnNsaWNlKGUsZSs2KSk7cmV0dXJuIHI/KHQuWj1yWzFdPzA6LShyWzJdKyhyWzNdfHwiMDAiKSksZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gcnAodCxuLGUpe3ZhciByPUlkLmV4ZWMobi5zbGljZShlLGUrMikpO3JldHVybiByPyh0Lm09clswXS0xLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGlwKHQsbixlKXt2YXIgcj1JZC5leGVjKG4uc2xpY2UoZSxlKzIpKTtyZXR1cm4gcj8odC5kPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIG9wKHQsbixlKXt2YXIgcj1JZC5leGVjKG4uc2xpY2UoZSxlKzMpKTtyZXR1cm4gcj8odC5tPTAsdC5kPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGFwKHQsbixlKXt2YXIgcj1JZC5leGVjKG4uc2xpY2UoZSxlKzIpKTtyZXR1cm4gcj8odC5IPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIHVwKHQsbixlKXt2YXIgcj1JZC5leGVjKG4uc2xpY2UoZSxlKzIpKTtyZXR1cm4gcj8odC5NPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGZwKHQsbixlKXt2YXIgcj1JZC5leGVjKG4uc2xpY2UoZSxlKzIpKTtyZXR1cm4gcj8odC5TPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGNwKHQsbixlKXt2YXIgcj1JZC5leGVjKG4uc2xpY2UoZSxlKzMpKTtyZXR1cm4gcj8odC5MPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIHNwKHQsbixlKXt2YXIgcj1JZC5leGVjKG4uc2xpY2UoZSxlKzYpKTtyZXR1cm4gcj8odC5MPU1hdGguZmxvb3IoclswXS8xZTMpLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGxwKHQsbixlKXt2YXIgcj1IZC5leGVjKG4uc2xpY2UoZSxlKzEpKTtyZXR1cm4gcj9lK3JbMF0ubGVuZ3RoOi0xfWZ1bmN0aW9uIGhwKHQsbixlKXt2YXIgcj1JZC5leGVjKG4uc2xpY2UoZSkpO3JldHVybiByPyh0LlE9K3JbMF0sZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gZHAodCxuLGUpe3ZhciByPUlkLmV4ZWMobi5zbGljZShlKSk7cmV0dXJuIHI/KHQuUT0xZTMqK3JbMF0sZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gcHAodCxuKXtyZXR1cm4gWGQodC5nZXREYXRlKCksbiwyKX1mdW5jdGlvbiB2cCh0LG4pe3JldHVybiBYZCh0LmdldEhvdXJzKCksbiwyKX1mdW5jdGlvbiBncCh0LG4pe3JldHVybiBYZCh0LmdldEhvdXJzKCklMTJ8fDEyLG4sMil9ZnVuY3Rpb24geXAodCxuKXtyZXR1cm4gWGQoMStqaC5jb3VudChjZCh0KSx0KSxuLDMpfWZ1bmN0aW9uIF9wKHQsbil7cmV0dXJuIFhkKHQuZ2V0TWlsbGlzZWNvbmRzKCksbiwzKX1mdW5jdGlvbiBicCh0LG4pe3JldHVybiBfcCh0LG4pKyIwMDAifWZ1bmN0aW9uIG1wKHQsbil7cmV0dXJuIFhkKHQuZ2V0TW9udGgoKSsxLG4sMil9ZnVuY3Rpb24geHAodCxuKXtyZXR1cm4gWGQodC5nZXRNaW51dGVzKCksbiwyKX1mdW5jdGlvbiB3cCh0LG4pe3JldHVybiBYZCh0LmdldFNlY29uZHMoKSxuLDIpfWZ1bmN0aW9uIE1wKHQpe3ZhciBuPXQuZ2V0RGF5KCk7cmV0dXJuIDA9PT1uPzc6bn1mdW5jdGlvbiBBcCh0LG4pe3JldHVybiBYZChWaC5jb3VudChjZCh0KSx0KSxuLDIpfWZ1bmN0aW9uIFRwKHQsbil7dmFyIGU9dC5nZXREYXkoKTtyZXR1cm4gdD1lPj00fHwwPT09ZT9RaCh0KTpRaC5jZWlsKHQpLFhkKFFoLmNvdW50KGNkKHQpLHQpKyg0PT09Y2QodCkuZ2V0RGF5KCkpLG4sMil9ZnVuY3Rpb24gTnAodCl7cmV0dXJuIHQuZ2V0RGF5KCl9ZnVuY3Rpb24gU3AodCxuKXtyZXR1cm4gWGQoJGguY291bnQoY2QodCksdCksbiwyKX1mdW5jdGlvbiBFcCh0LG4pe3JldHVybiBYZCh0LmdldEZ1bGxZZWFyKCklMTAwLG4sMil9ZnVuY3Rpb24ga3AodCxuKXtyZXR1cm4gWGQodC5nZXRGdWxsWWVhcigpJTFlNCxuLDQpfWZ1bmN0aW9uIENwKHQpe3ZhciBuPXQuZ2V0VGltZXpvbmVPZmZzZXQoKTtyZXR1cm4obj4wPyItIjoobio9LTEsIisiKSkrWGQobi82MHwwLCIwIiwyKStYZChuJTYwLCIwIiwyKX1mdW5jdGlvbiBQcCh0LG4pe3JldHVybiBYZCh0LmdldFVUQ0RhdGUoKSxuLDIpfWZ1bmN0aW9uIHpwKHQsbil7cmV0dXJuIFhkKHQuZ2V0VVRDSG91cnMoKSxuLDIpfWZ1bmN0aW9uIFJwKHQsbil7cmV0dXJuIFhkKHQuZ2V0VVRDSG91cnMoKSUxMnx8MTIsbiwyKX1mdW5jdGlvbiBMcCh0LG4pe3JldHVybiBYZCgxK3ZkLmNvdW50KExkKHQpLHQpLG4sMyl9ZnVuY3Rpb24gRHAodCxuKXtyZXR1cm4gWGQodC5nZXRVVENNaWxsaXNlY29uZHMoKSxuLDMpfWZ1bmN0aW9uIFVwKHQsbil7cmV0dXJuIERwKHQsbikrIjAwMCJ9ZnVuY3Rpb24gcXAodCxuKXtyZXR1cm4gWGQodC5nZXRVVENNb250aCgpKzEsbiwyKX1mdW5jdGlvbiBPcCh0LG4pe3JldHVybiBYZCh0LmdldFVUQ01pbnV0ZXMoKSxuLDIpfWZ1bmN0aW9uIFlwKHQsbil7cmV0dXJuIFhkKHQuZ2V0VVRDU2Vjb25kcygpLG4sMil9ZnVuY3Rpb24gQnAodCl7dmFyIG49dC5nZXRVVENEYXkoKTtyZXR1cm4gMD09PW4/NzpufWZ1bmN0aW9uIEZwKHQsbil7cmV0dXJuIFhkKF9kLmNvdW50KExkKHQpLHQpLG4sMil9ZnVuY3Rpb24gSXAodCxuKXt2YXIgZT10LmdldFVUQ0RheSgpO3JldHVybiB0PWU+PTR8fDA9PT1lP3dkKHQpOndkLmNlaWwodCksWGQod2QuY291bnQoTGQodCksdCkrKDQ9PT1MZCh0KS5nZXRVVENEYXkoKSksbiwyKX1mdW5jdGlvbiBIcCh0KXtyZXR1cm4gdC5nZXRVVENEYXkoKX1mdW5jdGlvbiBqcCh0LG4pe3JldHVybiBYZChiZC5jb3VudChMZCh0KSx0KSxuLDIpfWZ1bmN0aW9uIFhwKHQsbil7cmV0dXJuIFhkKHQuZ2V0VVRDRnVsbFllYXIoKSUxMDAsbiwyKX1mdW5jdGlvbiBHcCh0LG4pe3JldHVybiBYZCh0LmdldFVUQ0Z1bGxZZWFyKCklMWU0LG4sNCl9ZnVuY3Rpb24gVnAoKXtyZXR1cm4iKzAwMDAifWZ1bmN0aW9uICRwKCl7cmV0dXJuIiUifWZ1bmN0aW9uIFdwKHQpe3JldHVybit0fWZ1bmN0aW9uIFpwKHQpe3JldHVybiBNYXRoLmZsb29yKCt0LzFlMyl9ZnVuY3Rpb24gUXAobil7cmV0dXJuIEJkPVlkKG4pLHQudGltZUZvcm1hdD1CZC5mb3JtYXQsdC50aW1lUGFyc2U9QmQucGFyc2UsdC51dGNGb3JtYXQ9QmQudXRjRm9ybWF0LHQudXRjUGFyc2U9QmQudXRjUGFyc2UsQmR9UXAoe2RhdGVUaW1lOiIleCwgJVgiLGRhdGU6IiUtbS8lLWQvJVkiLHRpbWU6IiUtSTolTTolUyAlcCIscGVyaW9kczpbIkFNIiwiUE0iXSxkYXlzOlsiU3VuZGF5IiwiTW9uZGF5IiwiVHVlc2RheSIsIldlZG5lc2RheSIsIlRodXJzZGF5IiwiRnJpZGF5IiwiU2F0dXJkYXkiXSxzaG9ydERheXM6WyJTdW4iLCJNb24iLCJUdWUiLCJXZWQiLCJUaHUiLCJGcmkiLCJTYXQiXSxtb250aHM6WyJKYW51YXJ5IiwiRmVicnVhcnkiLCJNYXJjaCIsIkFwcmlsIiwiTWF5IiwiSnVuZSIsIkp1bHkiLCJBdWd1c3QiLCJTZXB0ZW1iZXIiLCJPY3RvYmVyIiwiTm92ZW1iZXIiLCJEZWNlbWJlciJdLHNob3J0TW9udGhzOlsiSmFuIiwiRmViIiwiTWFyIiwiQXByIiwiTWF5IiwiSnVuIiwiSnVsIiwiQXVnIiwiU2VwIiwiT2N0IiwiTm92IiwiRGVjIl19KTt2YXIgSnA9RGF0ZS5wcm90b3R5cGUudG9JU09TdHJpbmc/ZnVuY3Rpb24odCl7cmV0dXJuIHQudG9JU09TdHJpbmcoKX06dC51dGNGb3JtYXQoIiVZLSVtLSVkVCVIOiVNOiVTLiVMWiIpO3ZhciBLcD0rbmV3IERhdGUoIjIwMDAtMDEtMDFUMDA6MDA6MDAuMDAwWiIpP2Z1bmN0aW9uKHQpe3ZhciBuPW5ldyBEYXRlKHQpO3JldHVybiBpc05hTihuKT9udWxsOm59OnQudXRjUGFyc2UoIiVZLSVtLSVkVCVIOiVNOiVTLiVMWiIpLHR2PTFlMyxudj02MCp0dixldj02MCpudixydj0yNCpldixpdj03KnJ2LG92PTMwKnJ2LGF2PTM2NSpydjtmdW5jdGlvbiB1dih0KXtyZXR1cm4gbmV3IERhdGUodCl9ZnVuY3Rpb24gZnYodCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBEYXRlPyt0OituZXcgRGF0ZSgrdCl9ZnVuY3Rpb24gY3YodCxuLHIsaSxvLGEsdSxmLGMpe3ZhciBzPW1oKGdoLHZlKSxsPXMuaW52ZXJ0LGg9cy5kb21haW4sZD1jKCIuJUwiKSxwPWMoIjolUyIpLHY9YygiJUk6JU0iKSxnPWMoIiVJICVwIikseT1jKCIlYSAlZCIpLF89YygiJWIgJWQiKSxiPWMoIiVCIiksbT1jKCIlWSIpLHg9W1t1LDEsdHZdLFt1LDUsNSp0dl0sW3UsMTUsMTUqdHZdLFt1LDMwLDMwKnR2XSxbYSwxLG52XSxbYSw1LDUqbnZdLFthLDE1LDE1Km52XSxbYSwzMCwzMCpudl0sW28sMSxldl0sW28sMywzKmV2XSxbbyw2LDYqZXZdLFtvLDEyLDEyKmV2XSxbaSwxLHJ2XSxbaSwyLDIqcnZdLFtyLDEsaXZdLFtuLDEsb3ZdLFtuLDMsMypvdl0sW3QsMSxhdl1dO2Z1bmN0aW9uIE0oZSl7cmV0dXJuKHUoZSk8ZT9kOmEoZSk8ZT9wOm8oZSk8ZT92OmkoZSk8ZT9nOm4oZSk8ZT9yKGUpPGU/eTpfOnQoZSk8ZT9iOm0pKGUpfWZ1bmN0aW9uIEEobixyLGksbyl7aWYobnVsbD09biYmKG49MTApLCJudW1iZXIiPT10eXBlb2Ygbil7dmFyIGE9TWF0aC5hYnMoaS1yKS9uLHU9ZShmdW5jdGlvbih0KXtyZXR1cm4gdFsyXX0pLnJpZ2h0KHgsYSk7dT09PXgubGVuZ3RoPyhvPXcoci9hdixpL2F2LG4pLG49dCk6dT8obz0odT14W2EveFt1LTFdWzJdPHhbdV1bMl0vYT91LTE6dV0pWzFdLG49dVswXSk6KG89TWF0aC5tYXgodyhyLGksbiksMSksbj1mKX1yZXR1cm4gbnVsbD09bz9uOm4uZXZlcnkobyl9cmV0dXJuIHMuaW52ZXJ0PWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgRGF0ZShsKHQpKX0scy5kb21haW49ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/aChmaC5jYWxsKHQsZnYpKTpoKCkubWFwKHV2KX0scy50aWNrcz1mdW5jdGlvbih0LG4pe3ZhciBlLHI9aCgpLGk9clswXSxvPXJbci5sZW5ndGgtMV0sYT1vPGk7cmV0dXJuIGEmJihlPWksaT1vLG89ZSksZT0oZT1BKHQsaSxvLG4pKT9lLnJhbmdlKGksbysxKTpbXSxhP2UucmV2ZXJzZSgpOmV9LHMudGlja0Zvcm1hdD1mdW5jdGlvbih0LG4pe3JldHVybiBudWxsPT1uP006YyhuKX0scy5uaWNlPWZ1bmN0aW9uKHQsbil7dmFyIGU9aCgpO3JldHVybih0PUEodCxlWzBdLGVbZS5sZW5ndGgtMV0sbikpP2god2goZSx0KSk6c30scy5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIGJoKHMsY3YodCxuLHIsaSxvLGEsdSxmLGMpKX0sc31mdW5jdGlvbiBzdih0KXtmb3IodmFyIG49dC5sZW5ndGgvNnwwLGU9bmV3IEFycmF5KG4pLHI9MDtyPG47KWVbcl09IiMiK3Quc2xpY2UoNipyLDYqKytyKTtyZXR1cm4gZX12YXIgbHY9c3YoIjFmNzdiNGZmN2YwZTJjYTAyY2Q2MjcyODk0NjdiZDhjNTY0YmUzNzdjMjdmN2Y3ZmJjYmQyMjE3YmVjZiIpLGh2PXN2KCI3ZmM5N2ZiZWFlZDRmZGMwODZmZmZmOTkzODZjYjBmMDAyN2ZiZjViMTc2NjY2NjYiKSxkdj1zdigiMWI5ZTc3ZDk1ZjAyNzU3MGIzZTcyOThhNjZhNjFlZTZhYjAyYTY3NjFkNjY2NjY2IikscHY9c3YoImE2Y2VlMzFmNzhiNGIyZGY4YTMzYTAyY2ZiOWE5OWUzMWExY2ZkYmY2ZmZmN2YwMGNhYjJkNjZhM2Q5YWZmZmY5OWIxNTkyOCIpLHZ2PXN2KCJmYmI0YWViM2NkZTNjY2ViYzVkZWNiZTRmZWQ5YTZmZmZmY2NlNWQ4YmRmZGRhZWNmMmYyZjIiKSxndj1zdigiYjNlMmNkZmRjZGFjY2JkNWU4ZjRjYWU0ZTZmNWM5ZmZmMmFlZjFlMmNjY2NjY2NjIikseXY9c3YoImU0MWExYzM3N2ViODRkYWY0YTk4NGVhM2ZmN2YwMGZmZmYzM2E2NTYyOGY3ODFiZjk5OTk5OSIpLF92PXN2KCI2NmMyYTVmYzhkNjI4ZGEwY2JlNzhhYzNhNmQ4NTRmZmQ5MmZlNWM0OTRiM2IzYjMiKSxidj1zdigiOGRkM2M3ZmZmZmIzYmViYWRhZmI4MDcyODBiMWQzZmRiNDYyYjNkZTY5ZmNjZGU1ZDlkOWQ5YmM4MGJkY2NlYmM1ZmZlZDZmIik7ZnVuY3Rpb24gbXYodCl7cmV0dXJuIGxlKHRbdC5sZW5ndGgtMV0pfXZhciB4dj1uZXcgQXJyYXkoMykuY29uY2F0KCJkOGIzNjVmNWY1ZjU1YWI0YWMiLCJhNjYxMWFkZmMyN2Q4MGNkYzEwMTg1NzEiLCJhNjYxMWFkZmMyN2RmNWY1ZjU4MGNkYzEwMTg1NzEiLCI4YzUxMGFkOGIzNjVmNmU4YzNjN2VhZTU1YWI0YWMwMTY2NWUiLCI4YzUxMGFkOGIzNjVmNmU4YzNmNWY1ZjVjN2VhZTU1YWI0YWMwMTY2NWUiLCI4YzUxMGFiZjgxMmRkZmMyN2RmNmU4YzNjN2VhZTU4MGNkYzEzNTk3OGYwMTY2NWUiLCI4YzUxMGFiZjgxMmRkZmMyN2RmNmU4YzNmNWY1ZjVjN2VhZTU4MGNkYzEzNTk3OGYwMTY2NWUiLCI1NDMwMDU4YzUxMGFiZjgxMmRkZmMyN2RmNmU4YzNjN2VhZTU4MGNkYzEzNTk3OGYwMTY2NWUwMDNjMzAiLCI1NDMwMDU4YzUxMGFiZjgxMmRkZmMyN2RmNmU4YzNmNWY1ZjVjN2VhZTU4MGNkYzEzNTk3OGYwMTY2NWUwMDNjMzAiKS5tYXAoc3YpLHd2PW12KHh2KSxNdj1uZXcgQXJyYXkoMykuY29uY2F0KCJhZjhkYzNmN2Y3Zjc3ZmJmN2IiLCI3YjMyOTRjMmE1Y2ZhNmRiYTAwMDg4MzciLCI3YjMyOTRjMmE1Y2ZmN2Y3ZjdhNmRiYTAwMDg4MzciLCI3NjJhODNhZjhkYzNlN2Q0ZThkOWYwZDM3ZmJmN2IxYjc4MzciLCI3NjJhODNhZjhkYzNlN2Q0ZThmN2Y3ZjdkOWYwZDM3ZmJmN2IxYjc4MzciLCI3NjJhODM5OTcwYWJjMmE1Y2ZlN2Q0ZThkOWYwZDNhNmRiYTA1YWFlNjExYjc4MzciLCI3NjJhODM5OTcwYWJjMmE1Y2ZlN2Q0ZThmN2Y3ZjdkOWYwZDNhNmRiYTA1YWFlNjExYjc4MzciLCI0MDAwNGI3NjJhODM5OTcwYWJjMmE1Y2ZlN2Q0ZThkOWYwZDNhNmRiYTA1YWFlNjExYjc4MzcwMDQ0MWIiLCI0MDAwNGI3NjJhODM5OTcwYWJjMmE1Y2ZlN2Q0ZThmN2Y3ZjdkOWYwZDNhNmRiYTA1YWFlNjExYjc4MzcwMDQ0MWIiKS5tYXAoc3YpLEF2PW12KE12KSxUdj1uZXcgQXJyYXkoMykuY29uY2F0KCJlOWEzYzlmN2Y3ZjdhMWQ3NmEiLCJkMDFjOGJmMWI2ZGFiOGUxODY0ZGFjMjYiLCJkMDFjOGJmMWI2ZGFmN2Y3ZjdiOGUxODY0ZGFjMjYiLCJjNTFiN2RlOWEzYzlmZGUwZWZlNmY1ZDBhMWQ3NmE0ZDkyMjEiLCJjNTFiN2RlOWEzYzlmZGUwZWZmN2Y3ZjdlNmY1ZDBhMWQ3NmE0ZDkyMjEiLCJjNTFiN2RkZTc3YWVmMWI2ZGFmZGUwZWZlNmY1ZDBiOGUxODY3ZmJjNDE0ZDkyMjEiLCJjNTFiN2RkZTc3YWVmMWI2ZGFmZGUwZWZmN2Y3ZjdlNmY1ZDBiOGUxODY3ZmJjNDE0ZDkyMjEiLCI4ZTAxNTJjNTFiN2RkZTc3YWVmMWI2ZGFmZGUwZWZlNmY1ZDBiOGUxODY3ZmJjNDE0ZDkyMjEyNzY0MTkiLCI4ZTAxNTJjNTFiN2RkZTc3YWVmMWI2ZGFmZGUwZWZmN2Y3ZjdlNmY1ZDBiOGUxODY3ZmJjNDE0ZDkyMjEyNzY0MTkiKS5tYXAoc3YpLE52PW12KFR2KSxTdj1uZXcgQXJyYXkoMykuY29uY2F0KCI5OThlYzNmN2Y3ZjdmMWEzNDAiLCI1ZTNjOTliMmFiZDJmZGI4NjNlNjYxMDEiLCI1ZTNjOTliMmFiZDJmN2Y3ZjdmZGI4NjNlNjYxMDEiLCI1NDI3ODg5OThlYzNkOGRhZWJmZWUwYjZmMWEzNDBiMzU4MDYiLCI1NDI3ODg5OThlYzNkOGRhZWJmN2Y3ZjdmZWUwYjZmMWEzNDBiMzU4MDYiLCI1NDI3ODg4MDczYWNiMmFiZDJkOGRhZWJmZWUwYjZmZGI4NjNlMDgyMTRiMzU4MDYiLCI1NDI3ODg4MDczYWNiMmFiZDJkOGRhZWJmN2Y3ZjdmZWUwYjZmZGI4NjNlMDgyMTRiMzU4MDYiLCIyZDAwNGI1NDI3ODg4MDczYWNiMmFiZDJkOGRhZWJmZWUwYjZmZGI4NjNlMDgyMTRiMzU4MDY3ZjNiMDgiLCIyZDAwNGI1NDI3ODg4MDczYWNiMmFiZDJkOGRhZWJmN2Y3ZjdmZWUwYjZmZGI4NjNlMDgyMTRiMzU4MDY3ZjNiMDgiKS5tYXAoc3YpLEV2PW12KFN2KSxrdj1uZXcgQXJyYXkoMykuY29uY2F0KCJlZjhhNjJmN2Y3Zjc2N2E5Y2YiLCJjYTAwMjBmNGE1ODI5MmM1ZGUwNTcxYjAiLCJjYTAwMjBmNGE1ODJmN2Y3Zjc5MmM1ZGUwNTcxYjAiLCJiMjE4MmJlZjhhNjJmZGRiYzdkMWU1ZjA2N2E5Y2YyMTY2YWMiLCJiMjE4MmJlZjhhNjJmZGRiYzdmN2Y3ZjdkMWU1ZjA2N2E5Y2YyMTY2YWMiLCJiMjE4MmJkNjYwNGRmNGE1ODJmZGRiYzdkMWU1ZjA5MmM1ZGU0MzkzYzMyMTY2YWMiLCJiMjE4MmJkNjYwNGRmNGE1ODJmZGRiYzdmN2Y3ZjdkMWU1ZjA5MmM1ZGU0MzkzYzMyMTY2YWMiLCI2NzAwMWZiMjE4MmJkNjYwNGRmNGE1ODJmZGRiYzdkMWU1ZjA5MmM1ZGU0MzkzYzMyMTY2YWMwNTMwNjEiLCI2NzAwMWZiMjE4MmJkNjYwNGRmNGE1ODJmZGRiYzdmN2Y3ZjdkMWU1ZjA5MmM1ZGU0MzkzYzMyMTY2YWMwNTMwNjEiKS5tYXAoc3YpLEN2PW12KGt2KSxQdj1uZXcgQXJyYXkoMykuY29uY2F0KCJlZjhhNjJmZmZmZmY5OTk5OTkiLCJjYTAwMjBmNGE1ODJiYWJhYmE0MDQwNDAiLCJjYTAwMjBmNGE1ODJmZmZmZmZiYWJhYmE0MDQwNDAiLCJiMjE4MmJlZjhhNjJmZGRiYzdlMGUwZTA5OTk5OTk0ZDRkNGQiLCJiMjE4MmJlZjhhNjJmZGRiYzdmZmZmZmZlMGUwZTA5OTk5OTk0ZDRkNGQiLCJiMjE4MmJkNjYwNGRmNGE1ODJmZGRiYzdlMGUwZTBiYWJhYmE4Nzg3ODc0ZDRkNGQiLCJiMjE4MmJkNjYwNGRmNGE1ODJmZGRiYzdmZmZmZmZlMGUwZTBiYWJhYmE4Nzg3ODc0ZDRkNGQiLCI2NzAwMWZiMjE4MmJkNjYwNGRmNGE1ODJmZGRiYzdlMGUwZTBiYWJhYmE4Nzg3ODc0ZDRkNGQxYTFhMWEiLCI2NzAwMWZiMjE4MmJkNjYwNGRmNGE1ODJmZGRiYzdmZmZmZmZlMGUwZTBiYWJhYmE4Nzg3ODc0ZDRkNGQxYTFhMWEiKS5tYXAoc3YpLHp2PW12KFB2KSxSdj1uZXcgQXJyYXkoMykuY29uY2F0KCJmYzhkNTlmZmZmYmY5MWJmZGIiLCJkNzE5MWNmZGFlNjFhYmQ5ZTkyYzdiYjYiLCJkNzE5MWNmZGFlNjFmZmZmYmZhYmQ5ZTkyYzdiYjYiLCJkNzMwMjdmYzhkNTlmZWUwOTBlMGYzZjg5MWJmZGI0NTc1YjQiLCJkNzMwMjdmYzhkNTlmZWUwOTBmZmZmYmZlMGYzZjg5MWJmZGI0NTc1YjQiLCJkNzMwMjdmNDZkNDNmZGFlNjFmZWUwOTBlMGYzZjhhYmQ5ZTk3NGFkZDE0NTc1YjQiLCJkNzMwMjdmNDZkNDNmZGFlNjFmZWUwOTBmZmZmYmZlMGYzZjhhYmQ5ZTk3NGFkZDE0NTc1YjQiLCJhNTAwMjZkNzMwMjdmNDZkNDNmZGFlNjFmZWUwOTBlMGYzZjhhYmQ5ZTk3NGFkZDE0NTc1YjQzMTM2OTUiLCJhNTAwMjZkNzMwMjdmNDZkNDNmZGFlNjFmZWUwOTBmZmZmYmZlMGYzZjhhYmQ5ZTk3NGFkZDE0NTc1YjQzMTM2OTUiKS5tYXAoc3YpLEx2PW12KFJ2KSxEdj1uZXcgQXJyYXkoMykuY29uY2F0KCJmYzhkNTlmZmZmYmY5MWNmNjAiLCJkNzE5MWNmZGFlNjFhNmQ5NmExYTk2NDEiLCJkNzE5MWNmZGFlNjFmZmZmYmZhNmQ5NmExYTk2NDEiLCJkNzMwMjdmYzhkNTlmZWUwOGJkOWVmOGI5MWNmNjAxYTk4NTAiLCJkNzMwMjdmYzhkNTlmZWUwOGJmZmZmYmZkOWVmOGI5MWNmNjAxYTk4NTAiLCJkNzMwMjdmNDZkNDNmZGFlNjFmZWUwOGJkOWVmOGJhNmQ5NmE2NmJkNjMxYTk4NTAiLCJkNzMwMjdmNDZkNDNmZGFlNjFmZWUwOGJmZmZmYmZkOWVmOGJhNmQ5NmE2NmJkNjMxYTk4NTAiLCJhNTAwMjZkNzMwMjdmNDZkNDNmZGFlNjFmZWUwOGJkOWVmOGJhNmQ5NmE2NmJkNjMxYTk4NTAwMDY4MzciLCJhNTAwMjZkNzMwMjdmNDZkNDNmZGFlNjFmZWUwOGJmZmZmYmZkOWVmOGJhNmQ5NmE2NmJkNjMxYTk4NTAwMDY4MzciKS5tYXAoc3YpLFV2PW12KER2KSxxdj1uZXcgQXJyYXkoMykuY29uY2F0KCJmYzhkNTlmZmZmYmY5OWQ1OTQiLCJkNzE5MWNmZGFlNjFhYmRkYTQyYjgzYmEiLCJkNzE5MWNmZGFlNjFmZmZmYmZhYmRkYTQyYjgzYmEiLCJkNTNlNGZmYzhkNTlmZWUwOGJlNmY1OTg5OWQ1OTQzMjg4YmQiLCJkNTNlNGZmYzhkNTlmZWUwOGJmZmZmYmZlNmY1OTg5OWQ1OTQzMjg4YmQiLCJkNTNlNGZmNDZkNDNmZGFlNjFmZWUwOGJlNmY1OThhYmRkYTQ2NmMyYTUzMjg4YmQiLCJkNTNlNGZmNDZkNDNmZGFlNjFmZWUwOGJmZmZmYmZlNmY1OThhYmRkYTQ2NmMyYTUzMjg4YmQiLCI5ZTAxNDJkNTNlNGZmNDZkNDNmZGFlNjFmZWUwOGJlNmY1OThhYmRkYTQ2NmMyYTUzMjg4YmQ1ZTRmYTIiLCI5ZTAxNDJkNTNlNGZmNDZkNDNmZGFlNjFmZWUwOGJmZmZmYmZlNmY1OThhYmRkYTQ2NmMyYTUzMjg4YmQ1ZTRmYTIiKS5tYXAoc3YpLE92PW12KHF2KSxZdj1uZXcgQXJyYXkoMykuY29uY2F0KCJlNWY1Zjk5OWQ4YzkyY2EyNWYiLCJlZGY4ZmJiMmUyZTI2NmMyYTQyMzhiNDUiLCJlZGY4ZmJiMmUyZTI2NmMyYTQyY2EyNWYwMDZkMmMiLCJlZGY4ZmJjY2VjZTY5OWQ4Yzk2NmMyYTQyY2EyNWYwMDZkMmMiLCJlZGY4ZmJjY2VjZTY5OWQ4Yzk2NmMyYTQ0MWFlNzYyMzhiNDUwMDU4MjQiLCJmN2ZjZmRlNWY1ZjljY2VjZTY5OWQ4Yzk2NmMyYTQ0MWFlNzYyMzhiNDUwMDU4MjQiLCJmN2ZjZmRlNWY1ZjljY2VjZTY5OWQ4Yzk2NmMyYTQ0MWFlNzYyMzhiNDUwMDZkMmMwMDQ0MWIiKS5tYXAoc3YpLEJ2PW12KFl2KSxGdj1uZXcgQXJyYXkoMykuY29uY2F0KCJlMGVjZjQ5ZWJjZGE4ODU2YTciLCJlZGY4ZmJiM2NkZTM4Yzk2YzY4ODQxOWQiLCJlZGY4ZmJiM2NkZTM4Yzk2YzY4ODU2YTc4MTBmN2MiLCJlZGY4ZmJiZmQzZTY5ZWJjZGE4Yzk2YzY4ODU2YTc4MTBmN2MiLCJlZGY4ZmJiZmQzZTY5ZWJjZGE4Yzk2YzY4YzZiYjE4ODQxOWQ2ZTAxNmIiLCJmN2ZjZmRlMGVjZjRiZmQzZTY5ZWJjZGE4Yzk2YzY4YzZiYjE4ODQxOWQ2ZTAxNmIiLCJmN2ZjZmRlMGVjZjRiZmQzZTY5ZWJjZGE4Yzk2YzY4YzZiYjE4ODQxOWQ4MTBmN2M0ZDAwNGIiKS5tYXAoc3YpLEl2PW12KEZ2KSxIdj1uZXcgQXJyYXkoMykuY29uY2F0KCJlMGYzZGJhOGRkYjU0M2EyY2EiLCJmMGY5ZThiYWU0YmM3YmNjYzQyYjhjYmUiLCJmMGY5ZThiYWU0YmM3YmNjYzQ0M2EyY2EwODY4YWMiLCJmMGY5ZThjY2ViYzVhOGRkYjU3YmNjYzQ0M2EyY2EwODY4YWMiLCJmMGY5ZThjY2ViYzVhOGRkYjU3YmNjYzQ0ZWIzZDMyYjhjYmUwODU4OWUiLCJmN2ZjZjBlMGYzZGJjY2ViYzVhOGRkYjU3YmNjYzQ0ZWIzZDMyYjhjYmUwODU4OWUiLCJmN2ZjZjBlMGYzZGJjY2ViYzVhOGRkYjU3YmNjYzQ0ZWIzZDMyYjhjYmUwODY4YWMwODQwODEiKS5tYXAoc3YpLGp2PW12KEh2KSxYdj1uZXcgQXJyYXkoMykuY29uY2F0KCJmZWU4YzhmZGJiODRlMzRhMzMiLCJmZWYwZDlmZGNjOGFmYzhkNTlkNzMwMWYiLCJmZWYwZDlmZGNjOGFmYzhkNTllMzRhMzNiMzAwMDAiLCJmZWYwZDlmZGQ0OWVmZGJiODRmYzhkNTllMzRhMzNiMzAwMDAiLCJmZWYwZDlmZGQ0OWVmZGJiODRmYzhkNTllZjY1NDhkNzMwMWY5OTAwMDAiLCJmZmY3ZWNmZWU4YzhmZGQ0OWVmZGJiODRmYzhkNTllZjY1NDhkNzMwMWY5OTAwMDAiLCJmZmY3ZWNmZWU4YzhmZGQ0OWVmZGJiODRmYzhkNTllZjY1NDhkNzMwMWZiMzAwMDA3ZjAwMDAiKS5tYXAoc3YpLEd2PW12KFh2KSxWdj1uZXcgQXJyYXkoMykuY29uY2F0KCJlY2UyZjBhNmJkZGIxYzkwOTkiLCJmNmVmZjdiZGM5ZTE2N2E5Y2YwMjgxOGEiLCJmNmVmZjdiZGM5ZTE2N2E5Y2YxYzkwOTkwMTZjNTkiLCJmNmVmZjdkMGQxZTZhNmJkZGI2N2E5Y2YxYzkwOTkwMTZjNTkiLCJmNmVmZjdkMGQxZTZhNmJkZGI2N2E5Y2YzNjkwYzAwMjgxOGEwMTY0NTAiLCJmZmY3ZmJlY2UyZjBkMGQxZTZhNmJkZGI2N2E5Y2YzNjkwYzAwMjgxOGEwMTY0NTAiLCJmZmY3ZmJlY2UyZjBkMGQxZTZhNmJkZGI2N2E5Y2YzNjkwYzAwMjgxOGEwMTZjNTkwMTQ2MzYiKS5tYXAoc3YpLCR2PW12KFZ2KSxXdj1uZXcgQXJyYXkoMykuY29uY2F0KCJlY2U3ZjJhNmJkZGIyYjhjYmUiLCJmMWVlZjZiZGM5ZTE3NGE5Y2YwNTcwYjAiLCJmMWVlZjZiZGM5ZTE3NGE5Y2YyYjhjYmUwNDVhOGQiLCJmMWVlZjZkMGQxZTZhNmJkZGI3NGE5Y2YyYjhjYmUwNDVhOGQiLCJmMWVlZjZkMGQxZTZhNmJkZGI3NGE5Y2YzNjkwYzAwNTcwYjAwMzRlN2IiLCJmZmY3ZmJlY2U3ZjJkMGQxZTZhNmJkZGI3NGE5Y2YzNjkwYzAwNTcwYjAwMzRlN2IiLCJmZmY3ZmJlY2U3ZjJkMGQxZTZhNmJkZGI3NGE5Y2YzNjkwYzAwNTcwYjAwNDVhOGQwMjM4NTgiKS5tYXAoc3YpLFp2PW12KFd2KSxRdj1uZXcgQXJyYXkoMykuY29uY2F0KCJlN2UxZWZjOTk0YzdkZDFjNzciLCJmMWVlZjZkN2I1ZDhkZjY1YjBjZTEyNTYiLCJmMWVlZjZkN2I1ZDhkZjY1YjBkZDFjNzc5ODAwNDMiLCJmMWVlZjZkNGI5ZGFjOTk0YzdkZjY1YjBkZDFjNzc5ODAwNDMiLCJmMWVlZjZkNGI5ZGFjOTk0YzdkZjY1YjBlNzI5OGFjZTEyNTY5MTAwM2YiLCJmN2Y0ZjllN2UxZWZkNGI5ZGFjOTk0YzdkZjY1YjBlNzI5OGFjZTEyNTY5MTAwM2YiLCJmN2Y0ZjllN2UxZWZkNGI5ZGFjOTk0YzdkZjY1YjBlNzI5OGFjZTEyNTY5ODAwNDM2NzAwMWYiKS5tYXAoc3YpLEp2PW12KFF2KSxLdj1uZXcgQXJyYXkoMykuY29uY2F0KCJmZGUwZGRmYTlmYjVjNTFiOGEiLCJmZWViZTJmYmI0YjlmNzY4YTFhZTAxN2UiLCJmZWViZTJmYmI0YjlmNzY4YTFjNTFiOGE3YTAxNzciLCJmZWViZTJmY2M1YzBmYTlmYjVmNzY4YTFjNTFiOGE3YTAxNzciLCJmZWViZTJmY2M1YzBmYTlmYjVmNzY4YTFkZDM0OTdhZTAxN2U3YTAxNzciLCJmZmY3ZjNmZGUwZGRmY2M1YzBmYTlmYjVmNzY4YTFkZDM0OTdhZTAxN2U3YTAxNzciLCJmZmY3ZjNmZGUwZGRmY2M1YzBmYTlmYjVmNzY4YTFkZDM0OTdhZTAxN2U3YTAxNzc0OTAwNmEiKS5tYXAoc3YpLHRnPW12KEt2KSxuZz1uZXcgQXJyYXkoMykuY29uY2F0KCJlZGY4YjE3ZmNkYmIyYzdmYjgiLCJmZmZmY2NhMWRhYjQ0MWI2YzQyMjVlYTgiLCJmZmZmY2NhMWRhYjQ0MWI2YzQyYzdmYjgyNTM0OTQiLCJmZmZmY2NjN2U5YjQ3ZmNkYmI0MWI2YzQyYzdmYjgyNTM0OTQiLCJmZmZmY2NjN2U5YjQ3ZmNkYmI0MWI2YzQxZDkxYzAyMjVlYTgwYzJjODQiLCJmZmZmZDllZGY4YjFjN2U5YjQ3ZmNkYmI0MWI2YzQxZDkxYzAyMjVlYTgwYzJjODQiLCJmZmZmZDllZGY4YjFjN2U5YjQ3ZmNkYmI0MWI2YzQxZDkxYzAyMjVlYTgyNTM0OTQwODFkNTgiKS5tYXAoc3YpLGVnPW12KG5nKSxyZz1uZXcgQXJyYXkoMykuY29uY2F0KCJmN2ZjYjlhZGRkOGUzMWEzNTQiLCJmZmZmY2NjMmU2OTk3OGM2NzkyMzg0NDMiLCJmZmZmY2NjMmU2OTk3OGM2NzkzMWEzNTQwMDY4MzciLCJmZmZmY2NkOWYwYTNhZGRkOGU3OGM2NzkzMWEzNTQwMDY4MzciLCJmZmZmY2NkOWYwYTNhZGRkOGU3OGM2Nzk0MWFiNWQyMzg0NDMwMDVhMzIiLCJmZmZmZTVmN2ZjYjlkOWYwYTNhZGRkOGU3OGM2Nzk0MWFiNWQyMzg0NDMwMDVhMzIiLCJmZmZmZTVmN2ZjYjlkOWYwYTNhZGRkOGU3OGM2Nzk0MWFiNWQyMzg0NDMwMDY4MzcwMDQ1MjkiKS5tYXAoc3YpLGlnPW12KHJnKSxvZz1uZXcgQXJyYXkoMykuY29uY2F0KCJmZmY3YmNmZWM0NGZkOTVmMGUiLCJmZmZmZDRmZWQ5OGVmZTk5MjljYzRjMDIiLCJmZmZmZDRmZWQ5OGVmZTk5MjlkOTVmMGU5OTM0MDQiLCJmZmZmZDRmZWUzOTFmZWM0NGZmZTk5MjlkOTVmMGU5OTM0MDQiLCJmZmZmZDRmZWUzOTFmZWM0NGZmZTk5MjllYzcwMTRjYzRjMDI4YzJkMDQiLCJmZmZmZTVmZmY3YmNmZWUzOTFmZWM0NGZmZTk5MjllYzcwMTRjYzRjMDI4YzJkMDQiLCJmZmZmZTVmZmY3YmNmZWUzOTFmZWM0NGZmZTk5MjllYzcwMTRjYzRjMDI5OTM0MDQ2NjI1MDYiKS5tYXAoc3YpLGFnPW12KG9nKSx1Zz1uZXcgQXJyYXkoMykuY29uY2F0KCJmZmVkYTBmZWIyNGNmMDNiMjAiLCJmZmZmYjJmZWNjNWNmZDhkM2NlMzFhMWMiLCJmZmZmYjJmZWNjNWNmZDhkM2NmMDNiMjBiZDAwMjYiLCJmZmZmYjJmZWQ5NzZmZWIyNGNmZDhkM2NmMDNiMjBiZDAwMjYiLCJmZmZmYjJmZWQ5NzZmZWIyNGNmZDhkM2NmYzRlMmFlMzFhMWNiMTAwMjYiLCJmZmZmY2NmZmVkYTBmZWQ5NzZmZWIyNGNmZDhkM2NmYzRlMmFlMzFhMWNiMTAwMjYiLCJmZmZmY2NmZmVkYTBmZWQ5NzZmZWIyNGNmZDhkM2NmYzRlMmFlMzFhMWNiZDAwMjY4MDAwMjYiKS5tYXAoc3YpLGZnPW12KHVnKSxjZz1uZXcgQXJyYXkoMykuY29uY2F0KCJkZWViZjc5ZWNhZTEzMTgyYmQiLCJlZmYzZmZiZGQ3ZTc2YmFlZDYyMTcxYjUiLCJlZmYzZmZiZGQ3ZTc2YmFlZDYzMTgyYmQwODUxOWMiLCJlZmYzZmZjNmRiZWY5ZWNhZTE2YmFlZDYzMTgyYmQwODUxOWMiLCJlZmYzZmZjNmRiZWY5ZWNhZTE2YmFlZDY0MjkyYzYyMTcxYjUwODQ1OTQiLCJmN2ZiZmZkZWViZjdjNmRiZWY5ZWNhZTE2YmFlZDY0MjkyYzYyMTcxYjUwODQ1OTQiLCJmN2ZiZmZkZWViZjdjNmRiZWY5ZWNhZTE2YmFlZDY0MjkyYzYyMTcxYjUwODUxOWMwODMwNmIiKS5tYXAoc3YpLHNnPW12KGNnKSxsZz1uZXcgQXJyYXkoMykuY29uY2F0KCJlNWY1ZTBhMWQ5OWIzMWEzNTQiLCJlZGY4ZTliYWU0YjM3NGM0NzYyMzhiNDUiLCJlZGY4ZTliYWU0YjM3NGM0NzYzMWEzNTQwMDZkMmMiLCJlZGY4ZTljN2U5YzBhMWQ5OWI3NGM0NzYzMWEzNTQwMDZkMmMiLCJlZGY4ZTljN2U5YzBhMWQ5OWI3NGM0NzY0MWFiNWQyMzhiNDUwMDVhMzIiLCJmN2ZjZjVlNWY1ZTBjN2U5YzBhMWQ5OWI3NGM0NzY0MWFiNWQyMzhiNDUwMDVhMzIiLCJmN2ZjZjVlNWY1ZTBjN2U5YzBhMWQ5OWI3NGM0NzY0MWFiNWQyMzhiNDUwMDZkMmMwMDQ0MWIiKS5tYXAoc3YpLGhnPW12KGxnKSxkZz1uZXcgQXJyYXkoMykuY29uY2F0KCJmMGYwZjBiZGJkYmQ2MzYzNjMiLCJmN2Y3ZjdjY2NjY2M5Njk2OTY1MjUyNTIiLCJmN2Y3ZjdjY2NjY2M5Njk2OTY2MzYzNjMyNTI1MjUiLCJmN2Y3ZjdkOWQ5ZDliZGJkYmQ5Njk2OTY2MzYzNjMyNTI1MjUiLCJmN2Y3ZjdkOWQ5ZDliZGJkYmQ5Njk2OTY3MzczNzM1MjUyNTIyNTI1MjUiLCJmZmZmZmZmMGYwZjBkOWQ5ZDliZGJkYmQ5Njk2OTY3MzczNzM1MjUyNTIyNTI1MjUiLCJmZmZmZmZmMGYwZjBkOWQ5ZDliZGJkYmQ5Njk2OTY3MzczNzM1MjUyNTIyNTI1MjUwMDAwMDAiKS5tYXAoc3YpLHBnPW12KGRnKSx2Zz1uZXcgQXJyYXkoMykuY29uY2F0KCJlZmVkZjViY2JkZGM3NTZiYjEiLCJmMmYwZjdjYmM5ZTI5ZTlhYzg2YTUxYTMiLCJmMmYwZjdjYmM5ZTI5ZTlhYzg3NTZiYjE1NDI3OGYiLCJmMmYwZjdkYWRhZWJiY2JkZGM5ZTlhYzg3NTZiYjE1NDI3OGYiLCJmMmYwZjdkYWRhZWJiY2JkZGM5ZTlhYzg4MDdkYmE2YTUxYTM0YTE0ODYiLCJmY2ZiZmRlZmVkZjVkYWRhZWJiY2JkZGM5ZTlhYzg4MDdkYmE2YTUxYTM0YTE0ODYiLCJmY2ZiZmRlZmVkZjVkYWRhZWJiY2JkZGM5ZTlhYzg4MDdkYmE2YTUxYTM1NDI3OGYzZjAwN2QiKS5tYXAoc3YpLGdnPW12KHZnKSx5Zz1uZXcgQXJyYXkoMykuY29uY2F0KCJmZWUwZDJmYzkyNzJkZTJkMjYiLCJmZWU1ZDlmY2FlOTFmYjZhNGFjYjE4MWQiLCJmZWU1ZDlmY2FlOTFmYjZhNGFkZTJkMjZhNTBmMTUiLCJmZWU1ZDlmY2JiYTFmYzkyNzJmYjZhNGFkZTJkMjZhNTBmMTUiLCJmZWU1ZDlmY2JiYTFmYzkyNzJmYjZhNGFlZjNiMmNjYjE4MWQ5OTAwMGQiLCJmZmY1ZjBmZWUwZDJmY2JiYTFmYzkyNzJmYjZhNGFlZjNiMmNjYjE4MWQ5OTAwMGQiLCJmZmY1ZjBmZWUwZDJmY2JiYTFmYzkyNzJmYjZhNGFlZjNiMmNjYjE4MWRhNTBmMTU2NzAwMGQiKS5tYXAoc3YpLF9nPW12KHlnKSxiZz1uZXcgQXJyYXkoMykuY29uY2F0KCJmZWU2Y2VmZGFlNmJlNjU1MGQiLCJmZWVkZGVmZGJlODVmZDhkM2NkOTQ3MDEiLCJmZWVkZGVmZGJlODVmZDhkM2NlNjU1MGRhNjM2MDMiLCJmZWVkZGVmZGQwYTJmZGFlNmJmZDhkM2NlNjU1MGRhNjM2MDMiLCJmZWVkZGVmZGQwYTJmZGFlNmJmZDhkM2NmMTY5MTNkOTQ4MDE4YzJkMDQiLCJmZmY1ZWJmZWU2Y2VmZGQwYTJmZGFlNmJmZDhkM2NmMTY5MTNkOTQ4MDE4YzJkMDQiLCJmZmY1ZWJmZWU2Y2VmZGQwYTJmZGFlNmJmZDhkM2NmMTY5MTNkOTQ4MDFhNjM2MDM3ZjI3MDQiKS5tYXAoc3YpLG1nPW12KGJnKSx4Zz1HZShLbigzMDAsLjUsMCksS24oLTI0MCwuNSwxKSksd2c9R2UoS24oLTEwMCwuNzUsLjM1KSxLbig4MCwxLjUsLjgpKSxNZz1HZShLbigyNjAsLjc1LC4zNSksS24oODAsMS41LC44KSksQWc9S24oKTt2YXIgVGc9Ym4oKSxOZz1NYXRoLlBJLzMsU2c9MipNYXRoLlBJLzM7ZnVuY3Rpb24gRWcodCl7dmFyIG49dC5sZW5ndGg7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiB0W01hdGgubWF4KDAsTWF0aC5taW4obi0xLE1hdGguZmxvb3IoZSpuKSkpXX19dmFyIGtnPUVnKHN2KCI0NDAxNTQ0NDAyNTY0NTA0NTc0NTA1NTk0NjA3NWE0NjA4NWM0NjBhNWQ0NjBiNWU0NzBkNjA0NzBlNjE0NzEwNjM0NzExNjQ0NzEzNjU0ODE0Njc0ODE2Njg0ODE3Njk0ODE4NmE0ODFhNmM0ODFiNmQ0ODFjNmU0ODFkNmY0ODFmNzA0ODIwNzE0ODIxNzM0ODIzNzQ0ODI0NzU0ODI1NzY0ODI2Nzc0ODI4Nzg0ODI5Nzk0NzJhN2E0NzJjN2E0NzJkN2I0NzJlN2M0NzJmN2Q0NjMwN2U0NjMyN2U0NjMzN2Y0NjM0ODA0NTM1ODE0NTM3ODE0NTM4ODI0NDM5ODM0NDNhODM0NDNiODQ0MzNkODQ0MzNlODU0MjNmODU0MjQwODY0MjQxODY0MTQyODc0MTQ0ODc0MDQ1ODg0MDQ2ODgzZjQ3ODgzZjQ4ODkzZTQ5ODkzZTRhODkzZTRjOGEzZDRkOGEzZDRlOGEzYzRmOGEzYzUwOGIzYjUxOGIzYjUyOGIzYTUzOGIzYTU0OGMzOTU1OGMzOTU2OGMzODU4OGMzODU5OGMzNzVhOGMzNzViOGQzNjVjOGQzNjVkOGQzNTVlOGQzNTVmOGQzNDYwOGQzNDYxOGQzMzYyOGQzMzYzOGQzMjY0OGUzMjY1OGUzMTY2OGUzMTY3OGUzMTY4OGUzMDY5OGUzMDZhOGUyZjZiOGUyZjZjOGUyZTZkOGUyZTZlOGUyZTZmOGUyZDcwOGUyZDcxOGUyYzcxOGUyYzcyOGUyYzczOGUyYjc0OGUyYjc1OGUyYTc2OGUyYTc3OGUyYTc4OGUyOTc5OGUyOTdhOGUyOTdiOGUyODdjOGUyODdkOGUyNzdlOGUyNzdmOGUyNzgwOGUyNjgxOGUyNjgyOGUyNjgyOGUyNTgzOGUyNTg0OGUyNTg1OGUyNDg2OGUyNDg3OGUyMzg4OGUyMzg5OGUyMzhhOGQyMjhiOGQyMjhjOGQyMjhkOGQyMThlOGQyMThmOGQyMTkwOGQyMTkxOGMyMDkyOGMyMDkyOGMyMDkzOGMxZjk0OGMxZjk1OGIxZjk2OGIxZjk3OGIxZjk4OGIxZjk5OGExZjlhOGExZTliOGExZTljODkxZTlkODkxZjllODkxZjlmODgxZmEwODgxZmExODgxZmExODcxZmEyODcyMGEzODYyMGE0ODYyMWE1ODUyMWE2ODUyMmE3ODUyMmE4ODQyM2E5ODMyNGFhODMyNWFiODIyNWFjODIyNmFkODEyN2FkODEyOGFlODAyOWFmN2YyYWIwN2YyY2IxN2UyZGIyN2QyZWIzN2MyZmI0N2MzMWI1N2IzMmI2N2EzNGI2NzkzNWI3NzkzN2I4NzgzOGI5NzczYWJhNzYzYmJiNzUzZGJjNzQzZmJjNzM0MGJkNzI0MmJlNzE0NGJmNzA0NmMwNmY0OGMxNmU0YWMxNmQ0Y2MyNmM0ZWMzNmI1MGM0NmE1MmM1Njk1NGM1Njg1NmM2Njc1OGM3NjU1YWM4NjQ1Y2M4NjM1ZWM5NjI2MGNhNjA2M2NiNWY2NWNiNWU2N2NjNWM2OWNkNWI2Y2NkNWE2ZWNlNTg3MGNmNTc3M2QwNTY3NWQwNTQ3N2QxNTM3YWQxNTE3Y2QyNTA3ZmQzNGU4MWQzNGQ4NGQ0NGI4NmQ1NDk4OWQ1NDg4YmQ2NDY4ZWQ2NDU5MGQ3NDM5M2Q3NDE5NWQ4NDA5OGQ4M2U5YmQ5M2M5ZGQ5M2JhMGRhMzlhMmRhMzdhNWRiMzZhOGRiMzRhYWRjMzJhZGRjMzBiMGRkMmZiMmRkMmRiNWRlMmJiOGRlMjliYWRlMjhiZGRmMjZjMGRmMjVjMmRmMjNjNWUwMjFjOGUwMjBjYWUxMWZjZGUxMWRkMGUxMWNkMmUyMWJkNWUyMWFkOGUyMTlkYWUzMTlkZGUzMThkZmUzMThlMmU0MThlNWU0MTllN2U0MTllYWU1MWFlY2U1MWJlZmU1MWNmMWU1MWRmNGU2MWVmNmU2MjBmOGU2MjFmYmU3MjNmZGU3MjUiKSksQ2c9RWcoc3YoIjAwMDAwNDAxMDAwNTAxMDEwNjAxMDEwODAyMDEwOTAyMDIwYjAyMDIwZDAzMDMwZjAzMDMxMjA0MDQxNDA1MDQxNjA2MDUxODA2MDUxYTA3MDYxYzA4MDcxZTA5MDcyMDBhMDgyMjBiMDkyNDBjMDkyNjBkMGEyOTBlMGIyYjEwMGIyZDExMGMyZjEyMGQzMTEzMGQzNDE0MGUzNjE1MGUzODE2MGYzYjE4MGYzZDE5MTAzZjFhMTA0MjFjMTA0NDFkMTE0NzFlMTE0OTIwMTE0YjIxMTE0ZTIyMTE1MDI0MTI1MzI1MTI1NTI3MTI1ODI5MTE1YTJhMTE1YzJjMTE1ZjJkMTE2MTJmMTE2MzMxMTE2NTMzMTA2NzM0MTA2OTM2MTA2YjM4MTA2YzM5MGY2ZTNiMGY3MDNkMGY3MTNmMGY3MjQwMGY3NDQyMGY3NTQ0MGY3NjQ1MTA3NzQ3MTA3ODQ5MTA3ODRhMTA3OTRjMTE3YTRlMTE3YjRmMTI3YjUxMTI3YzUyMTM3YzU0MTM3ZDU2MTQ3ZDU3MTU3ZTU5MTU3ZTVhMTY3ZTVjMTY3ZjVkMTc3ZjVmMTg3ZjYwMTg4MDYyMTk4MDY0MWE4MDY1MWE4MDY3MWI4MDY4MWM4MTZhMWM4MTZiMWQ4MTZkMWQ4MTZlMWU4MTcwMWY4MTcyMWY4MTczMjA4MTc1MjE4MTc2MjE4MTc4MjI4MTc5MjI4MjdiMjM4MjdjMjM4MjdlMjQ4MjgwMjU4MjgxMjU4MTgzMjY4MTg0MjY4MTg2Mjc4MTg4Mjc4MTg5Mjg4MThiMjk4MThjMjk4MThlMmE4MTkwMmE4MTkxMmI4MTkzMmI4MDk0MmM4MDk2MmM4MDk4MmQ4MDk5MmQ4MDliMmU3ZjljMmU3ZjllMmY3ZmEwMmY3ZmExMzA3ZWEzMzA3ZWE1MzE3ZWE2MzE3ZGE4MzI3ZGFhMzM3ZGFiMzM3Y2FkMzQ3Y2FlMzQ3YmIwMzU3YmIyMzU3YmIzMzY3YWI1MzY3YWI3Mzc3OWI4Mzc3OWJhMzg3OGJjMzk3OGJkMzk3N2JmM2E3N2MwM2E3NmMyM2I3NWM0M2M3NWM1M2M3NGM3M2Q3M2M4M2U3M2NhM2U3MmNjM2Y3MWNkNDA3MWNmNDA3MGQwNDE2ZmQyNDI2ZmQzNDM2ZWQ1NDQ2ZGQ2NDU2Y2Q4NDU2Y2Q5NDY2YmRiNDc2YWRjNDg2OWRlNDk2OGRmNGE2OGUwNGM2N2UyNGQ2NmUzNGU2NWU0NGY2NGU1NTA2NGU3NTI2M2U4NTM2MmU5NTQ2MmVhNTY2MWViNTc2MGVjNTg2MGVkNWE1ZmVlNWI1ZWVmNWQ1ZWYwNWY1ZWYxNjA1ZGYyNjI1ZGYyNjQ1Y2YzNjU1Y2Y0Njc1Y2Y0Njk1Y2Y1NmI1Y2Y2NmM1Y2Y2NmU1Y2Y3NzA1Y2Y3NzI1Y2Y4NzQ1Y2Y4NzY1Y2Y5Nzg1ZGY5Nzk1ZGY5N2I1ZGZhN2Q1ZWZhN2Y1ZWZhODE1ZmZiODM1ZmZiODU2MGZiODc2MWZjODk2MWZjOGE2MmZjOGM2M2ZjOGU2NGZjOTA2NWZkOTI2NmZkOTQ2N2ZkOTY2OGZkOTg2OWZkOWE2YWZkOWI2YmZlOWQ2Y2ZlOWY2ZGZlYTE2ZWZlYTM2ZmZlYTU3MWZlYTc3MmZlYTk3M2ZlYWE3NGZlYWM3NmZlYWU3N2ZlYjA3OGZlYjI3YWZlYjQ3YmZlYjY3Y2ZlYjc3ZWZlYjk3ZmZlYmI4MWZlYmQ4MmZlYmY4NGZlYzE4NWZlYzI4N2ZlYzQ4OGZlYzY4YWZlYzg4Y2ZlY2E4ZGZlY2M4ZmZlY2Q5MGZlY2Y5MmZlZDE5NGZlZDM5NWZlZDU5N2ZlZDc5OWZlZDg5YWZkZGE5Y2ZkZGM5ZWZkZGVhMGZkZTBhMWZkZTJhM2ZkZTNhNWZkZTVhN2ZkZTdhOWZkZTlhYWZkZWJhY2ZjZWNhZWZjZWViMGZjZjBiMmZjZjJiNGZjZjRiNmZjZjZiOGZjZjdiOWZjZjliYmZjZmJiZGZjZmRiZiIpKSxQZz1FZyhzdigiMDAwMDA0MDEwMDA1MDEwMTA2MDEwMTA4MDIwMTBhMDIwMjBjMDIwMjBlMDMwMjEwMDQwMzEyMDQwMzE0MDUwNDE3MDYwNDE5MDcwNTFiMDgwNTFkMDkwNjFmMGEwNzIyMGIwNzI0MGMwODI2MGQwODI5MGUwOTJiMTAwOTJkMTEwYTMwMTIwYTMyMTQwYjM0MTUwYjM3MTYwYjM5MTgwYzNjMTkwYzNlMWIwYzQxMWMwYzQzMWUwYzQ1MWYwYzQ4MjEwYzRhMjMwYzRjMjQwYzRmMjYwYzUxMjgwYjUzMjkwYjU1MmIwYjU3MmQwYjU5MmYwYTViMzEwYTVjMzIwYTVlMzQwYTVmMzYwOTYxMzgwOTYyMzkwOTYzM2IwOTY0M2QwOTY1M2UwOTY2NDAwYTY3NDIwYTY4NDQwYTY4NDUwYTY5NDcwYjZhNDkwYjZhNGEwYzZiNGMwYzZiNGQwZDZjNGYwZDZjNTEwZTZjNTIwZTZkNTQwZjZkNTUwZjZkNTcxMDZlNTkxMDZlNWExMTZlNWMxMjZlNWQxMjZlNWYxMzZlNjExMzZlNjIxNDZlNjQxNTZlNjUxNTZlNjcxNjZlNjkxNjZlNmExNzZlNmMxODZlNmQxODZlNmYxOTZlNzExOTZlNzIxYTZlNzQxYTZlNzUxYjZlNzcxYzZkNzgxYzZkN2ExZDZkN2MxZDZkN2QxZTZkN2YxZTZjODAxZjZjODIyMDZjODQyMDZiODUyMTZiODcyMTZiODgyMjZhOGEyMjZhOGMyMzY5OGQyMzY5OGYyNDY5OTAyNTY4OTIyNTY4OTMyNjY3OTUyNjY3OTcyNzY2OTgyNzY2OWEyODY1OWIyOTY0OWQyOTY0OWYyYTYzYTAyYTYzYTIyYjYyYTMyYzYxYTUyYzYwYTYyZDYwYTgyZTVmYTkyZTVlYWIyZjVlYWQzMDVkYWUzMDVjYjAzMTViYjEzMjVhYjMzMjVhYjQzMzU5YjYzNDU4YjczNTU3YjkzNTU2YmEzNjU1YmMzNzU0YmQzODUzYmYzOTUyYzAzYTUxYzEzYTUwYzMzYjRmYzQzYzRlYzYzZDRkYzczZTRjYzgzZjRiY2E0MDRhY2I0MTQ5Y2M0MjQ4Y2U0MzQ3Y2Y0NDQ2ZDA0NTQ1ZDI0NjQ0ZDM0NzQzZDQ0ODQyZDU0YTQxZDc0YjNmZDg0YzNlZDk0ZDNkZGE0ZTNjZGI1MDNiZGQ1MTNhZGU1MjM4ZGY1MzM3ZTA1NTM2ZTE1NjM1ZTI1NzM0ZTM1OTMzZTQ1YTMxZTU1YzMwZTY1ZDJmZTc1ZTJlZTg2MDJkZTk2MTJiZWE2MzJhZWI2NDI5ZWI2NjI4ZWM2NzI2ZWQ2OTI1ZWU2YTI0ZWY2YzIzZWY2ZTIxZjA2ZjIwZjE3MTFmZjE3MzFkZjI3NDFjZjM3NjFiZjM3ODE5ZjQ3OTE4ZjU3YjE3ZjU3ZDE1ZjY3ZTE0ZjY4MDEzZjc4MjEyZjc4NDEwZjg4NTBmZjg4NzBlZjg4OTBjZjk4YjBiZjk4YzBhZjk4ZTA5ZmE5MDA4ZmE5MjA3ZmE5NDA3ZmI5NjA2ZmI5NzA2ZmI5OTA2ZmI5YjA2ZmI5ZDA3ZmM5ZjA3ZmNhMTA4ZmNhMzA5ZmNhNTBhZmNhNjBjZmNhODBkZmNhYTBmZmNhYzExZmNhZTEyZmNiMDE0ZmNiMjE2ZmNiNDE4ZmJiNjFhZmJiODFkZmJiYTFmZmJiYzIxZmJiZTIzZmFjMDI2ZmFjMjI4ZmFjNDJhZmFjNjJkZjljNzJmZjljOTMyZjljYjM1ZjhjZDM3ZjhjZjNhZjdkMTNkZjdkMzQwZjZkNTQzZjZkNzQ2ZjVkOTQ5ZjVkYjRjZjRkZDRmZjRkZjUzZjRlMTU2ZjNlMzVhZjNlNTVkZjJlNjYxZjJlODY1ZjJlYTY5ZjFlYzZkZjFlZDcxZjFlZjc1ZjFmMTc5ZjJmMjdkZjJmNDgyZjNmNTg2ZjNmNjhhZjRmODhlZjVmOTkyZjZmYTk2ZjhmYjlhZjlmYzlkZmFmZGExZmNmZmE0IikpLHpnPUVnKHN2KCIwZDA4ODcxMDA3ODgxMzA3ODkxNjA3OGExOTA2OGMxYjA2OGQxZDA2OGUyMDA2OGYyMjA2OTAyNDA2OTEyNjA1OTEyODA1OTIyYTA1OTMyYzA1OTQyZTA1OTUyZjA1OTYzMTA1OTczMzA1OTczNTA0OTgzNzA0OTkzODA0OWEzYTA0OWEzYzA0OWIzZTA0OWMzZjA0OWM0MTA0OWQ0MzAzOWU0NDAzOWU0NjAzOWY0ODAzOWY0OTAzYTA0YjAzYTE0YzAyYTE0ZTAyYTI1MDAyYTI1MTAyYTM1MzAyYTM1NTAyYTQ1NjAxYTQ1ODAxYTQ1OTAxYTU1YjAxYTU1YzAxYTY1ZTAxYTY2MDAxYTY2MTAwYTc2MzAwYTc2NDAwYTc2NjAwYTc2NzAwYTg2OTAwYTg2YTAwYTg2YzAwYTg2ZTAwYTg2ZjAwYTg3MTAwYTg3MjAxYTg3NDAxYTg3NTAxYTg3NzAxYTg3ODAxYTg3YTAyYTg3YjAyYTg3ZDAzYTg3ZTAzYTg4MDA0YTg4MTA0YTc4MzA1YTc4NDA1YTc4NjA2YTY4NzA3YTY4ODA4YTY4YTA5YTU4YjBhYTU4ZDBiYTU4ZTBjYTQ4ZjBkYTQ5MTBlYTM5MjBmYTM5NDEwYTI5NTExYTE5NjEzYTE5ODE0YTA5OTE1OWY5YTE2OWY5YzE3OWU5ZDE4OWQ5ZTE5OWRhMDFhOWNhMTFiOWJhMjFkOWFhMzFlOWFhNTFmOTlhNjIwOThhNzIxOTdhODIyOTZhYTIzOTVhYjI0OTRhYzI2OTRhZDI3OTNhZTI4OTJiMDI5OTFiMTJhOTBiMjJiOGZiMzJjOGViNDJlOGRiNTJmOGNiNjMwOGJiNzMxOGFiODMyODliYTMzODhiYjM0ODhiYzM1ODdiZDM3ODZiZTM4ODViZjM5ODRjMDNhODNjMTNiODJjMjNjODFjMzNkODBjNDNlN2ZjNTQwN2VjNjQxN2RjNzQyN2NjODQzN2JjOTQ0N2FjYTQ1N2FjYjQ2NzljYzQ3NzhjYzQ5NzdjZDRhNzZjZTRiNzVjZjRjNzRkMDRkNzNkMTRlNzJkMjRmNzFkMzUxNzFkNDUyNzBkNTUzNmZkNTU0NmVkNjU1NmRkNzU2NmNkODU3NmJkOTU4NmFkYTVhNmFkYTViNjlkYjVjNjhkYzVkNjdkZDVlNjZkZTVmNjVkZTYxNjRkZjYyNjNlMDYzNjNlMTY0NjJlMjY1NjFlMjY2NjBlMzY4NWZlNDY5NWVlNTZhNWRlNTZiNWRlNjZjNWNlNzZlNWJlNzZmNWFlODcwNTllOTcxNThlOTcyNTdlYTc0NTdlYjc1NTZlYjc2NTVlYzc3NTRlZDc5NTNlZDdhNTJlZTdiNTFlZjdjNTFlZjdlNTBmMDdmNGZmMDgwNGVmMTgxNGRmMTgzNGNmMjg0NGJmMzg1NGJmMzg3NGFmNDg4NDlmNDg5NDhmNThiNDdmNThjNDZmNjhkNDVmNjhmNDRmNzkwNDRmNzkxNDNmNzkzNDJmODk0NDFmODk1NDBmOTk3M2ZmOTk4M2VmOTlhM2VmYTliM2RmYTljM2NmYTllM2JmYjlmM2FmYmExMzlmYmEyMzhmY2EzMzhmY2E1MzdmY2E2MzZmY2E4MzVmY2E5MzRmZGFiMzNmZGFjMzNmZGFlMzJmZGFmMzFmZGIxMzBmZGIyMmZmZGI0MmZmZGI1MmVmZWI3MmRmZWI4MmNmZWJhMmNmZWJiMmJmZWJkMmFmZWJlMmFmZWMwMjlmZGMyMjlmZGMzMjhmZGM1MjdmZGM2MjdmZGM4MjdmZGNhMjZmZGNiMjZmY2NkMjVmY2NlMjVmY2QwMjVmY2QyMjVmYmQzMjRmYmQ1MjRmYmQ3MjRmYWQ4MjRmYWRhMjRmOWRjMjRmOWRkMjVmOGRmMjVmOGUxMjVmN2UyMjVmN2U0MjVmNmU2MjZmNmU4MjZmNWU5MjZmNWViMjdmNGVkMjdmM2VlMjdmM2YwMjdmMmYyMjdmMWY0MjZmMWY1MjVmMGY3MjRmMGY5MjEiKSk7ZnVuY3Rpb24gUmcodCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fXZhciBMZz1NYXRoLmFicyxEZz1NYXRoLmF0YW4yLFVnPU1hdGguY29zLHFnPU1hdGgubWF4LE9nPU1hdGgubWluLFlnPU1hdGguc2luLEJnPU1hdGguc3FydCxGZz0xZS0xMixJZz1NYXRoLlBJLEhnPUlnLzIsamc9MipJZztmdW5jdGlvbiBYZyh0KXtyZXR1cm4gdD49MT9IZzp0PD0tMT8tSGc6TWF0aC5hc2luKHQpfWZ1bmN0aW9uIEdnKHQpe3JldHVybiB0LmlubmVyUmFkaXVzfWZ1bmN0aW9uIFZnKHQpe3JldHVybiB0Lm91dGVyUmFkaXVzfWZ1bmN0aW9uICRnKHQpe3JldHVybiB0LnN0YXJ0QW5nbGV9ZnVuY3Rpb24gV2codCl7cmV0dXJuIHQuZW5kQW5nbGV9ZnVuY3Rpb24gWmcodCl7cmV0dXJuIHQmJnQucGFkQW5nbGV9ZnVuY3Rpb24gUWcodCxuLGUscixpLG8sYSl7dmFyIHU9dC1lLGY9bi1yLGM9KGE/bzotbykvQmcodSp1K2YqZikscz1jKmYsbD0tYyp1LGg9dCtzLGQ9bitsLHA9ZStzLHY9citsLGc9KGgrcCkvMix5PShkK3YpLzIsXz1wLWgsYj12LWQsbT1fKl8rYipiLHg9aS1vLHc9aCp2LXAqZCxNPShiPDA/LTE6MSkqQmcocWcoMCx4KngqbS13KncpKSxBPSh3KmItXypNKS9tLFQ9KC13Kl8tYipNKS9tLE49KHcqYitfKk0pL20sUz0oLXcqXytiKk0pL20sRT1BLWcsaz1ULXksQz1OLWcsUD1TLXk7cmV0dXJuIEUqRStrKms+QypDK1AqUCYmKEE9TixUPVMpLHtjeDpBLGN5OlQseDAxOi1zLHkwMTotbCx4MTE6QSooaS94LTEpLHkxMTpUKihpL3gtMSl9fWZ1bmN0aW9uIEpnKHQpe3RoaXMuX2NvbnRleHQ9dH1mdW5jdGlvbiBLZyh0KXtyZXR1cm4gbmV3IEpnKHQpfWZ1bmN0aW9uIHR5KHQpe3JldHVybiB0WzBdfWZ1bmN0aW9uIG55KHQpe3JldHVybiB0WzFdfWZ1bmN0aW9uIGV5KCl7dmFyIHQ9dHksbj1ueSxlPVJnKCEwKSxyPW51bGwsaT1LZyxvPW51bGw7ZnVuY3Rpb24gYShhKXt2YXIgdSxmLGMscz1hLmxlbmd0aCxsPSExO2ZvcihudWxsPT1yJiYobz1pKGM9R2koKSkpLHU9MDt1PD1zOysrdSkhKHU8cyYmZShmPWFbdV0sdSxhKSk9PT1sJiYoKGw9IWwpP28ubGluZVN0YXJ0KCk6by5saW5lRW5kKCkpLGwmJm8ucG9pbnQoK3QoZix1LGEpLCtuKGYsdSxhKSk7aWYoYylyZXR1cm4gbz1udWxsLGMrIiJ8fG51bGx9cmV0dXJuIGEueD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOlJnKCtuKSxhKTp0fSxhLnk9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpSZygrdCksYSk6bn0sYS5kZWZpbmVkPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6UmcoISF0KSxhKTplfSxhLmN1cnZlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPXQsbnVsbCE9ciYmKG89aShyKSksYSk6aX0sYS5jb250ZXh0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhudWxsPT10P3I9bz1udWxsOm89aShyPXQpLGEpOnJ9LGF9ZnVuY3Rpb24gcnkoKXt2YXIgdD10eSxuPW51bGwsZT1SZygwKSxyPW55LGk9UmcoITApLG89bnVsbCxhPUtnLHU9bnVsbDtmdW5jdGlvbiBmKGYpe3ZhciBjLHMsbCxoLGQscD1mLmxlbmd0aCx2PSExLGc9bmV3IEFycmF5KHApLHk9bmV3IEFycmF5KHApO2ZvcihudWxsPT1vJiYodT1hKGQ9R2koKSkpLGM9MDtjPD1wOysrYyl7aWYoIShjPHAmJmkoaD1mW2NdLGMsZikpPT09dilpZih2PSF2KXM9Yyx1LmFyZWFTdGFydCgpLHUubGluZVN0YXJ0KCk7ZWxzZXtmb3IodS5saW5lRW5kKCksdS5saW5lU3RhcnQoKSxsPWMtMTtsPj1zOy0tbCl1LnBvaW50KGdbbF0seVtsXSk7dS5saW5lRW5kKCksdS5hcmVhRW5kKCl9diYmKGdbY109K3QoaCxjLGYpLHlbY109K2UoaCxjLGYpLHUucG9pbnQobj8rbihoLGMsZik6Z1tjXSxyPytyKGgsYyxmKTp5W2NdKSl9aWYoZClyZXR1cm4gdT1udWxsLGQrIiJ8fG51bGx9ZnVuY3Rpb24gYygpe3JldHVybiBleSgpLmRlZmluZWQoaSkuY3VydmUoYSkuY29udGV4dChvKX1yZXR1cm4gZi54PWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PSJmdW5jdGlvbiI9PXR5cGVvZiBlP2U6UmcoK2UpLG49bnVsbCxmKTp0fSxmLngwPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PSJmdW5jdGlvbiI9PXR5cGVvZiBuP246UmcoK24pLGYpOnR9LGYueDE9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49bnVsbD09dD9udWxsOiJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6UmcoK3QpLGYpOm59LGYueT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlJnKCt0KSxyPW51bGwsZik6ZX0sZi55MD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlJnKCt0KSxmKTplfSxmLnkxPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPW51bGw9PXQ/bnVsbDoiZnVuY3Rpb24iPT10eXBlb2YgdD90OlJnKCt0KSxmKTpyfSxmLmxpbmVYMD1mLmxpbmVZMD1mdW5jdGlvbigpe3JldHVybiBjKCkueCh0KS55KGUpfSxmLmxpbmVZMT1mdW5jdGlvbigpe3JldHVybiBjKCkueCh0KS55KHIpfSxmLmxpbmVYMT1mdW5jdGlvbigpe3JldHVybiBjKCkueChuKS55KGUpfSxmLmRlZmluZWQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpSZyghIXQpLGYpOml9LGYuY3VydmU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9dCxudWxsIT1vJiYodT1hKG8pKSxmKTphfSxmLmNvbnRleHQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG51bGw9PXQ/bz11PW51bGw6dT1hKG89dCksZik6b30sZn1mdW5jdGlvbiBpeSh0LG4pe3JldHVybiBuPHQ/LTE6bj50PzE6bj49dD8wOk5hTn1mdW5jdGlvbiBveSh0KXtyZXR1cm4gdH1KZy5wcm90b3R5cGU9e2FyZWFTdGFydDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9MH0sYXJlYUVuZDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7KHRoaXMuX2xpbmV8fDAhPT10aGlzLl9saW5lJiYxPT09dGhpcy5fcG9pbnQpJiZ0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpLHRoaXMuX2xpbmU9MS10aGlzLl9saW5lfSxwb2ludDpmdW5jdGlvbih0LG4pe3N3aXRjaCh0PSt0LG49K24sdGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9wb2ludD0xLHRoaXMuX2xpbmU/dGhpcy5fY29udGV4dC5saW5lVG8odCxuKTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0LG4pO2JyZWFrO2Nhc2UgMTp0aGlzLl9wb2ludD0yO2RlZmF1bHQ6dGhpcy5fY29udGV4dC5saW5lVG8odCxuKX19fTt2YXIgYXk9ZnkoS2cpO2Z1bmN0aW9uIHV5KHQpe3RoaXMuX2N1cnZlPXR9ZnVuY3Rpb24gZnkodCl7ZnVuY3Rpb24gbihuKXtyZXR1cm4gbmV3IHV5KHQobikpfXJldHVybiBuLl9jdXJ2ZT10LG59ZnVuY3Rpb24gY3kodCl7dmFyIG49dC5jdXJ2ZTtyZXR1cm4gdC5hbmdsZT10LngsZGVsZXRlIHQueCx0LnJhZGl1cz10LnksZGVsZXRlIHQueSx0LmN1cnZlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP24oZnkodCkpOm4oKS5fY3VydmV9LHR9ZnVuY3Rpb24gc3koKXtyZXR1cm4gY3koZXkoKS5jdXJ2ZShheSkpfWZ1bmN0aW9uIGx5KCl7dmFyIHQ9cnkoKS5jdXJ2ZShheSksbj10LmN1cnZlLGU9dC5saW5lWDAscj10LmxpbmVYMSxpPXQubGluZVkwLG89dC5saW5lWTE7cmV0dXJuIHQuYW5nbGU9dC54LGRlbGV0ZSB0LngsdC5zdGFydEFuZ2xlPXQueDAsZGVsZXRlIHQueDAsdC5lbmRBbmdsZT10LngxLGRlbGV0ZSB0LngxLHQucmFkaXVzPXQueSxkZWxldGUgdC55LHQuaW5uZXJSYWRpdXM9dC55MCxkZWxldGUgdC55MCx0Lm91dGVyUmFkaXVzPXQueTEsZGVsZXRlIHQueTEsdC5saW5lU3RhcnRBbmdsZT1mdW5jdGlvbigpe3JldHVybiBjeShlKCkpfSxkZWxldGUgdC5saW5lWDAsdC5saW5lRW5kQW5nbGU9ZnVuY3Rpb24oKXtyZXR1cm4gY3kocigpKX0sZGVsZXRlIHQubGluZVgxLHQubGluZUlubmVyUmFkaXVzPWZ1bmN0aW9uKCl7cmV0dXJuIGN5KGkoKSl9LGRlbGV0ZSB0LmxpbmVZMCx0LmxpbmVPdXRlclJhZGl1cz1mdW5jdGlvbigpe3JldHVybiBjeShvKCkpfSxkZWxldGUgdC5saW5lWTEsdC5jdXJ2ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD9uKGZ5KHQpKTpuKCkuX2N1cnZlfSx0fWZ1bmN0aW9uIGh5KHQsbil7cmV0dXJuWyhuPStuKSpNYXRoLmNvcyh0LT1NYXRoLlBJLzIpLG4qTWF0aC5zaW4odCldfXV5LnByb3RvdHlwZT17YXJlYVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fY3VydmUuYXJlYVN0YXJ0KCl9LGFyZWFFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9jdXJ2ZS5hcmVhRW5kKCl9LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX2N1cnZlLmxpbmVTdGFydCgpfSxsaW5lRW5kOmZ1bmN0aW9uKCl7dGhpcy5fY3VydmUubGluZUVuZCgpfSxwb2ludDpmdW5jdGlvbih0LG4pe3RoaXMuX2N1cnZlLnBvaW50KG4qTWF0aC5zaW4odCksbiotTWF0aC5jb3ModCkpfX07dmFyIGR5PUFycmF5LnByb3RvdHlwZS5zbGljZTtmdW5jdGlvbiBweSh0KXtyZXR1cm4gdC5zb3VyY2V9ZnVuY3Rpb24gdnkodCl7cmV0dXJuIHQudGFyZ2V0fWZ1bmN0aW9uIGd5KHQpe3ZhciBuPXB5LGU9dnkscj10eSxpPW55LG89bnVsbDtmdW5jdGlvbiBhKCl7dmFyIGEsdT1keS5jYWxsKGFyZ3VtZW50cyksZj1uLmFwcGx5KHRoaXMsdSksYz1lLmFwcGx5KHRoaXMsdSk7aWYob3x8KG89YT1HaSgpKSx0KG8sK3IuYXBwbHkodGhpcywodVswXT1mLHUpKSwraS5hcHBseSh0aGlzLHUpLCtyLmFwcGx5KHRoaXMsKHVbMF09Yyx1KSksK2kuYXBwbHkodGhpcyx1KSksYSlyZXR1cm4gbz1udWxsLGErIiJ8fG51bGx9cmV0dXJuIGEuc291cmNlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPXQsYSk6bn0sYS50YXJnZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9dCxhKTplfSxhLng9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpSZygrdCksYSk6cn0sYS55PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6UmcoK3QpLGEpOml9LGEuY29udGV4dD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz1udWxsPT10P251bGw6dCxhKTpvfSxhfWZ1bmN0aW9uIHl5KHQsbixlLHIsaSl7dC5tb3ZlVG8obixlKSx0LmJlemllckN1cnZlVG8obj0obityKS8yLGUsbixpLHIsaSl9ZnVuY3Rpb24gX3kodCxuLGUscixpKXt0Lm1vdmVUbyhuLGUpLHQuYmV6aWVyQ3VydmVUbyhuLGU9KGUraSkvMixyLGUscixpKX1mdW5jdGlvbiBieSh0LG4sZSxyLGkpe3ZhciBvPWh5KG4sZSksYT1oeShuLGU9KGUraSkvMiksdT1oeShyLGUpLGY9aHkocixpKTt0Lm1vdmVUbyhvWzBdLG9bMV0pLHQuYmV6aWVyQ3VydmVUbyhhWzBdLGFbMV0sdVswXSx1WzFdLGZbMF0sZlsxXSl9dmFyIG15PXtkcmF3OmZ1bmN0aW9uKHQsbil7dmFyIGU9TWF0aC5zcXJ0KG4vSWcpO3QubW92ZVRvKGUsMCksdC5hcmMoMCwwLGUsMCxqZyl9fSx4eT17ZHJhdzpmdW5jdGlvbih0LG4pe3ZhciBlPU1hdGguc3FydChuLzUpLzI7dC5tb3ZlVG8oLTMqZSwtZSksdC5saW5lVG8oLWUsLWUpLHQubGluZVRvKC1lLC0zKmUpLHQubGluZVRvKGUsLTMqZSksdC5saW5lVG8oZSwtZSksdC5saW5lVG8oMyplLC1lKSx0LmxpbmVUbygzKmUsZSksdC5saW5lVG8oZSxlKSx0LmxpbmVUbyhlLDMqZSksdC5saW5lVG8oLWUsMyplKSx0LmxpbmVUbygtZSxlKSx0LmxpbmVUbygtMyplLGUpLHQuY2xvc2VQYXRoKCl9fSx3eT1NYXRoLnNxcnQoMS8zKSxNeT0yKnd5LEF5PXtkcmF3OmZ1bmN0aW9uKHQsbil7dmFyIGU9TWF0aC5zcXJ0KG4vTXkpLHI9ZSp3eTt0Lm1vdmVUbygwLC1lKSx0LmxpbmVUbyhyLDApLHQubGluZVRvKDAsZSksdC5saW5lVG8oLXIsMCksdC5jbG9zZVBhdGgoKX19LFR5PU1hdGguc2luKElnLzEwKS9NYXRoLnNpbig3KklnLzEwKSxOeT1NYXRoLnNpbihqZy8xMCkqVHksU3k9LU1hdGguY29zKGpnLzEwKSpUeSxFeT17ZHJhdzpmdW5jdGlvbih0LG4pe3ZhciBlPU1hdGguc3FydCguODkwODEzMDkxNTI5Mjg1MipuKSxyPU55KmUsaT1TeSplO3QubW92ZVRvKDAsLWUpLHQubGluZVRvKHIsaSk7Zm9yKHZhciBvPTE7bzw1Oysrbyl7dmFyIGE9amcqby81LHU9TWF0aC5jb3MoYSksZj1NYXRoLnNpbihhKTt0LmxpbmVUbyhmKmUsLXUqZSksdC5saW5lVG8odSpyLWYqaSxmKnIrdSppKX10LmNsb3NlUGF0aCgpfX0sa3k9e2RyYXc6ZnVuY3Rpb24odCxuKXt2YXIgZT1NYXRoLnNxcnQobikscj0tZS8yO3QucmVjdChyLHIsZSxlKX19LEN5PU1hdGguc3FydCgzKSxQeT17ZHJhdzpmdW5jdGlvbih0LG4pe3ZhciBlPS1NYXRoLnNxcnQobi8oMypDeSkpO3QubW92ZVRvKDAsMiplKSx0LmxpbmVUbygtQ3kqZSwtZSksdC5saW5lVG8oQ3kqZSwtZSksdC5jbG9zZVBhdGgoKX19LHp5PU1hdGguc3FydCgzKS8yLFJ5PTEvTWF0aC5zcXJ0KDEyKSxMeT0zKihSeS8yKzEpLER5PXtkcmF3OmZ1bmN0aW9uKHQsbil7dmFyIGU9TWF0aC5zcXJ0KG4vTHkpLHI9ZS8yLGk9ZSpSeSxvPXIsYT1lKlJ5K2UsdT0tbyxmPWE7dC5tb3ZlVG8ocixpKSx0LmxpbmVUbyhvLGEpLHQubGluZVRvKHUsZiksdC5saW5lVG8oLS41KnItenkqaSx6eSpyKy0uNSppKSx0LmxpbmVUbygtLjUqby16eSphLHp5Km8rLS41KmEpLHQubGluZVRvKC0uNSp1LXp5KmYsenkqdSstLjUqZiksdC5saW5lVG8oLS41KnIrenkqaSwtLjUqaS16eSpyKSx0LmxpbmVUbygtLjUqbyt6eSphLC0uNSphLXp5Km8pLHQubGluZVRvKC0uNSp1K3p5KmYsLS41KmYtenkqdSksdC5jbG9zZVBhdGgoKX19LFV5PVtteSx4eSxBeSxreSxFeSxQeSxEeV07ZnVuY3Rpb24gcXkoKXt9ZnVuY3Rpb24gT3kodCxuLGUpe3QuX2NvbnRleHQuYmV6aWVyQ3VydmVUbygoMip0Ll94MCt0Ll94MSkvMywoMip0Ll95MCt0Ll95MSkvMywodC5feDArMip0Ll94MSkvMywodC5feTArMip0Ll95MSkvMywodC5feDArNCp0Ll94MStuKS82LCh0Ll95MCs0KnQuX3kxK2UpLzYpfWZ1bmN0aW9uIFl5KHQpe3RoaXMuX2NvbnRleHQ9dH1mdW5jdGlvbiBCeSh0KXt0aGlzLl9jb250ZXh0PXR9ZnVuY3Rpb24gRnkodCl7dGhpcy5fY29udGV4dD10fWZ1bmN0aW9uIEl5KHQsbil7dGhpcy5fYmFzaXM9bmV3IFl5KHQpLHRoaXMuX2JldGE9bn1ZeS5wcm90b3R5cGU9e2FyZWFTdGFydDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9MH0sYXJlYUVuZDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl94MD10aGlzLl94MT10aGlzLl95MD10aGlzLl95MT1OYU4sdGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpe3N3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAzOk95KHRoaXMsdGhpcy5feDEsdGhpcy5feTEpO2Nhc2UgMjp0aGlzLl9jb250ZXh0LmxpbmVUbyh0aGlzLl94MSx0aGlzLl95MSl9KHRoaXMuX2xpbmV8fDAhPT10aGlzLl9saW5lJiYxPT09dGhpcy5fcG9pbnQpJiZ0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpLHRoaXMuX2xpbmU9MS10aGlzLl9saW5lfSxwb2ludDpmdW5jdGlvbih0LG4pe3N3aXRjaCh0PSt0LG49K24sdGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9wb2ludD0xLHRoaXMuX2xpbmU/dGhpcy5fY29udGV4dC5saW5lVG8odCxuKTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0LG4pO2JyZWFrO2Nhc2UgMTp0aGlzLl9wb2ludD0yO2JyZWFrO2Nhc2UgMjp0aGlzLl9wb2ludD0zLHRoaXMuX2NvbnRleHQubGluZVRvKCg1KnRoaXMuX3gwK3RoaXMuX3gxKS82LCg1KnRoaXMuX3kwK3RoaXMuX3kxKS82KTtkZWZhdWx0Ok95KHRoaXMsdCxuKX10aGlzLl94MD10aGlzLl94MSx0aGlzLl94MT10LHRoaXMuX3kwPXRoaXMuX3kxLHRoaXMuX3kxPW59fSxCeS5wcm90b3R5cGU9e2FyZWFTdGFydDpxeSxhcmVhRW5kOnF5LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3gwPXRoaXMuX3gxPXRoaXMuX3gyPXRoaXMuX3gzPXRoaXMuX3g0PXRoaXMuX3kwPXRoaXMuX3kxPXRoaXMuX3kyPXRoaXMuX3kzPXRoaXMuX3k0PU5hTix0aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7c3dpdGNoKHRoaXMuX3BvaW50KXtjYXNlIDE6dGhpcy5fY29udGV4dC5tb3ZlVG8odGhpcy5feDIsdGhpcy5feTIpLHRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7YnJlYWs7Y2FzZSAyOnRoaXMuX2NvbnRleHQubW92ZVRvKCh0aGlzLl94MisyKnRoaXMuX3gzKS8zLCh0aGlzLl95MisyKnRoaXMuX3kzKS8zKSx0aGlzLl9jb250ZXh0LmxpbmVUbygodGhpcy5feDMrMip0aGlzLl94MikvMywodGhpcy5feTMrMip0aGlzLl95MikvMyksdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKTticmVhaztjYXNlIDM6dGhpcy5wb2ludCh0aGlzLl94Mix0aGlzLl95MiksdGhpcy5wb2ludCh0aGlzLl94Myx0aGlzLl95MyksdGhpcy5wb2ludCh0aGlzLl94NCx0aGlzLl95NCl9fSxwb2ludDpmdW5jdGlvbih0LG4pe3N3aXRjaCh0PSt0LG49K24sdGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9wb2ludD0xLHRoaXMuX3gyPXQsdGhpcy5feTI9bjticmVhaztjYXNlIDE6dGhpcy5fcG9pbnQ9Mix0aGlzLl94Mz10LHRoaXMuX3kzPW47YnJlYWs7Y2FzZSAyOnRoaXMuX3BvaW50PTMsdGhpcy5feDQ9dCx0aGlzLl95ND1uLHRoaXMuX2NvbnRleHQubW92ZVRvKCh0aGlzLl94MCs0KnRoaXMuX3gxK3QpLzYsKHRoaXMuX3kwKzQqdGhpcy5feTErbikvNik7YnJlYWs7ZGVmYXVsdDpPeSh0aGlzLHQsbil9dGhpcy5feDA9dGhpcy5feDEsdGhpcy5feDE9dCx0aGlzLl95MD10aGlzLl95MSx0aGlzLl95MT1ufX0sRnkucHJvdG90eXBlPXthcmVhU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPTB9LGFyZWFFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPU5hTn0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feDA9dGhpcy5feDE9dGhpcy5feTA9dGhpcy5feTE9TmFOLHRoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24oKXsodGhpcy5fbGluZXx8MCE9PXRoaXMuX2xpbmUmJjM9PT10aGlzLl9wb2ludCkmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCksdGhpcy5fbGluZT0xLXRoaXMuX2xpbmV9LHBvaW50OmZ1bmN0aW9uKHQsbil7c3dpdGNoKHQ9K3Qsbj0rbix0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX3BvaW50PTE7YnJlYWs7Y2FzZSAxOnRoaXMuX3BvaW50PTI7YnJlYWs7Y2FzZSAyOnRoaXMuX3BvaW50PTM7dmFyIGU9KHRoaXMuX3gwKzQqdGhpcy5feDErdCkvNixyPSh0aGlzLl95MCs0KnRoaXMuX3kxK24pLzY7dGhpcy5fbGluZT90aGlzLl9jb250ZXh0LmxpbmVUbyhlLHIpOnRoaXMuX2NvbnRleHQubW92ZVRvKGUscik7YnJlYWs7Y2FzZSAzOnRoaXMuX3BvaW50PTQ7ZGVmYXVsdDpPeSh0aGlzLHQsbil9dGhpcy5feDA9dGhpcy5feDEsdGhpcy5feDE9dCx0aGlzLl95MD10aGlzLl95MSx0aGlzLl95MT1ufX0sSXkucHJvdG90eXBlPXtsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl94PVtdLHRoaXMuX3k9W10sdGhpcy5fYmFzaXMubGluZVN0YXJ0KCl9LGxpbmVFbmQ6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl94LG49dGhpcy5feSxlPXQubGVuZ3RoLTE7aWYoZT4wKWZvcih2YXIgcixpPXRbMF0sbz1uWzBdLGE9dFtlXS1pLHU9bltlXS1vLGY9LTE7KytmPD1lOylyPWYvZSx0aGlzLl9iYXNpcy5wb2ludCh0aGlzLl9iZXRhKnRbZl0rKDEtdGhpcy5fYmV0YSkqKGkrciphKSx0aGlzLl9iZXRhKm5bZl0rKDEtdGhpcy5fYmV0YSkqKG8rcip1KSk7dGhpcy5feD10aGlzLl95PW51bGwsdGhpcy5fYmFzaXMubGluZUVuZCgpfSxwb2ludDpmdW5jdGlvbih0LG4pe3RoaXMuX3gucHVzaCgrdCksdGhpcy5feS5wdXNoKCtuKX19O3ZhciBIeT1mdW5jdGlvbiB0KG4pe2Z1bmN0aW9uIGUodCl7cmV0dXJuIDE9PT1uP25ldyBZeSh0KTpuZXcgSXkodCxuKX1yZXR1cm4gZS5iZXRhPWZ1bmN0aW9uKG4pe3JldHVybiB0KCtuKX0sZX0oLjg1KTtmdW5jdGlvbiBqeSh0LG4sZSl7dC5fY29udGV4dC5iZXppZXJDdXJ2ZVRvKHQuX3gxK3QuX2sqKHQuX3gyLXQuX3gwKSx0Ll95MSt0Ll9rKih0Ll95Mi10Ll95MCksdC5feDIrdC5fayoodC5feDEtbiksdC5feTIrdC5fayoodC5feTEtZSksdC5feDIsdC5feTIpfWZ1bmN0aW9uIFh5KHQsbil7dGhpcy5fY29udGV4dD10LHRoaXMuX2s9KDEtbikvNn1YeS5wcm90b3R5cGU9e2FyZWFTdGFydDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9MH0sYXJlYUVuZDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl94MD10aGlzLl94MT10aGlzLl94Mj10aGlzLl95MD10aGlzLl95MT10aGlzLl95Mj1OYU4sdGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpe3N3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAyOnRoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gyLHRoaXMuX3kyKTticmVhaztjYXNlIDM6ankodGhpcyx0aGlzLl94MSx0aGlzLl95MSl9KHRoaXMuX2xpbmV8fDAhPT10aGlzLl9saW5lJiYxPT09dGhpcy5fcG9pbnQpJiZ0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpLHRoaXMuX2xpbmU9MS10aGlzLl9saW5lfSxwb2ludDpmdW5jdGlvbih0LG4pe3N3aXRjaCh0PSt0LG49K24sdGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9wb2ludD0xLHRoaXMuX2xpbmU/dGhpcy5fY29udGV4dC5saW5lVG8odCxuKTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0LG4pO2JyZWFrO2Nhc2UgMTp0aGlzLl9wb2ludD0yLHRoaXMuX3gxPXQsdGhpcy5feTE9bjticmVhaztjYXNlIDI6dGhpcy5fcG9pbnQ9MztkZWZhdWx0Omp5KHRoaXMsdCxuKX10aGlzLl94MD10aGlzLl94MSx0aGlzLl94MT10aGlzLl94Mix0aGlzLl94Mj10LHRoaXMuX3kwPXRoaXMuX3kxLHRoaXMuX3kxPXRoaXMuX3kyLHRoaXMuX3kyPW59fTt2YXIgR3k9ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiBlKHQpe3JldHVybiBuZXcgWHkodCxuKX1yZXR1cm4gZS50ZW5zaW9uPWZ1bmN0aW9uKG4pe3JldHVybiB0KCtuKX0sZX0oMCk7ZnVuY3Rpb24gVnkodCxuKXt0aGlzLl9jb250ZXh0PXQsdGhpcy5faz0oMS1uKS82fVZ5LnByb3RvdHlwZT17YXJlYVN0YXJ0OnF5LGFyZWFFbmQ6cXksbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feDA9dGhpcy5feDE9dGhpcy5feDI9dGhpcy5feDM9dGhpcy5feDQ9dGhpcy5feDU9dGhpcy5feTA9dGhpcy5feTE9dGhpcy5feTI9dGhpcy5feTM9dGhpcy5feTQ9dGhpcy5feTU9TmFOLHRoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24oKXtzd2l0Y2godGhpcy5fcG9pbnQpe2Nhc2UgMTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0aGlzLl94Myx0aGlzLl95MyksdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKTticmVhaztjYXNlIDI6dGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feDMsdGhpcy5feTMpLHRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7YnJlYWs7Y2FzZSAzOnRoaXMucG9pbnQodGhpcy5feDMsdGhpcy5feTMpLHRoaXMucG9pbnQodGhpcy5feDQsdGhpcy5feTQpLHRoaXMucG9pbnQodGhpcy5feDUsdGhpcy5feTUpfX0scG9pbnQ6ZnVuY3Rpb24odCxuKXtzd2l0Y2godD0rdCxuPStuLHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fcG9pbnQ9MSx0aGlzLl94Mz10LHRoaXMuX3kzPW47YnJlYWs7Y2FzZSAxOnRoaXMuX3BvaW50PTIsdGhpcy5fY29udGV4dC5tb3ZlVG8odGhpcy5feDQ9dCx0aGlzLl95ND1uKTticmVhaztjYXNlIDI6dGhpcy5fcG9pbnQ9Myx0aGlzLl94NT10LHRoaXMuX3k1PW47YnJlYWs7ZGVmYXVsdDpqeSh0aGlzLHQsbil9dGhpcy5feDA9dGhpcy5feDEsdGhpcy5feDE9dGhpcy5feDIsdGhpcy5feDI9dCx0aGlzLl95MD10aGlzLl95MSx0aGlzLl95MT10aGlzLl95Mix0aGlzLl95Mj1ufX07dmFyICR5PWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4gbmV3IFZ5KHQsbil9cmV0dXJuIGUudGVuc2lvbj1mdW5jdGlvbihuKXtyZXR1cm4gdCgrbil9LGV9KDApO2Z1bmN0aW9uIFd5KHQsbil7dGhpcy5fY29udGV4dD10LHRoaXMuX2s9KDEtbikvNn1XeS5wcm90b3R5cGU9e2FyZWFTdGFydDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9MH0sYXJlYUVuZDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl94MD10aGlzLl94MT10aGlzLl94Mj10aGlzLl95MD10aGlzLl95MT10aGlzLl95Mj1OYU4sdGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpeyh0aGlzLl9saW5lfHwwIT09dGhpcy5fbGluZSYmMz09PXRoaXMuX3BvaW50KSYmdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKSx0aGlzLl9saW5lPTEtdGhpcy5fbGluZX0scG9pbnQ6ZnVuY3Rpb24odCxuKXtzd2l0Y2godD0rdCxuPStuLHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fcG9pbnQ9MTticmVhaztjYXNlIDE6dGhpcy5fcG9pbnQ9MjticmVhaztjYXNlIDI6dGhpcy5fcG9pbnQ9Myx0aGlzLl9saW5lP3RoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gyLHRoaXMuX3kyKTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0aGlzLl94Mix0aGlzLl95Mik7YnJlYWs7Y2FzZSAzOnRoaXMuX3BvaW50PTQ7ZGVmYXVsdDpqeSh0aGlzLHQsbil9dGhpcy5feDA9dGhpcy5feDEsdGhpcy5feDE9dGhpcy5feDIsdGhpcy5feDI9dCx0aGlzLl95MD10aGlzLl95MSx0aGlzLl95MT10aGlzLl95Mix0aGlzLl95Mj1ufX07dmFyIFp5PWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4gbmV3IFd5KHQsbil9cmV0dXJuIGUudGVuc2lvbj1mdW5jdGlvbihuKXtyZXR1cm4gdCgrbil9LGV9KDApO2Z1bmN0aW9uIFF5KHQsbixlKXt2YXIgcj10Ll94MSxpPXQuX3kxLG89dC5feDIsYT10Ll95MjtpZih0Ll9sMDFfYT5GZyl7dmFyIHU9Mip0Ll9sMDFfMmErMyp0Ll9sMDFfYSp0Ll9sMTJfYSt0Ll9sMTJfMmEsZj0zKnQuX2wwMV9hKih0Ll9sMDFfYSt0Ll9sMTJfYSk7cj0ocip1LXQuX3gwKnQuX2wxMl8yYSt0Ll94Mip0Ll9sMDFfMmEpL2YsaT0oaSp1LXQuX3kwKnQuX2wxMl8yYSt0Ll95Mip0Ll9sMDFfMmEpL2Z9aWYodC5fbDIzX2E+Rmcpe3ZhciBjPTIqdC5fbDIzXzJhKzMqdC5fbDIzX2EqdC5fbDEyX2ErdC5fbDEyXzJhLHM9Myp0Ll9sMjNfYSoodC5fbDIzX2ErdC5fbDEyX2EpO289KG8qYyt0Ll94MSp0Ll9sMjNfMmEtbip0Ll9sMTJfMmEpL3MsYT0oYSpjK3QuX3kxKnQuX2wyM18yYS1lKnQuX2wxMl8yYSkvc310Ll9jb250ZXh0LmJlemllckN1cnZlVG8ocixpLG8sYSx0Ll94Mix0Ll95Mil9ZnVuY3Rpb24gSnkodCxuKXt0aGlzLl9jb250ZXh0PXQsdGhpcy5fYWxwaGE9bn1KeS5wcm90b3R5cGU9e2FyZWFTdGFydDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9MH0sYXJlYUVuZDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl94MD10aGlzLl94MT10aGlzLl94Mj10aGlzLl95MD10aGlzLl95MT10aGlzLl95Mj1OYU4sdGhpcy5fbDAxX2E9dGhpcy5fbDEyX2E9dGhpcy5fbDIzX2E9dGhpcy5fbDAxXzJhPXRoaXMuX2wxMl8yYT10aGlzLl9sMjNfMmE9dGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpe3N3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAyOnRoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gyLHRoaXMuX3kyKTticmVhaztjYXNlIDM6dGhpcy5wb2ludCh0aGlzLl94Mix0aGlzLl95Mil9KHRoaXMuX2xpbmV8fDAhPT10aGlzLl9saW5lJiYxPT09dGhpcy5fcG9pbnQpJiZ0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpLHRoaXMuX2xpbmU9MS10aGlzLl9saW5lfSxwb2ludDpmdW5jdGlvbih0LG4pe2lmKHQ9K3Qsbj0rbix0aGlzLl9wb2ludCl7dmFyIGU9dGhpcy5feDItdCxyPXRoaXMuX3kyLW47dGhpcy5fbDIzX2E9TWF0aC5zcXJ0KHRoaXMuX2wyM18yYT1NYXRoLnBvdyhlKmUrcipyLHRoaXMuX2FscGhhKSl9c3dpdGNoKHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fcG9pbnQ9MSx0aGlzLl9saW5lP3RoaXMuX2NvbnRleHQubGluZVRvKHQsbik6dGhpcy5fY29udGV4dC5tb3ZlVG8odCxuKTticmVhaztjYXNlIDE6dGhpcy5fcG9pbnQ9MjticmVhaztjYXNlIDI6dGhpcy5fcG9pbnQ9MztkZWZhdWx0OlF5KHRoaXMsdCxuKX10aGlzLl9sMDFfYT10aGlzLl9sMTJfYSx0aGlzLl9sMTJfYT10aGlzLl9sMjNfYSx0aGlzLl9sMDFfMmE9dGhpcy5fbDEyXzJhLHRoaXMuX2wxMl8yYT10aGlzLl9sMjNfMmEsdGhpcy5feDA9dGhpcy5feDEsdGhpcy5feDE9dGhpcy5feDIsdGhpcy5feDI9dCx0aGlzLl95MD10aGlzLl95MSx0aGlzLl95MT10aGlzLl95Mix0aGlzLl95Mj1ufX07dmFyIEt5PWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4gbj9uZXcgSnkodCxuKTpuZXcgWHkodCwwKX1yZXR1cm4gZS5hbHBoYT1mdW5jdGlvbihuKXtyZXR1cm4gdCgrbil9LGV9KC41KTtmdW5jdGlvbiB0Xyh0LG4pe3RoaXMuX2NvbnRleHQ9dCx0aGlzLl9hbHBoYT1ufXRfLnByb3RvdHlwZT17YXJlYVN0YXJ0OnF5LGFyZWFFbmQ6cXksbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feDA9dGhpcy5feDE9dGhpcy5feDI9dGhpcy5feDM9dGhpcy5feDQ9dGhpcy5feDU9dGhpcy5feTA9dGhpcy5feTE9dGhpcy5feTI9dGhpcy5feTM9dGhpcy5feTQ9dGhpcy5feTU9TmFOLHRoaXMuX2wwMV9hPXRoaXMuX2wxMl9hPXRoaXMuX2wyM19hPXRoaXMuX2wwMV8yYT10aGlzLl9sMTJfMmE9dGhpcy5fbDIzXzJhPXRoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24oKXtzd2l0Y2godGhpcy5fcG9pbnQpe2Nhc2UgMTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0aGlzLl94Myx0aGlzLl95MyksdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKTticmVhaztjYXNlIDI6dGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feDMsdGhpcy5feTMpLHRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7YnJlYWs7Y2FzZSAzOnRoaXMucG9pbnQodGhpcy5feDMsdGhpcy5feTMpLHRoaXMucG9pbnQodGhpcy5feDQsdGhpcy5feTQpLHRoaXMucG9pbnQodGhpcy5feDUsdGhpcy5feTUpfX0scG9pbnQ6ZnVuY3Rpb24odCxuKXtpZih0PSt0LG49K24sdGhpcy5fcG9pbnQpe3ZhciBlPXRoaXMuX3gyLXQscj10aGlzLl95Mi1uO3RoaXMuX2wyM19hPU1hdGguc3FydCh0aGlzLl9sMjNfMmE9TWF0aC5wb3coZSplK3Iqcix0aGlzLl9hbHBoYSkpfXN3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX3BvaW50PTEsdGhpcy5feDM9dCx0aGlzLl95Mz1uO2JyZWFrO2Nhc2UgMTp0aGlzLl9wb2ludD0yLHRoaXMuX2NvbnRleHQubW92ZVRvKHRoaXMuX3g0PXQsdGhpcy5feTQ9bik7YnJlYWs7Y2FzZSAyOnRoaXMuX3BvaW50PTMsdGhpcy5feDU9dCx0aGlzLl95NT1uO2JyZWFrO2RlZmF1bHQ6UXkodGhpcyx0LG4pfXRoaXMuX2wwMV9hPXRoaXMuX2wxMl9hLHRoaXMuX2wxMl9hPXRoaXMuX2wyM19hLHRoaXMuX2wwMV8yYT10aGlzLl9sMTJfMmEsdGhpcy5fbDEyXzJhPXRoaXMuX2wyM18yYSx0aGlzLl94MD10aGlzLl94MSx0aGlzLl94MT10aGlzLl94Mix0aGlzLl94Mj10LHRoaXMuX3kwPXRoaXMuX3kxLHRoaXMuX3kxPXRoaXMuX3kyLHRoaXMuX3kyPW59fTt2YXIgbl89ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiBlKHQpe3JldHVybiBuP25ldyB0Xyh0LG4pOm5ldyBWeSh0LDApfXJldHVybiBlLmFscGhhPWZ1bmN0aW9uKG4pe3JldHVybiB0KCtuKX0sZX0oLjUpO2Z1bmN0aW9uIGVfKHQsbil7dGhpcy5fY29udGV4dD10LHRoaXMuX2FscGhhPW59ZV8ucHJvdG90eXBlPXthcmVhU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPTB9LGFyZWFFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPU5hTn0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feDA9dGhpcy5feDE9dGhpcy5feDI9dGhpcy5feTA9dGhpcy5feTE9dGhpcy5feTI9TmFOLHRoaXMuX2wwMV9hPXRoaXMuX2wxMl9hPXRoaXMuX2wyM19hPXRoaXMuX2wwMV8yYT10aGlzLl9sMTJfMmE9dGhpcy5fbDIzXzJhPXRoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24oKXsodGhpcy5fbGluZXx8MCE9PXRoaXMuX2xpbmUmJjM9PT10aGlzLl9wb2ludCkmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCksdGhpcy5fbGluZT0xLXRoaXMuX2xpbmV9LHBvaW50OmZ1bmN0aW9uKHQsbil7aWYodD0rdCxuPStuLHRoaXMuX3BvaW50KXt2YXIgZT10aGlzLl94Mi10LHI9dGhpcy5feTItbjt0aGlzLl9sMjNfYT1NYXRoLnNxcnQodGhpcy5fbDIzXzJhPU1hdGgucG93KGUqZStyKnIsdGhpcy5fYWxwaGEpKX1zd2l0Y2godGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9wb2ludD0xO2JyZWFrO2Nhc2UgMTp0aGlzLl9wb2ludD0yO2JyZWFrO2Nhc2UgMjp0aGlzLl9wb2ludD0zLHRoaXMuX2xpbmU/dGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feDIsdGhpcy5feTIpOnRoaXMuX2NvbnRleHQubW92ZVRvKHRoaXMuX3gyLHRoaXMuX3kyKTticmVhaztjYXNlIDM6dGhpcy5fcG9pbnQ9NDtkZWZhdWx0OlF5KHRoaXMsdCxuKX10aGlzLl9sMDFfYT10aGlzLl9sMTJfYSx0aGlzLl9sMTJfYT10aGlzLl9sMjNfYSx0aGlzLl9sMDFfMmE9dGhpcy5fbDEyXzJhLHRoaXMuX2wxMl8yYT10aGlzLl9sMjNfMmEsdGhpcy5feDA9dGhpcy5feDEsdGhpcy5feDE9dGhpcy5feDIsdGhpcy5feDI9dCx0aGlzLl95MD10aGlzLl95MSx0aGlzLl95MT10aGlzLl95Mix0aGlzLl95Mj1ufX07dmFyIHJfPWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4gbj9uZXcgZV8odCxuKTpuZXcgV3kodCwwKX1yZXR1cm4gZS5hbHBoYT1mdW5jdGlvbihuKXtyZXR1cm4gdCgrbil9LGV9KC41KTtmdW5jdGlvbiBpXyh0KXt0aGlzLl9jb250ZXh0PXR9ZnVuY3Rpb24gb18odCl7cmV0dXJuIHQ8MD8tMToxfWZ1bmN0aW9uIGFfKHQsbixlKXt2YXIgcj10Ll94MS10Ll94MCxpPW4tdC5feDEsbz0odC5feTEtdC5feTApLyhyfHxpPDAmJi0wKSxhPShlLXQuX3kxKS8oaXx8cjwwJiYtMCksdT0obyppK2EqcikvKHIraSk7cmV0dXJuKG9fKG8pK29fKGEpKSpNYXRoLm1pbihNYXRoLmFicyhvKSxNYXRoLmFicyhhKSwuNSpNYXRoLmFicyh1KSl8fDB9ZnVuY3Rpb24gdV8odCxuKXt2YXIgZT10Ll94MS10Ll94MDtyZXR1cm4gZT8oMyoodC5feTEtdC5feTApL2UtbikvMjpufWZ1bmN0aW9uIGZfKHQsbixlKXt2YXIgcj10Ll94MCxpPXQuX3kwLG89dC5feDEsYT10Ll95MSx1PShvLXIpLzM7dC5fY29udGV4dC5iZXppZXJDdXJ2ZVRvKHIrdSxpK3UqbixvLXUsYS11KmUsbyxhKX1mdW5jdGlvbiBjXyh0KXt0aGlzLl9jb250ZXh0PXR9ZnVuY3Rpb24gc18odCl7dGhpcy5fY29udGV4dD1uZXcgbF8odCl9ZnVuY3Rpb24gbF8odCl7dGhpcy5fY29udGV4dD10fWZ1bmN0aW9uIGhfKHQpe3RoaXMuX2NvbnRleHQ9dH1mdW5jdGlvbiBkXyh0KXt2YXIgbixlLHI9dC5sZW5ndGgtMSxpPW5ldyBBcnJheShyKSxvPW5ldyBBcnJheShyKSxhPW5ldyBBcnJheShyKTtmb3IoaVswXT0wLG9bMF09MixhWzBdPXRbMF0rMip0WzFdLG49MTtuPHItMTsrK24paVtuXT0xLG9bbl09NCxhW25dPTQqdFtuXSsyKnRbbisxXTtmb3IoaVtyLTFdPTIsb1tyLTFdPTcsYVtyLTFdPTgqdFtyLTFdK3Rbcl0sbj0xO248cjsrK24pZT1pW25dL29bbi0xXSxvW25dLT1lLGFbbl0tPWUqYVtuLTFdO2ZvcihpW3ItMV09YVtyLTFdL29bci0xXSxuPXItMjtuPj0wOy0tbilpW25dPShhW25dLWlbbisxXSkvb1tuXTtmb3Iob1tyLTFdPSh0W3JdK2lbci0xXSkvMixuPTA7bjxyLTE7KytuKW9bbl09Mip0W24rMV0taVtuKzFdO3JldHVybltpLG9dfWZ1bmN0aW9uIHBfKHQsbil7dGhpcy5fY29udGV4dD10LHRoaXMuX3Q9bn1mdW5jdGlvbiB2Xyh0LG4pe2lmKChpPXQubGVuZ3RoKT4xKWZvcih2YXIgZSxyLGksbz0xLGE9dFtuWzBdXSx1PWEubGVuZ3RoO288aTsrK28pZm9yKHI9YSxhPXRbbltvXV0sZT0wO2U8dTsrK2UpYVtlXVsxXSs9YVtlXVswXT1pc05hTihyW2VdWzFdKT9yW2VdWzBdOnJbZV1bMV19ZnVuY3Rpb24gZ18odCl7Zm9yKHZhciBuPXQubGVuZ3RoLGU9bmV3IEFycmF5KG4pOy0tbj49MDspZVtuXT1uO3JldHVybiBlfWZ1bmN0aW9uIHlfKHQsbil7cmV0dXJuIHRbbl19ZnVuY3Rpb24gX18odCl7dmFyIG49dC5tYXAoYl8pO3JldHVybiBnXyh0KS5zb3J0KGZ1bmN0aW9uKHQsZSl7cmV0dXJuIG5bdF0tbltlXX0pfWZ1bmN0aW9uIGJfKHQpe2Zvcih2YXIgbixlPTAscj0tMSxpPXQubGVuZ3RoOysrcjxpOykobj0rdFtyXVsxXSkmJihlKz1uKTtyZXR1cm4gZX1mdW5jdGlvbiBtXyh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19ZnVuY3Rpb24geF8odCl7cmV0dXJuIHRbMF19ZnVuY3Rpb24gd18odCl7cmV0dXJuIHRbMV19ZnVuY3Rpb24gTV8oKXt0aGlzLl89bnVsbH1mdW5jdGlvbiBBXyh0KXt0LlU9dC5DPXQuTD10LlI9dC5QPXQuTj1udWxsfWZ1bmN0aW9uIFRfKHQsbil7dmFyIGU9bixyPW4uUixpPWUuVTtpP2kuTD09PWU/aS5MPXI6aS5SPXI6dC5fPXIsci5VPWksZS5VPXIsZS5SPXIuTCxlLlImJihlLlIuVT1lKSxyLkw9ZX1mdW5jdGlvbiBOXyh0LG4pe3ZhciBlPW4scj1uLkwsaT1lLlU7aT9pLkw9PT1lP2kuTD1yOmkuUj1yOnQuXz1yLHIuVT1pLGUuVT1yLGUuTD1yLlIsZS5MJiYoZS5MLlU9ZSksci5SPWV9ZnVuY3Rpb24gU18odCl7Zm9yKDt0Lkw7KXQ9dC5MO3JldHVybiB0fWZ1bmN0aW9uIEVfKHQsbixlLHIpe3ZhciBpPVtudWxsLG51bGxdLG89Sl8ucHVzaChpKS0xO3JldHVybiBpLmxlZnQ9dCxpLnJpZ2h0PW4sZSYmQ18oaSx0LG4sZSksciYmQ18oaSxuLHQsciksWl9bdC5pbmRleF0uaGFsZmVkZ2VzLnB1c2gobyksWl9bbi5pbmRleF0uaGFsZmVkZ2VzLnB1c2gobyksaX1mdW5jdGlvbiBrXyh0LG4sZSl7dmFyIHI9W24sZV07cmV0dXJuIHIubGVmdD10LHJ9ZnVuY3Rpb24gQ18odCxuLGUscil7dFswXXx8dFsxXT90LmxlZnQ9PT1lP3RbMV09cjp0WzBdPXI6KHRbMF09cix0LmxlZnQ9bix0LnJpZ2h0PWUpfWZ1bmN0aW9uIFBfKHQsbixlLHIsaSl7dmFyIG8sYT10WzBdLHU9dFsxXSxmPWFbMF0sYz1hWzFdLHM9MCxsPTEsaD11WzBdLWYsZD11WzFdLWM7aWYobz1uLWYsaHx8IShvPjApKXtpZihvLz1oLGg8MCl7aWYobzxzKXJldHVybjtvPGwmJihsPW8pfWVsc2UgaWYoaD4wKXtpZihvPmwpcmV0dXJuO28+cyYmKHM9byl9aWYobz1yLWYsaHx8IShvPDApKXtpZihvLz1oLGg8MCl7aWYobz5sKXJldHVybjtvPnMmJihzPW8pfWVsc2UgaWYoaD4wKXtpZihvPHMpcmV0dXJuO288bCYmKGw9byl9aWYobz1lLWMsZHx8IShvPjApKXtpZihvLz1kLGQ8MCl7aWYobzxzKXJldHVybjtvPGwmJihsPW8pfWVsc2UgaWYoZD4wKXtpZihvPmwpcmV0dXJuO28+cyYmKHM9byl9aWYobz1pLWMsZHx8IShvPDApKXtpZihvLz1kLGQ8MCl7aWYobz5sKXJldHVybjtvPnMmJihzPW8pfWVsc2UgaWYoZD4wKXtpZihvPHMpcmV0dXJuO288bCYmKGw9byl9cmV0dXJuIShzPjB8fGw8MSl8fChzPjAmJih0WzBdPVtmK3MqaCxjK3MqZF0pLGw8MSYmKHRbMV09W2YrbCpoLGMrbCpkXSksITApfX19fX1mdW5jdGlvbiB6Xyh0LG4sZSxyLGkpe3ZhciBvPXRbMV07aWYobylyZXR1cm4hMDt2YXIgYSx1LGY9dFswXSxjPXQubGVmdCxzPXQucmlnaHQsbD1jWzBdLGg9Y1sxXSxkPXNbMF0scD1zWzFdLHY9KGwrZCkvMixnPShoK3ApLzI7aWYocD09PWgpe2lmKHY8bnx8dj49cilyZXR1cm47aWYobD5kKXtpZihmKXtpZihmWzFdPj1pKXJldHVybn1lbHNlIGY9W3YsZV07bz1bdixpXX1lbHNle2lmKGYpe2lmKGZbMV08ZSlyZXR1cm59ZWxzZSBmPVt2LGldO289W3YsZV19fWVsc2UgaWYodT1nLShhPShsLWQpLyhwLWgpKSp2LGE8LTF8fGE+MSlpZihsPmQpe2lmKGYpe2lmKGZbMV0+PWkpcmV0dXJufWVsc2UgZj1bKGUtdSkvYSxlXTtvPVsoaS11KS9hLGldfWVsc2V7aWYoZil7aWYoZlsxXTxlKXJldHVybn1lbHNlIGY9WyhpLXUpL2EsaV07bz1bKGUtdSkvYSxlXX1lbHNlIGlmKGg8cCl7aWYoZil7aWYoZlswXT49cilyZXR1cm59ZWxzZSBmPVtuLGEqbit1XTtvPVtyLGEqcit1XX1lbHNle2lmKGYpe2lmKGZbMF08bilyZXR1cm59ZWxzZSBmPVtyLGEqcit1XTtvPVtuLGEqbit1XX1yZXR1cm4gdFswXT1mLHRbMV09bywhMH1mdW5jdGlvbiBSXyh0LG4pe3ZhciBlPXQuc2l0ZSxyPW4ubGVmdCxpPW4ucmlnaHQ7cmV0dXJuIGU9PT1pJiYoaT1yLHI9ZSksaT9NYXRoLmF0YW4yKGlbMV0tclsxXSxpWzBdLXJbMF0pOihlPT09cj8ocj1uWzFdLGk9blswXSk6KHI9blswXSxpPW5bMV0pLE1hdGguYXRhbjIoclswXS1pWzBdLGlbMV0tclsxXSkpfWZ1bmN0aW9uIExfKHQsbil7cmV0dXJuIG5bKyhuLmxlZnQhPT10LnNpdGUpXX1mdW5jdGlvbiBEXyh0LG4pe3JldHVybiBuWysobi5sZWZ0PT09dC5zaXRlKV19aV8ucHJvdG90eXBlPXthcmVhU3RhcnQ6cXksYXJlYUVuZDpxeSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7dGhpcy5fcG9pbnQmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCl9LHBvaW50OmZ1bmN0aW9uKHQsbil7dD0rdCxuPStuLHRoaXMuX3BvaW50P3RoaXMuX2NvbnRleHQubGluZVRvKHQsbik6KHRoaXMuX3BvaW50PTEsdGhpcy5fY29udGV4dC5tb3ZlVG8odCxuKSl9fSxjXy5wcm90b3R5cGU9e2FyZWFTdGFydDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9MH0sYXJlYUVuZDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl94MD10aGlzLl94MT10aGlzLl95MD10aGlzLl95MT10aGlzLl90MD1OYU4sdGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpe3N3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAyOnRoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gxLHRoaXMuX3kxKTticmVhaztjYXNlIDM6Zl8odGhpcyx0aGlzLl90MCx1Xyh0aGlzLHRoaXMuX3QwKSl9KHRoaXMuX2xpbmV8fDAhPT10aGlzLl9saW5lJiYxPT09dGhpcy5fcG9pbnQpJiZ0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpLHRoaXMuX2xpbmU9MS10aGlzLl9saW5lfSxwb2ludDpmdW5jdGlvbih0LG4pe3ZhciBlPU5hTjtpZihuPStuLCh0PSt0KSE9PXRoaXMuX3gxfHxuIT09dGhpcy5feTEpe3N3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX3BvaW50PTEsdGhpcy5fbGluZT90aGlzLl9jb250ZXh0LmxpbmVUbyh0LG4pOnRoaXMuX2NvbnRleHQubW92ZVRvKHQsbik7YnJlYWs7Y2FzZSAxOnRoaXMuX3BvaW50PTI7YnJlYWs7Y2FzZSAyOnRoaXMuX3BvaW50PTMsZl8odGhpcyx1Xyh0aGlzLGU9YV8odGhpcyx0LG4pKSxlKTticmVhaztkZWZhdWx0OmZfKHRoaXMsdGhpcy5fdDAsZT1hXyh0aGlzLHQsbikpfXRoaXMuX3gwPXRoaXMuX3gxLHRoaXMuX3gxPXQsdGhpcy5feTA9dGhpcy5feTEsdGhpcy5feTE9bix0aGlzLl90MD1lfX19LChzXy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShjXy5wcm90b3R5cGUpKS5wb2ludD1mdW5jdGlvbih0LG4pe2NfLnByb3RvdHlwZS5wb2ludC5jYWxsKHRoaXMsbix0KX0sbF8ucHJvdG90eXBlPXttb3ZlVG86ZnVuY3Rpb24odCxuKXt0aGlzLl9jb250ZXh0Lm1vdmVUbyhuLHQpfSxjbG9zZVBhdGg6ZnVuY3Rpb24oKXt0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpfSxsaW5lVG86ZnVuY3Rpb24odCxuKXt0aGlzLl9jb250ZXh0LmxpbmVUbyhuLHQpfSxiZXppZXJDdXJ2ZVRvOmZ1bmN0aW9uKHQsbixlLHIsaSxvKXt0aGlzLl9jb250ZXh0LmJlemllckN1cnZlVG8obix0LHIsZSxvLGkpfX0saF8ucHJvdG90eXBlPXthcmVhU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPTB9LGFyZWFFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPU5hTn0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feD1bXSx0aGlzLl95PVtdfSxsaW5lRW5kOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5feCxuPXRoaXMuX3ksZT10Lmxlbmd0aDtpZihlKWlmKHRoaXMuX2xpbmU/dGhpcy5fY29udGV4dC5saW5lVG8odFswXSxuWzBdKTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0WzBdLG5bMF0pLDI9PT1lKXRoaXMuX2NvbnRleHQubGluZVRvKHRbMV0sblsxXSk7ZWxzZSBmb3IodmFyIHI9ZF8odCksaT1kXyhuKSxvPTAsYT0xO2E8ZTsrK28sKythKXRoaXMuX2NvbnRleHQuYmV6aWVyQ3VydmVUbyhyWzBdW29dLGlbMF1bb10sclsxXVtvXSxpWzFdW29dLHRbYV0sblthXSk7KHRoaXMuX2xpbmV8fDAhPT10aGlzLl9saW5lJiYxPT09ZSkmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCksdGhpcy5fbGluZT0xLXRoaXMuX2xpbmUsdGhpcy5feD10aGlzLl95PW51bGx9LHBvaW50OmZ1bmN0aW9uKHQsbil7dGhpcy5feC5wdXNoKCt0KSx0aGlzLl95LnB1c2goK24pfX0scF8ucHJvdG90eXBlPXthcmVhU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPTB9LGFyZWFFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPU5hTn0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feD10aGlzLl95PU5hTix0aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7MDx0aGlzLl90JiZ0aGlzLl90PDEmJjI9PT10aGlzLl9wb2ludCYmdGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feCx0aGlzLl95KSwodGhpcy5fbGluZXx8MCE9PXRoaXMuX2xpbmUmJjE9PT10aGlzLl9wb2ludCkmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCksdGhpcy5fbGluZT49MCYmKHRoaXMuX3Q9MS10aGlzLl90LHRoaXMuX2xpbmU9MS10aGlzLl9saW5lKX0scG9pbnQ6ZnVuY3Rpb24odCxuKXtzd2l0Y2godD0rdCxuPStuLHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fcG9pbnQ9MSx0aGlzLl9saW5lP3RoaXMuX2NvbnRleHQubGluZVRvKHQsbik6dGhpcy5fY29udGV4dC5tb3ZlVG8odCxuKTticmVhaztjYXNlIDE6dGhpcy5fcG9pbnQ9MjtkZWZhdWx0OmlmKHRoaXMuX3Q8PTApdGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feCxuKSx0aGlzLl9jb250ZXh0LmxpbmVUbyh0LG4pO2Vsc2V7dmFyIGU9dGhpcy5feCooMS10aGlzLl90KSt0KnRoaXMuX3Q7dGhpcy5fY29udGV4dC5saW5lVG8oZSx0aGlzLl95KSx0aGlzLl9jb250ZXh0LmxpbmVUbyhlLG4pfX10aGlzLl94PXQsdGhpcy5feT1ufX0sTV8ucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpNXyxpbnNlcnQ6ZnVuY3Rpb24odCxuKXt2YXIgZSxyLGk7aWYodCl7aWYobi5QPXQsbi5OPXQuTix0Lk4mJih0Lk4uUD1uKSx0Lk49bix0LlIpe2Zvcih0PXQuUjt0Lkw7KXQ9dC5MO3QuTD1ufWVsc2UgdC5SPW47ZT10fWVsc2UgdGhpcy5fPyh0PVNfKHRoaXMuXyksbi5QPW51bGwsbi5OPXQsdC5QPXQuTD1uLGU9dCk6KG4uUD1uLk49bnVsbCx0aGlzLl89bixlPW51bGwpO2ZvcihuLkw9bi5SPW51bGwsbi5VPWUsbi5DPSEwLHQ9bjtlJiZlLkM7KWU9PT0ocj1lLlUpLkw/KGk9ci5SKSYmaS5DPyhlLkM9aS5DPSExLHIuQz0hMCx0PXIpOih0PT09ZS5SJiYoVF8odGhpcyxlKSxlPSh0PWUpLlUpLGUuQz0hMSxyLkM9ITAsTl8odGhpcyxyKSk6KGk9ci5MKSYmaS5DPyhlLkM9aS5DPSExLHIuQz0hMCx0PXIpOih0PT09ZS5MJiYoTl8odGhpcyxlKSxlPSh0PWUpLlUpLGUuQz0hMSxyLkM9ITAsVF8odGhpcyxyKSksZT10LlU7dGhpcy5fLkM9ITF9LHJlbW92ZTpmdW5jdGlvbih0KXt0Lk4mJih0Lk4uUD10LlApLHQuUCYmKHQuUC5OPXQuTiksdC5OPXQuUD1udWxsO3ZhciBuLGUscixpPXQuVSxvPXQuTCxhPXQuUjtpZihlPW8/YT9TXyhhKTpvOmEsaT9pLkw9PT10P2kuTD1lOmkuUj1lOnRoaXMuXz1lLG8mJmE/KHI9ZS5DLGUuQz10LkMsZS5MPW8sby5VPWUsZSE9PWE/KGk9ZS5VLGUuVT10LlUsdD1lLlIsaS5MPXQsZS5SPWEsYS5VPWUpOihlLlU9aSxpPWUsdD1lLlIpKToocj10LkMsdD1lKSx0JiYodC5VPWkpLCFyKWlmKHQmJnQuQyl0LkM9ITE7ZWxzZXtkb3tpZih0PT09dGhpcy5fKWJyZWFrO2lmKHQ9PT1pLkwpe2lmKChuPWkuUikuQyYmKG4uQz0hMSxpLkM9ITAsVF8odGhpcyxpKSxuPWkuUiksbi5MJiZuLkwuQ3x8bi5SJiZuLlIuQyl7bi5SJiZuLlIuQ3x8KG4uTC5DPSExLG4uQz0hMCxOXyh0aGlzLG4pLG49aS5SKSxuLkM9aS5DLGkuQz1uLlIuQz0hMSxUXyh0aGlzLGkpLHQ9dGhpcy5fO2JyZWFrfX1lbHNlIGlmKChuPWkuTCkuQyYmKG4uQz0hMSxpLkM9ITAsTl8odGhpcyxpKSxuPWkuTCksbi5MJiZuLkwuQ3x8bi5SJiZuLlIuQyl7bi5MJiZuLkwuQ3x8KG4uUi5DPSExLG4uQz0hMCxUXyh0aGlzLG4pLG49aS5MKSxuLkM9aS5DLGkuQz1uLkwuQz0hMSxOXyh0aGlzLGkpLHQ9dGhpcy5fO2JyZWFrfW4uQz0hMCx0PWksaT1pLlV9d2hpbGUoIXQuQyk7dCYmKHQuQz0hMSl9fX07dmFyIFVfLHFfPVtdO2Z1bmN0aW9uIE9fKCl7QV8odGhpcyksdGhpcy54PXRoaXMueT10aGlzLmFyYz10aGlzLnNpdGU9dGhpcy5jeT1udWxsfWZ1bmN0aW9uIFlfKHQpe3ZhciBuPXQuUCxlPXQuTjtpZihuJiZlKXt2YXIgcj1uLnNpdGUsaT10LnNpdGUsbz1lLnNpdGU7aWYociE9PW8pe3ZhciBhPWlbMF0sdT1pWzFdLGY9clswXS1hLGM9clsxXS11LHM9b1swXS1hLGw9b1sxXS11LGg9MiooZipsLWMqcyk7aWYoIShoPj0tdGIpKXt2YXIgZD1mKmYrYypjLHA9cypzK2wqbCx2PShsKmQtYypwKS9oLGc9KGYqcC1zKmQpL2gseT1xXy5wb3AoKXx8bmV3IE9fO3kuYXJjPXQseS5zaXRlPWkseS54PXYrYSx5Lnk9KHkuY3k9Zyt1KStNYXRoLnNxcnQodip2K2cqZyksdC5jaXJjbGU9eTtmb3IodmFyIF89bnVsbCxiPVFfLl87YjspaWYoeS55PGIueXx8eS55PT09Yi55JiZ5Lng8PWIueCl7aWYoIWIuTCl7Xz1iLlA7YnJlYWt9Yj1iLkx9ZWxzZXtpZighYi5SKXtfPWI7YnJlYWt9Yj1iLlJ9UV8uaW5zZXJ0KF8seSksX3x8KFVfPXkpfX19fWZ1bmN0aW9uIEJfKHQpe3ZhciBuPXQuY2lyY2xlO24mJihuLlB8fChVXz1uLk4pLFFfLnJlbW92ZShuKSxxXy5wdXNoKG4pLEFfKG4pLHQuY2lyY2xlPW51bGwpfXZhciBGXz1bXTtmdW5jdGlvbiBJXygpe0FfKHRoaXMpLHRoaXMuZWRnZT10aGlzLnNpdGU9dGhpcy5jaXJjbGU9bnVsbH1mdW5jdGlvbiBIXyh0KXt2YXIgbj1GXy5wb3AoKXx8bmV3IElfO3JldHVybiBuLnNpdGU9dCxufWZ1bmN0aW9uIGpfKHQpe0JfKHQpLFdfLnJlbW92ZSh0KSxGXy5wdXNoKHQpLEFfKHQpfWZ1bmN0aW9uIFhfKHQpe3ZhciBuPXQuY2lyY2xlLGU9bi54LHI9bi5jeSxpPVtlLHJdLG89dC5QLGE9dC5OLHU9W3RdO2pfKHQpO2Zvcih2YXIgZj1vO2YuY2lyY2xlJiZNYXRoLmFicyhlLWYuY2lyY2xlLngpPEtfJiZNYXRoLmFicyhyLWYuY2lyY2xlLmN5KTxLXzspbz1mLlAsdS51bnNoaWZ0KGYpLGpfKGYpLGY9bzt1LnVuc2hpZnQoZiksQl8oZik7Zm9yKHZhciBjPWE7Yy5jaXJjbGUmJk1hdGguYWJzKGUtYy5jaXJjbGUueCk8S18mJk1hdGguYWJzKHItYy5jaXJjbGUuY3kpPEtfOylhPWMuTix1LnB1c2goYyksal8oYyksYz1hO3UucHVzaChjKSxCXyhjKTt2YXIgcyxsPXUubGVuZ3RoO2ZvcihzPTE7czxsOysrcyljPXVbc10sZj11W3MtMV0sQ18oYy5lZGdlLGYuc2l0ZSxjLnNpdGUsaSk7Zj11WzBdLChjPXVbbC0xXSkuZWRnZT1FXyhmLnNpdGUsYy5zaXRlLG51bGwsaSksWV8oZiksWV8oYyl9ZnVuY3Rpb24gR18odCl7Zm9yKHZhciBuLGUscixpLG89dFswXSxhPXRbMV0sdT1XXy5fO3U7KWlmKChyPVZfKHUsYSktbyk+S18pdT11Lkw7ZWxzZXtpZighKChpPW8tJF8odSxhKSk+S18pKXtyPi1LXz8obj11LlAsZT11KTppPi1LXz8obj11LGU9dS5OKTpuPWU9dTticmVha31pZighdS5SKXtuPXU7YnJlYWt9dT11LlJ9IWZ1bmN0aW9uKHQpe1pfW3QuaW5kZXhdPXtzaXRlOnQsaGFsZmVkZ2VzOltdfX0odCk7dmFyIGY9SF8odCk7aWYoV18uaW5zZXJ0KG4sZiksbnx8ZSl7aWYobj09PWUpcmV0dXJuIEJfKG4pLGU9SF8obi5zaXRlKSxXXy5pbnNlcnQoZixlKSxmLmVkZ2U9ZS5lZGdlPUVfKG4uc2l0ZSxmLnNpdGUpLFlfKG4pLHZvaWQgWV8oZSk7aWYoZSl7Ql8obiksQl8oZSk7dmFyIGM9bi5zaXRlLHM9Y1swXSxsPWNbMV0saD10WzBdLXMsZD10WzFdLWwscD1lLnNpdGUsdj1wWzBdLXMsZz1wWzFdLWwseT0yKihoKmctZCp2KSxfPWgqaCtkKmQsYj12KnYrZypnLG09WyhnKl8tZCpiKS95K3MsKGgqYi12Kl8pL3krbF07Q18oZS5lZGdlLGMscCxtKSxmLmVkZ2U9RV8oYyx0LG51bGwsbSksZS5lZGdlPUVfKHQscCxudWxsLG0pLFlfKG4pLFlfKGUpfWVsc2UgZi5lZGdlPUVfKG4uc2l0ZSxmLnNpdGUpfX1mdW5jdGlvbiBWXyh0LG4pe3ZhciBlPXQuc2l0ZSxyPWVbMF0saT1lWzFdLG89aS1uO2lmKCFvKXJldHVybiByO3ZhciBhPXQuUDtpZighYSlyZXR1cm4tMS8wO3ZhciB1PShlPWEuc2l0ZSlbMF0sZj1lWzFdLGM9Zi1uO2lmKCFjKXJldHVybiB1O3ZhciBzPXUtcixsPTEvby0xL2MsaD1zL2M7cmV0dXJuIGw/KC1oK01hdGguc3FydChoKmgtMipsKihzKnMvKC0yKmMpLWYrYy8yK2ktby8yKSkpL2wrcjoocit1KS8yfWZ1bmN0aW9uICRfKHQsbil7dmFyIGU9dC5OO2lmKGUpcmV0dXJuIFZfKGUsbik7dmFyIHI9dC5zaXRlO3JldHVybiByWzFdPT09bj9yWzBdOjEvMH12YXIgV18sWl8sUV8sSl8sS189MWUtNix0Yj0xZS0xMjtmdW5jdGlvbiBuYih0LG4pe3JldHVybiBuWzFdLXRbMV18fG5bMF0tdFswXX1mdW5jdGlvbiBlYih0LG4pe3ZhciBlLHIsaSxvPXQuc29ydChuYikucG9wKCk7Zm9yKEpfPVtdLFpfPW5ldyBBcnJheSh0Lmxlbmd0aCksV189bmV3IE1fLFFfPW5ldyBNXzs7KWlmKGk9VV8sbyYmKCFpfHxvWzFdPGkueXx8b1sxXT09PWkueSYmb1swXTxpLngpKW9bMF09PT1lJiZvWzFdPT09cnx8KEdfKG8pLGU9b1swXSxyPW9bMV0pLG89dC5wb3AoKTtlbHNle2lmKCFpKWJyZWFrO1hfKGkuYXJjKX1pZihmdW5jdGlvbigpe2Zvcih2YXIgdCxuLGUscixpPTAsbz1aXy5sZW5ndGg7aTxvOysraSlpZigodD1aX1tpXSkmJihyPShuPXQuaGFsZmVkZ2VzKS5sZW5ndGgpKXt2YXIgYT1uZXcgQXJyYXkociksdT1uZXcgQXJyYXkocik7Zm9yKGU9MDtlPHI7KytlKWFbZV09ZSx1W2VdPVJfKHQsSl9bbltlXV0pO2ZvcihhLnNvcnQoZnVuY3Rpb24odCxuKXtyZXR1cm4gdVtuXS11W3RdfSksZT0wO2U8cjsrK2UpdVtlXT1uW2FbZV1dO2ZvcihlPTA7ZTxyOysrZSluW2VdPXVbZV19fSgpLG4pe3ZhciBhPStuWzBdWzBdLHU9K25bMF1bMV0sZj0rblsxXVswXSxjPStuWzFdWzFdOyFmdW5jdGlvbih0LG4sZSxyKXtmb3IodmFyIGksbz1KXy5sZW5ndGg7by0tOyl6XyhpPUpfW29dLHQsbixlLHIpJiZQXyhpLHQsbixlLHIpJiYoTWF0aC5hYnMoaVswXVswXS1pWzFdWzBdKT5LX3x8TWF0aC5hYnMoaVswXVsxXS1pWzFdWzFdKT5LXyl8fGRlbGV0ZSBKX1tvXX0oYSx1LGYsYyksZnVuY3Rpb24odCxuLGUscil7dmFyIGksbyxhLHUsZixjLHMsbCxoLGQscCx2LGc9Wl8ubGVuZ3RoLHk9ITA7Zm9yKGk9MDtpPGc7KytpKWlmKG89Wl9baV0pe2ZvcihhPW8uc2l0ZSx1PShmPW8uaGFsZmVkZ2VzKS5sZW5ndGg7dS0tOylKX1tmW3VdXXx8Zi5zcGxpY2UodSwxKTtmb3IodT0wLGM9Zi5sZW5ndGg7dTxjOylwPShkPURfKG8sSl9bZlt1XV0pKVswXSx2PWRbMV0sbD0ocz1MXyhvLEpfW2ZbKyt1JWNdXSkpWzBdLGg9c1sxXSwoTWF0aC5hYnMocC1sKT5LX3x8TWF0aC5hYnModi1oKT5LXykmJihmLnNwbGljZSh1LDAsSl8ucHVzaChrXyhhLGQsTWF0aC5hYnMocC10KTxLXyYmci12PktfP1t0LE1hdGguYWJzKGwtdCk8S18/aDpyXTpNYXRoLmFicyh2LXIpPEtfJiZlLXA+S18/W01hdGguYWJzKGgtcik8S18/bDplLHJdOk1hdGguYWJzKHAtZSk8S18mJnYtbj5LXz9bZSxNYXRoLmFicyhsLWUpPEtfP2g6bl06TWF0aC5hYnModi1uKTxLXyYmcC10PktfP1tNYXRoLmFicyhoLW4pPEtfP2w6dCxuXTpudWxsKSktMSksKytjKTtjJiYoeT0hMSl9aWYoeSl7dmFyIF8sYixtLHg9MS8wO2ZvcihpPTAseT1udWxsO2k8ZzsrK2kpKG89Wl9baV0pJiYobT0oXz0oYT1vLnNpdGUpWzBdLXQpKl8rKGI9YVsxXS1uKSpiKTx4JiYoeD1tLHk9byk7aWYoeSl7dmFyIHc9W3Qsbl0sTT1bdCxyXSxBPVtlLHJdLFQ9W2Usbl07eS5oYWxmZWRnZXMucHVzaChKXy5wdXNoKGtfKGE9eS5zaXRlLHcsTSkpLTEsSl8ucHVzaChrXyhhLE0sQSkpLTEsSl8ucHVzaChrXyhhLEEsVCkpLTEsSl8ucHVzaChrXyhhLFQsdykpLTEpfX1mb3IoaT0wO2k8ZzsrK2kpKG89Wl9baV0pJiYoby5oYWxmZWRnZXMubGVuZ3RofHxkZWxldGUgWl9baV0pfShhLHUsZixjKX10aGlzLmVkZ2VzPUpfLHRoaXMuY2VsbHM9Wl8sV189UV89Sl89Wl89bnVsbH1mdW5jdGlvbiByYih0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19ZnVuY3Rpb24gaWIodCxuLGUpe3RoaXMudGFyZ2V0PXQsdGhpcy50eXBlPW4sdGhpcy50cmFuc2Zvcm09ZX1mdW5jdGlvbiBvYih0LG4sZSl7dGhpcy5rPXQsdGhpcy54PW4sdGhpcy55PWV9ZWIucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjplYixwb2x5Z29uczpmdW5jdGlvbigpe3ZhciB0PXRoaXMuZWRnZXM7cmV0dXJuIHRoaXMuY2VsbHMubWFwKGZ1bmN0aW9uKG4pe3ZhciBlPW4uaGFsZmVkZ2VzLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gTF8obix0W2VdKX0pO3JldHVybiBlLmRhdGE9bi5zaXRlLmRhdGEsZX0pfSx0cmlhbmdsZXM6ZnVuY3Rpb24oKXt2YXIgdD1bXSxuPXRoaXMuZWRnZXM7cmV0dXJuIHRoaXMuY2VsbHMuZm9yRWFjaChmdW5jdGlvbihlLHIpe2lmKG89KGk9ZS5oYWxmZWRnZXMpLmxlbmd0aClmb3IodmFyIGksbyxhLHUsZixjLHM9ZS5zaXRlLGw9LTEsaD1uW2lbby0xXV0sZD1oLmxlZnQ9PT1zP2gucmlnaHQ6aC5sZWZ0OysrbDxvOylhPWQsZD0oaD1uW2lbbF1dKS5sZWZ0PT09cz9oLnJpZ2h0OmgubGVmdCxhJiZkJiZyPGEuaW5kZXgmJnI8ZC5pbmRleCYmKGY9YSxjPWQsKCh1PXMpWzBdLWNbMF0pKihmWzFdLXVbMV0pLSh1WzBdLWZbMF0pKihjWzFdLXVbMV0pPDApJiZ0LnB1c2goW3MuZGF0YSxhLmRhdGEsZC5kYXRhXSl9KSx0fSxsaW5rczpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVkZ2VzLmZpbHRlcihmdW5jdGlvbih0KXtyZXR1cm4gdC5yaWdodH0pLm1hcChmdW5jdGlvbih0KXtyZXR1cm57c291cmNlOnQubGVmdC5kYXRhLHRhcmdldDp0LnJpZ2h0LmRhdGF9fSl9LGZpbmQ6ZnVuY3Rpb24odCxuLGUpe2Zvcih2YXIgcixpLG89dGhpcyxhPW8uX2ZvdW5kfHwwLHU9by5jZWxscy5sZW5ndGg7IShpPW8uY2VsbHNbYV0pOylpZigrK2E+PXUpcmV0dXJuIG51bGw7dmFyIGY9dC1pLnNpdGVbMF0sYz1uLWkuc2l0ZVsxXSxzPWYqZitjKmM7ZG97aT1vLmNlbGxzW3I9YV0sYT1udWxsLGkuaGFsZmVkZ2VzLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHI9by5lZGdlc1tlXSx1PXIubGVmdDtpZih1IT09aS5zaXRlJiZ1fHwodT1yLnJpZ2h0KSl7dmFyIGY9dC11WzBdLGM9bi11WzFdLGw9ZipmK2MqYztsPHMmJihzPWwsYT11LmluZGV4KX19KX13aGlsZShudWxsIT09YSk7cmV0dXJuIG8uX2ZvdW5kPXIsbnVsbD09ZXx8czw9ZSplP2kuc2l0ZTpudWxsfX0sb2IucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpvYixzY2FsZTpmdW5jdGlvbih0KXtyZXR1cm4gMT09PXQ/dGhpczpuZXcgb2IodGhpcy5rKnQsdGhpcy54LHRoaXMueSl9LHRyYW5zbGF0ZTpmdW5jdGlvbih0LG4pe3JldHVybiAwPT09dCYwPT09bj90aGlzOm5ldyBvYih0aGlzLmssdGhpcy54K3RoaXMuayp0LHRoaXMueSt0aGlzLmsqbil9LGFwcGx5OmZ1bmN0aW9uKHQpe3JldHVyblt0WzBdKnRoaXMuayt0aGlzLngsdFsxXSp0aGlzLmsrdGhpcy55XX0sYXBwbHlYOmZ1bmN0aW9uKHQpe3JldHVybiB0KnRoaXMuayt0aGlzLnh9LGFwcGx5WTpmdW5jdGlvbih0KXtyZXR1cm4gdCp0aGlzLmsrdGhpcy55fSxpbnZlcnQ6ZnVuY3Rpb24odCl7cmV0dXJuWyh0WzBdLXRoaXMueCkvdGhpcy5rLCh0WzFdLXRoaXMueSkvdGhpcy5rXX0saW52ZXJ0WDpmdW5jdGlvbih0KXtyZXR1cm4odC10aGlzLngpL3RoaXMua30saW52ZXJ0WTpmdW5jdGlvbih0KXtyZXR1cm4odC10aGlzLnkpL3RoaXMua30scmVzY2FsZVg6ZnVuY3Rpb24odCl7cmV0dXJuIHQuY29weSgpLmRvbWFpbih0LnJhbmdlKCkubWFwKHRoaXMuaW52ZXJ0WCx0aGlzKS5tYXAodC5pbnZlcnQsdCkpfSxyZXNjYWxlWTpmdW5jdGlvbih0KXtyZXR1cm4gdC5jb3B5KCkuZG9tYWluKHQucmFuZ2UoKS5tYXAodGhpcy5pbnZlcnRZLHRoaXMpLm1hcCh0LmludmVydCx0KSl9LHRvU3RyaW5nOmZ1bmN0aW9uKCl7cmV0dXJuInRyYW5zbGF0ZSgiK3RoaXMueCsiLCIrdGhpcy55KyIpIHNjYWxlKCIrdGhpcy5rKyIpIn19O3ZhciBhYj1uZXcgb2IoMSwwLDApO2Z1bmN0aW9uIHViKHQpe3JldHVybiB0Ll9fem9vbXx8YWJ9ZnVuY3Rpb24gZmIoKXt0LmV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpfWZ1bmN0aW9uIGNiKCl7dC5ldmVudC5wcmV2ZW50RGVmYXVsdCgpLHQuZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCl9ZnVuY3Rpb24gc2IoKXtyZXR1cm4hdC5ldmVudC5idXR0b259ZnVuY3Rpb24gbGIoKXt2YXIgdCxuLGU9dGhpcztyZXR1cm4gZSBpbnN0YW5jZW9mIFNWR0VsZW1lbnQ/KHQ9KGU9ZS5vd25lclNWR0VsZW1lbnR8fGUpLndpZHRoLmJhc2VWYWwudmFsdWUsbj1lLmhlaWdodC5iYXNlVmFsLnZhbHVlKToodD1lLmNsaWVudFdpZHRoLG49ZS5jbGllbnRIZWlnaHQpLFtbMCwwXSxbdCxuXV19ZnVuY3Rpb24gaGIoKXtyZXR1cm4gdGhpcy5fX3pvb218fGFifWZ1bmN0aW9uIGRiKCl7cmV0dXJuLXQuZXZlbnQuZGVsdGFZKih0LmV2ZW50LmRlbHRhTW9kZT8xMjA6MSkvNTAwfWZ1bmN0aW9uIHBiKCl7cmV0dXJuIm9udG91Y2hzdGFydCJpbiB0aGlzfWZ1bmN0aW9uIHZiKHQsbixlKXt2YXIgcj10LmludmVydFgoblswXVswXSktZVswXVswXSxpPXQuaW52ZXJ0WChuWzFdWzBdKS1lWzFdWzBdLG89dC5pbnZlcnRZKG5bMF1bMV0pLWVbMF1bMV0sYT10LmludmVydFkoblsxXVsxXSktZVsxXVsxXTtyZXR1cm4gdC50cmFuc2xhdGUoaT5yPyhyK2kpLzI6TWF0aC5taW4oMCxyKXx8TWF0aC5tYXgoMCxpKSxhPm8/KG8rYSkvMjpNYXRoLm1pbigwLG8pfHxNYXRoLm1heCgwLGEpKX11Yi5wcm90b3R5cGU9b2IucHJvdG90eXBlLHQudmVyc2lvbj0iNS43LjAiLHQuYmlzZWN0PWksdC5iaXNlY3RSaWdodD1pLHQuYmlzZWN0TGVmdD1vLHQuYXNjZW5kaW5nPW4sdC5iaXNlY3Rvcj1lLHQuY3Jvc3M9ZnVuY3Rpb24odCxuLGUpe3ZhciByLGksbyx1LGY9dC5sZW5ndGgsYz1uLmxlbmd0aCxzPW5ldyBBcnJheShmKmMpO2ZvcihudWxsPT1lJiYoZT1hKSxyPW89MDtyPGY7KytyKWZvcih1PXRbcl0saT0wO2k8YzsrK2ksKytvKXNbb109ZSh1LG5baV0pO3JldHVybiBzfSx0LmRlc2NlbmRpbmc9ZnVuY3Rpb24odCxuKXtyZXR1cm4gbjx0Py0xOm4+dD8xOm4+PXQ/MDpOYU59LHQuZGV2aWF0aW9uPWMsdC5leHRlbnQ9cyx0Lmhpc3RvZ3JhbT1mdW5jdGlvbigpe3ZhciB0PXYsbj1zLGU9TTtmdW5jdGlvbiByKHIpe3ZhciBvLGEsdT1yLmxlbmd0aCxmPW5ldyBBcnJheSh1KTtmb3Iobz0wO288dTsrK28pZltvXT10KHJbb10sbyxyKTt2YXIgYz1uKGYpLHM9Y1swXSxsPWNbMV0saD1lKGYscyxsKTtBcnJheS5pc0FycmF5KGgpfHwoaD13KHMsbCxoKSxoPWcoTWF0aC5jZWlsKHMvaCkqaCxsLGgpKTtmb3IodmFyIGQ9aC5sZW5ndGg7aFswXTw9czspaC5zaGlmdCgpLC0tZDtmb3IoO2hbZC0xXT5sOyloLnBvcCgpLC0tZDt2YXIgcCx2PW5ldyBBcnJheShkKzEpO2ZvcihvPTA7bzw9ZDsrK28pKHA9dltvXT1bXSkueDA9bz4wP2hbby0xXTpzLHAueDE9bzxkP2hbb106bDtmb3Iobz0wO288dTsrK28pczw9KGE9ZltvXSkmJmE8PWwmJnZbaShoLGEsMCxkKV0ucHVzaChyW29dKTtyZXR1cm4gdn1yZXR1cm4gci52YWx1ZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOnAobikscik6dH0sci5kb21haW49ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpwKFt0WzBdLHRbMV1dKSxyKTpufSxyLnRocmVzaG9sZHM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpBcnJheS5pc0FycmF5KHQpP3AoaC5jYWxsKHQpKTpwKHQpLHIpOmV9LHJ9LHQudGhyZXNob2xkRnJlZWRtYW5EaWFjb25pcz1mdW5jdGlvbih0LGUscil7cmV0dXJuIHQ9ZC5jYWxsKHQsdSkuc29ydChuKSxNYXRoLmNlaWwoKHItZSkvKDIqKEEodCwuNzUpLUEodCwuMjUpKSpNYXRoLnBvdyh0Lmxlbmd0aCwtMS8zKSkpfSx0LnRocmVzaG9sZFNjb3R0PWZ1bmN0aW9uKHQsbixlKXtyZXR1cm4gTWF0aC5jZWlsKChlLW4pLygzLjUqYyh0KSpNYXRoLnBvdyh0Lmxlbmd0aCwtMS8zKSkpfSx0LnRocmVzaG9sZFN0dXJnZXM9TSx0Lm1heD1ULHQubWVhbj1mdW5jdGlvbih0LG4pe3ZhciBlLHI9dC5sZW5ndGgsaT1yLG89LTEsYT0wO2lmKG51bGw9PW4pZm9yKDsrK288cjspaXNOYU4oZT11KHRbb10pKT8tLWk6YSs9ZTtlbHNlIGZvcig7KytvPHI7KWlzTmFOKGU9dShuKHRbb10sbyx0KSkpPy0taTphKz1lO2lmKGkpcmV0dXJuIGEvaX0sdC5tZWRpYW49ZnVuY3Rpb24odCxlKXt2YXIgcixpPXQubGVuZ3RoLG89LTEsYT1bXTtpZihudWxsPT1lKWZvcig7KytvPGk7KWlzTmFOKHI9dSh0W29dKSl8fGEucHVzaChyKTtlbHNlIGZvcig7KytvPGk7KWlzTmFOKHI9dShlKHRbb10sbyx0KSkpfHxhLnB1c2gocik7cmV0dXJuIEEoYS5zb3J0KG4pLC41KX0sdC5tZXJnZT1OLHQubWluPVMsdC5wYWlycz1mdW5jdGlvbih0LG4pe251bGw9PW4mJihuPWEpO2Zvcih2YXIgZT0wLHI9dC5sZW5ndGgtMSxpPXRbMF0sbz1uZXcgQXJyYXkocjwwPzA6cik7ZTxyOylvW2VdPW4oaSxpPXRbKytlXSk7cmV0dXJuIG99LHQucGVybXV0ZT1mdW5jdGlvbih0LG4pe2Zvcih2YXIgZT1uLmxlbmd0aCxyPW5ldyBBcnJheShlKTtlLS07KXJbZV09dFtuW2VdXTtyZXR1cm4gcn0sdC5xdWFudGlsZT1BLHQucmFuZ2U9Zyx0LnNjYW49ZnVuY3Rpb24odCxlKXtpZihyPXQubGVuZ3RoKXt2YXIgcixpLG89MCxhPTAsdT10W2FdO2ZvcihudWxsPT1lJiYoZT1uKTsrK288cjspKGUoaT10W29dLHUpPDB8fDAhPT1lKHUsdSkpJiYodT1pLGE9byk7cmV0dXJuIDA9PT1lKHUsdSk/YTp2b2lkIDB9fSx0LnNodWZmbGU9ZnVuY3Rpb24odCxuLGUpe2Zvcih2YXIgcixpLG89KG51bGw9PWU/dC5sZW5ndGg6ZSktKG49bnVsbD09bj8wOituKTtvOylpPU1hdGgucmFuZG9tKCkqby0tfDAscj10W28rbl0sdFtvK25dPXRbaStuXSx0W2krbl09cjtyZXR1cm4gdH0sdC5zdW09ZnVuY3Rpb24odCxuKXt2YXIgZSxyPXQubGVuZ3RoLGk9LTEsbz0wO2lmKG51bGw9PW4pZm9yKDsrK2k8cjspKGU9K3RbaV0pJiYobys9ZSk7ZWxzZSBmb3IoOysraTxyOykoZT0rbih0W2ldLGksdCkpJiYobys9ZSk7cmV0dXJuIG99LHQudGlja3M9bSx0LnRpY2tJbmNyZW1lbnQ9eCx0LnRpY2tTdGVwPXcsdC50cmFuc3Bvc2U9RSx0LnZhcmlhbmNlPWYsdC56aXA9ZnVuY3Rpb24oKXtyZXR1cm4gRShhcmd1bWVudHMpfSx0LmF4aXNUb3A9ZnVuY3Rpb24odCl7cmV0dXJuIEIoeix0KX0sdC5heGlzUmlnaHQ9ZnVuY3Rpb24odCl7cmV0dXJuIEIoUix0KX0sdC5heGlzQm90dG9tPWZ1bmN0aW9uKHQpe3JldHVybiBCKEwsdCl9LHQuYXhpc0xlZnQ9ZnVuY3Rpb24odCl7cmV0dXJuIEIoRCx0KX0sdC5icnVzaD1mdW5jdGlvbigpe3JldHVybiBSaSh3aSl9LHQuYnJ1c2hYPWZ1bmN0aW9uKCl7cmV0dXJuIFJpKG1pKX0sdC5icnVzaFk9ZnVuY3Rpb24oKXtyZXR1cm4gUmkoeGkpfSx0LmJydXNoU2VsZWN0aW9uPWZ1bmN0aW9uKHQpe3ZhciBuPXQuX19icnVzaDtyZXR1cm4gbj9uLmRpbS5vdXRwdXQobi5zZWxlY3Rpb24pOm51bGx9LHQuY2hvcmQ9ZnVuY3Rpb24oKXt2YXIgdD0wLG49bnVsbCxlPW51bGwscj1udWxsO2Z1bmN0aW9uIGkoaSl7dmFyIG8sYSx1LGYsYyxzLGw9aS5sZW5ndGgsaD1bXSxkPWcobCkscD1bXSx2PVtdLHk9di5ncm91cHM9bmV3IEFycmF5KGwpLF89bmV3IEFycmF5KGwqbCk7Zm9yKG89MCxjPS0xOysrYzxsOyl7Zm9yKGE9MCxzPS0xOysrczxsOylhKz1pW2NdW3NdO2gucHVzaChhKSxwLnB1c2goZyhsKSksbys9YX1mb3IobiYmZC5zb3J0KGZ1bmN0aW9uKHQsZSl7cmV0dXJuIG4oaFt0XSxoW2VdKX0pLGUmJnAuZm9yRWFjaChmdW5jdGlvbih0LG4pe3Quc29ydChmdW5jdGlvbih0LHIpe3JldHVybiBlKGlbbl1bdF0saVtuXVtyXSl9KX0pLGY9KG89WWkoMCxPaS10KmwpL28pP3Q6T2kvbCxhPTAsYz0tMTsrK2M8bDspe2Zvcih1PWEscz0tMTsrK3M8bDspe3ZhciBiPWRbY10sbT1wW2JdW3NdLHg9aVtiXVttXSx3PWEsTT1hKz14Km87X1ttKmwrYl09e2luZGV4OmIsc3ViaW5kZXg6bSxzdGFydEFuZ2xlOncsZW5kQW5nbGU6TSx2YWx1ZTp4fX15W2JdPXtpbmRleDpiLHN0YXJ0QW5nbGU6dSxlbmRBbmdsZTphLHZhbHVlOmhbYl19LGErPWZ9Zm9yKGM9LTE7KytjPGw7KWZvcihzPWMtMTsrK3M8bDspe3ZhciBBPV9bcypsK2NdLFQ9X1tjKmwrc107KEEudmFsdWV8fFQudmFsdWUpJiZ2LnB1c2goQS52YWx1ZTxULnZhbHVlP3tzb3VyY2U6VCx0YXJnZXQ6QX06e3NvdXJjZTpBLHRhcmdldDpUfSl9cmV0dXJuIHI/di5zb3J0KHIpOnZ9cmV0dXJuIGkucGFkQW5nbGU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9WWkoMCxuKSxpKTp0fSxpLnNvcnRHcm91cHM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49dCxpKTpufSxpLnNvcnRTdWJncm91cHM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9dCxpKTplfSxpLnNvcnRDaG9yZHM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG51bGw9PXQ/cj1udWxsOihuPXQscj1mdW5jdGlvbih0LGUpe3JldHVybiBuKHQuc291cmNlLnZhbHVlK3QudGFyZ2V0LnZhbHVlLGUuc291cmNlLnZhbHVlK2UudGFyZ2V0LnZhbHVlKX0pLl89dCxpKTpyJiZyLl87dmFyIG59LGl9LHQucmliYm9uPWZ1bmN0aW9uKCl7dmFyIHQ9Vmksbj0kaSxlPVdpLHI9WmksaT1RaSxvPW51bGw7ZnVuY3Rpb24gYSgpe3ZhciBhLHU9QmkuY2FsbChhcmd1bWVudHMpLGY9dC5hcHBseSh0aGlzLHUpLGM9bi5hcHBseSh0aGlzLHUpLHM9K2UuYXBwbHkodGhpcywodVswXT1mLHUpKSxsPXIuYXBwbHkodGhpcyx1KS1xaSxoPWkuYXBwbHkodGhpcyx1KS1xaSxkPXMqTGkobCkscD1zKkRpKGwpLHY9K2UuYXBwbHkodGhpcywodVswXT1jLHUpKSxnPXIuYXBwbHkodGhpcyx1KS1xaSx5PWkuYXBwbHkodGhpcyx1KS1xaTtpZihvfHwobz1hPUdpKCkpLG8ubW92ZVRvKGQscCksby5hcmMoMCwwLHMsbCxoKSxsPT09ZyYmaD09PXl8fChvLnF1YWRyYXRpY0N1cnZlVG8oMCwwLHYqTGkoZyksdipEaShnKSksby5hcmMoMCwwLHYsZyx5KSksby5xdWFkcmF0aWNDdXJ2ZVRvKDAsMCxkLHApLG8uY2xvc2VQYXRoKCksYSlyZXR1cm4gbz1udWxsLGErIiJ8fG51bGx9cmV0dXJuIGEucmFkaXVzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6RmkoK3QpLGEpOmV9LGEuc3RhcnRBbmdsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0iZnVuY3Rpb24iPT10eXBlb2YgdD90OkZpKCt0KSxhKTpyfSxhLmVuZEFuZ2xlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6RmkoK3QpLGEpOml9LGEuc291cmNlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PW4sYSk6dH0sYS50YXJnZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49dCxhKTpufSxhLmNvbnRleHQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89bnVsbD09dD9udWxsOnQsYSk6b30sYX0sdC5uZXN0PWZ1bmN0aW9uKCl7dmFyIHQsbixlLHI9W10saT1bXTtmdW5jdGlvbiBvKGUsaSxhLHUpe2lmKGk+PXIubGVuZ3RoKXJldHVybiBudWxsIT10JiZlLnNvcnQodCksbnVsbCE9bj9uKGUpOmU7Zm9yKHZhciBmLGMscyxsPS0xLGg9ZS5sZW5ndGgsZD1yW2krK10scD1LaSgpLHY9YSgpOysrbDxoOykocz1wLmdldChmPWQoYz1lW2xdKSsiIikpP3MucHVzaChjKTpwLnNldChmLFtjXSk7cmV0dXJuIHAuZWFjaChmdW5jdGlvbih0LG4pe3UodixuLG8odCxpLGEsdSkpfSksdn1yZXR1cm4gZT17b2JqZWN0OmZ1bmN0aW9uKHQpe3JldHVybiBvKHQsMCx0byxubyl9LG1hcDpmdW5jdGlvbih0KXtyZXR1cm4gbyh0LDAsZW8scm8pfSxlbnRyaWVzOmZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbiB0KGUsbyl7aWYoKytvPnIubGVuZ3RoKXJldHVybiBlO3ZhciBhLHU9aVtvLTFdO3JldHVybiBudWxsIT1uJiZvPj1yLmxlbmd0aD9hPWUuZW50cmllcygpOihhPVtdLGUuZWFjaChmdW5jdGlvbihuLGUpe2EucHVzaCh7a2V5OmUsdmFsdWVzOnQobixvKX0pfSkpLG51bGwhPXU/YS5zb3J0KGZ1bmN0aW9uKHQsbil7cmV0dXJuIHUodC5rZXksbi5rZXkpfSk6YX0obyh0LDAsZW8scm8pLDApfSxrZXk6ZnVuY3Rpb24odCl7cmV0dXJuIHIucHVzaCh0KSxlfSxzb3J0S2V5czpmdW5jdGlvbih0KXtyZXR1cm4gaVtyLmxlbmd0aC0xXT10LGV9LHNvcnRWYWx1ZXM6ZnVuY3Rpb24obil7cmV0dXJuIHQ9bixlfSxyb2xsdXA6ZnVuY3Rpb24odCl7cmV0dXJuIG49dCxlfX19LHQuc2V0PWFvLHQubWFwPUtpLHQua2V5cz1mdW5jdGlvbih0KXt2YXIgbj1bXTtmb3IodmFyIGUgaW4gdCluLnB1c2goZSk7cmV0dXJuIG59LHQudmFsdWVzPWZ1bmN0aW9uKHQpe3ZhciBuPVtdO2Zvcih2YXIgZSBpbiB0KW4ucHVzaCh0W2VdKTtyZXR1cm4gbn0sdC5lbnRyaWVzPWZ1bmN0aW9uKHQpe3ZhciBuPVtdO2Zvcih2YXIgZSBpbiB0KW4ucHVzaCh7a2V5OmUsdmFsdWU6dFtlXX0pO3JldHVybiBufSx0LmNvbG9yPXZuLHQucmdiPWJuLHQuaHNsPU1uLHQubGFiPVVuLHQuaGNsPUhuLHQubGNoPWZ1bmN0aW9uKHQsbixlLHIpe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD9Jbih0KTpuZXcgam4oZSxuLHQsbnVsbD09cj8xOnIpfSx0LmdyYXk9ZnVuY3Rpb24odCxuKXtyZXR1cm4gbmV3IHFuKHQsMCwwLG51bGw9PW4/MTpuKX0sdC5jdWJlaGVsaXg9S24sdC5jb250b3Vycz1nbyx0LmNvbnRvdXJEZW5zaXR5PWZ1bmN0aW9uKCl7dmFyIHQ9Ym8sbj1tbyxlPXhvLHI9OTYwLGk9NTAwLG89MjAsYT0yLHU9MypvLGY9cisyKnU+PmEsYz1pKzIqdT4+YSxzPWNvKDIwKTtmdW5jdGlvbiBsKHIpe3ZhciBpPW5ldyBGbG9hdDMyQXJyYXkoZipjKSxsPW5ldyBGbG9hdDMyQXJyYXkoZipjKTtyLmZvckVhY2goZnVuY3Rpb24ocixvLHMpe3ZhciBsPSt0KHIsbyxzKSt1Pj5hLGg9K24ocixvLHMpK3U+PmEsZD0rZShyLG8scyk7bD49MCYmbDxmJiZoPj0wJiZoPGMmJihpW2wraCpmXSs9ZCl9KSx5byh7d2lkdGg6ZixoZWlnaHQ6YyxkYXRhOml9LHt3aWR0aDpmLGhlaWdodDpjLGRhdGE6bH0sbz4+YSksX28oe3dpZHRoOmYsaGVpZ2h0OmMsZGF0YTpsfSx7d2lkdGg6ZixoZWlnaHQ6YyxkYXRhOml9LG8+PmEpLHlvKHt3aWR0aDpmLGhlaWdodDpjLGRhdGE6aX0se3dpZHRoOmYsaGVpZ2h0OmMsZGF0YTpsfSxvPj5hKSxfbyh7d2lkdGg6ZixoZWlnaHQ6YyxkYXRhOmx9LHt3aWR0aDpmLGhlaWdodDpjLGRhdGE6aX0sbz4+YSkseW8oe3dpZHRoOmYsaGVpZ2h0OmMsZGF0YTppfSx7d2lkdGg6ZixoZWlnaHQ6YyxkYXRhOmx9LG8+PmEpLF9vKHt3aWR0aDpmLGhlaWdodDpjLGRhdGE6bH0se3dpZHRoOmYsaGVpZ2h0OmMsZGF0YTppfSxvPj5hKTt2YXIgZD1zKGkpO2lmKCFBcnJheS5pc0FycmF5KGQpKXt2YXIgcD1UKGkpO2Q9dygwLHAsZCksKGQ9ZygwLE1hdGguZmxvb3IocC9kKSpkLGQpKS5zaGlmdCgpfXJldHVybiBnbygpLnRocmVzaG9sZHMoZCkuc2l6ZShbZixjXSkoaSkubWFwKGgpfWZ1bmN0aW9uIGgodCl7cmV0dXJuIHQudmFsdWUqPU1hdGgucG93KDIsLTIqYSksdC5jb29yZGluYXRlcy5mb3JFYWNoKGQpLHR9ZnVuY3Rpb24gZCh0KXt0LmZvckVhY2gocCl9ZnVuY3Rpb24gcCh0KXt0LmZvckVhY2godil9ZnVuY3Rpb24gdih0KXt0WzBdPXRbMF0qTWF0aC5wb3coMixhKS11LHRbMV09dFsxXSpNYXRoLnBvdygyLGEpLXV9ZnVuY3Rpb24geSgpe3JldHVybiBmPXIrMioodT0zKm8pPj5hLGM9aSsyKnU+PmEsbH1yZXR1cm4gbC54PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PSJmdW5jdGlvbiI9PXR5cGVvZiBuP246Y28oK24pLGwpOnR9LGwueT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj0iZnVuY3Rpb24iPT10eXBlb2YgdD90OmNvKCt0KSxsKTpufSxsLndlaWdodD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OmNvKCt0KSxsKTplfSxsLnNpemU9ZnVuY3Rpb24odCl7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuW3IsaV07dmFyIG49TWF0aC5jZWlsKHRbMF0pLGU9TWF0aC5jZWlsKHRbMV0pO2lmKCEobj49MHx8bj49MCkpdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIHNpemUiKTtyZXR1cm4gcj1uLGk9ZSx5KCl9LGwuY2VsbFNpemU9ZnVuY3Rpb24odCl7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIDE8PGE7aWYoISgodD0rdCk+PTEpKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBjZWxsIHNpemUiKTtyZXR1cm4gYT1NYXRoLmZsb29yKE1hdGgubG9nKHQpL01hdGguTE4yKSx5KCl9LGwudGhyZXNob2xkcz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocz0iZnVuY3Rpb24iPT10eXBlb2YgdD90OkFycmF5LmlzQXJyYXkodCk/Y28odW8uY2FsbCh0KSk6Y28odCksbCk6c30sbC5iYW5kd2lkdGg9ZnVuY3Rpb24odCl7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIE1hdGguc3FydChvKihvKzEpKTtpZighKCh0PSt0KT49MCkpdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGJhbmR3aWR0aCIpO3JldHVybiBvPU1hdGgucm91bmQoKE1hdGguc3FydCg0KnQqdCsxKS0xKS8yKSx5KCl9LGx9LHQuZGlzcGF0Y2g9SSx0LmRyYWc9ZnVuY3Rpb24oKXt2YXIgbixlLHIsaSxvPVd0LGE9WnQsdT1RdCxmPUp0LGM9e30scz1JKCJzdGFydCIsImRyYWciLCJlbmQiKSxsPTAsaD0wO2Z1bmN0aW9uIGQodCl7dC5vbigibW91c2Vkb3duLmRyYWciLHApLmZpbHRlcihmKS5vbigidG91Y2hzdGFydC5kcmFnIix5KS5vbigidG91Y2htb3ZlLmRyYWciLF8pLm9uKCJ0b3VjaGVuZC5kcmFnIHRvdWNoY2FuY2VsLmRyYWciLGIpLnN0eWxlKCJ0b3VjaC1hY3Rpb24iLCJub25lIikuc3R5bGUoIi13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvciIsInJnYmEoMCwwLDAsMCkiKX1mdW5jdGlvbiBwKCl7aWYoIWkmJm8uYXBwbHkodGhpcyxhcmd1bWVudHMpKXt2YXIgdT1tKCJtb3VzZSIsYS5hcHBseSh0aGlzLGFyZ3VtZW50cyksRnQsdGhpcyxhcmd1bWVudHMpO3UmJihEdCh0LmV2ZW50LnZpZXcpLm9uKCJtb3VzZW1vdmUuZHJhZyIsdiwhMCkub24oIm1vdXNldXAuZHJhZyIsZywhMCksWHQodC5ldmVudC52aWV3KSxIdCgpLHI9ITEsbj10LmV2ZW50LmNsaWVudFgsZT10LmV2ZW50LmNsaWVudFksdSgic3RhcnQiKSl9fWZ1bmN0aW9uIHYoKXtpZihqdCgpLCFyKXt2YXIgaT10LmV2ZW50LmNsaWVudFgtbixvPXQuZXZlbnQuY2xpZW50WS1lO3I9aSppK28qbz5ofWMubW91c2UoImRyYWciKX1mdW5jdGlvbiBnKCl7RHQodC5ldmVudC52aWV3KS5vbigibW91c2Vtb3ZlLmRyYWcgbW91c2V1cC5kcmFnIixudWxsKSxHdCh0LmV2ZW50LnZpZXcsciksanQoKSxjLm1vdXNlKCJlbmQiKX1mdW5jdGlvbiB5KCl7aWYoby5hcHBseSh0aGlzLGFyZ3VtZW50cykpe3ZhciBuLGUscj10LmV2ZW50LmNoYW5nZWRUb3VjaGVzLGk9YS5hcHBseSh0aGlzLGFyZ3VtZW50cyksdT1yLmxlbmd0aDtmb3Iobj0wO248dTsrK24pKGU9bShyW25dLmlkZW50aWZpZXIsaSxJdCx0aGlzLGFyZ3VtZW50cykpJiYoSHQoKSxlKCJzdGFydCIpKX19ZnVuY3Rpb24gXygpe3ZhciBuLGUscj10LmV2ZW50LmNoYW5nZWRUb3VjaGVzLGk9ci5sZW5ndGg7Zm9yKG49MDtuPGk7KytuKShlPWNbcltuXS5pZGVudGlmaWVyXSkmJihqdCgpLGUoImRyYWciKSl9ZnVuY3Rpb24gYigpe3ZhciBuLGUscj10LmV2ZW50LmNoYW5nZWRUb3VjaGVzLG89ci5sZW5ndGg7Zm9yKGkmJmNsZWFyVGltZW91dChpKSxpPXNldFRpbWVvdXQoZnVuY3Rpb24oKXtpPW51bGx9LDUwMCksbj0wO248bzsrK24pKGU9Y1tyW25dLmlkZW50aWZpZXJdKSYmKEh0KCksZSgiZW5kIikpfWZ1bmN0aW9uIG0obixlLHIsaSxvKXt2YXIgYSxmLGgscD1yKGUsbiksdj1zLmNvcHkoKTtpZihDdChuZXcgJHQoZCwiYmVmb3Jlc3RhcnQiLGEsbixsLHBbMF0scFsxXSwwLDAsdiksZnVuY3Rpb24oKXtyZXR1cm4gbnVsbCE9KHQuZXZlbnQuc3ViamVjdD1hPXUuYXBwbHkoaSxvKSkmJihmPWEueC1wWzBdfHwwLGg9YS55LXBbMV18fDAsITApfSkpcmV0dXJuIGZ1bmN0aW9uIHQodSl7dmFyIHMsZz1wO3N3aXRjaCh1KXtjYXNlInN0YXJ0IjpjW25dPXQscz1sKys7YnJlYWs7Y2FzZSJlbmQiOmRlbGV0ZSBjW25dLC0tbDtjYXNlImRyYWciOnA9cihlLG4pLHM9bH1DdChuZXcgJHQoZCx1LGEsbixzLHBbMF0rZixwWzFdK2gscFswXS1nWzBdLHBbMV0tZ1sxXSx2KSx2LmFwcGx5LHYsW3UsaSxvXSl9fXJldHVybiBkLmZpbHRlcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlZ0KCEhdCksZCk6b30sZC5jb250YWluZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpWdCh0KSxkKTphfSxkLnN1YmplY3Q9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpWdCh0KSxkKTp1fSxkLnRvdWNoYWJsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZj0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlZ0KCEhdCksZCk6Zn0sZC5vbj1mdW5jdGlvbigpe3ZhciB0PXMub24uYXBwbHkocyxhcmd1bWVudHMpO3JldHVybiB0PT09cz9kOnR9LGQuY2xpY2tEaXN0YW5jZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaD0odD0rdCkqdCxkKTpNYXRoLnNxcnQoaCl9LGR9LHQuZHJhZ0Rpc2FibGU9WHQsdC5kcmFnRW5hYmxlPUd0LHQuZHN2Rm9ybWF0PUVvLHQuY3N2UGFyc2U9Q28sdC5jc3ZQYXJzZVJvd3M9UG8sdC5jc3ZGb3JtYXQ9em8sdC5jc3ZGb3JtYXRSb3dzPVJvLHQudHN2UGFyc2U9RG8sdC50c3ZQYXJzZVJvd3M9VW8sdC50c3ZGb3JtYXQ9cW8sdC50c3ZGb3JtYXRSb3dzPU9vLHQuZWFzZUxpbmVhcj1mdW5jdGlvbih0KXtyZXR1cm4rdH0sdC5lYXNlUXVhZD1Ecix0LmVhc2VRdWFkSW49ZnVuY3Rpb24odCl7cmV0dXJuIHQqdH0sdC5lYXNlUXVhZE91dD1mdW5jdGlvbih0KXtyZXR1cm4gdCooMi10KX0sdC5lYXNlUXVhZEluT3V0PURyLHQuZWFzZUN1YmljPVVyLHQuZWFzZUN1YmljSW49ZnVuY3Rpb24odCl7cmV0dXJuIHQqdCp0fSx0LmVhc2VDdWJpY091dD1mdW5jdGlvbih0KXtyZXR1cm4tLXQqdCp0KzF9LHQuZWFzZUN1YmljSW5PdXQ9VXIsdC5lYXNlUG9seT1Zcix0LmVhc2VQb2x5SW49cXIsdC5lYXNlUG9seU91dD1Pcix0LmVhc2VQb2x5SW5PdXQ9WXIsdC5lYXNlU2luPUlyLHQuZWFzZVNpbkluPWZ1bmN0aW9uKHQpe3JldHVybiAxLU1hdGguY29zKHQqRnIpfSx0LmVhc2VTaW5PdXQ9ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGguc2luKHQqRnIpfSx0LmVhc2VTaW5Jbk91dD1Jcix0LmVhc2VFeHA9SHIsdC5lYXNlRXhwSW49ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGgucG93KDIsMTAqdC0xMCl9LHQuZWFzZUV4cE91dD1mdW5jdGlvbih0KXtyZXR1cm4gMS1NYXRoLnBvdygyLC0xMCp0KX0sdC5lYXNlRXhwSW5PdXQ9SHIsdC5lYXNlQ2lyY2xlPWpyLHQuZWFzZUNpcmNsZUluPWZ1bmN0aW9uKHQpe3JldHVybiAxLU1hdGguc3FydCgxLXQqdCl9LHQuZWFzZUNpcmNsZU91dD1mdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5zcXJ0KDEtIC0tdCp0KX0sdC5lYXNlQ2lyY2xlSW5PdXQ9anIsdC5lYXNlQm91bmNlPW5pLHQuZWFzZUJvdW5jZUluPWZ1bmN0aW9uKHQpe3JldHVybiAxLW5pKDEtdCl9LHQuZWFzZUJvdW5jZU91dD1uaSx0LmVhc2VCb3VuY2VJbk91dD1mdW5jdGlvbih0KXtyZXR1cm4oKHQqPTIpPD0xPzEtbmkoMS10KTpuaSh0LTEpKzEpLzJ9LHQuZWFzZUJhY2s9aWksdC5lYXNlQmFja0luPWVpLHQuZWFzZUJhY2tPdXQ9cmksdC5lYXNlQmFja0luT3V0PWlpLHQuZWFzZUVsYXN0aWM9dWksdC5lYXNlRWxhc3RpY0luPWFpLHQuZWFzZUVsYXN0aWNPdXQ9dWksdC5lYXNlRWxhc3RpY0luT3V0PWZpLHQuYmxvYj1mdW5jdGlvbih0LG4pe3JldHVybiBmZXRjaCh0LG4pLnRoZW4oWW8pfSx0LmJ1ZmZlcj1mdW5jdGlvbih0LG4pe3JldHVybiBmZXRjaCh0LG4pLnRoZW4oQm8pfSx0LmRzdj1mdW5jdGlvbih0LG4sZSxyKXszPT09YXJndW1lbnRzLmxlbmd0aCYmImZ1bmN0aW9uIj09dHlwZW9mIGUmJihyPWUsZT12b2lkIDApO3ZhciBpPUVvKHQpO3JldHVybiBJbyhuLGUpLnRoZW4oZnVuY3Rpb24odCl7cmV0dXJuIGkucGFyc2UodCxyKX0pfSx0LmNzdj1qbyx0LnRzdj1Ybyx0LmltYWdlPWZ1bmN0aW9uKHQsbil7cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKGUscil7dmFyIGk9bmV3IEltYWdlO2Zvcih2YXIgbyBpbiBuKWlbb109bltvXTtpLm9uZXJyb3I9cixpLm9ubG9hZD1mdW5jdGlvbigpe2UoaSl9LGkuc3JjPXR9KX0sdC5qc29uPWZ1bmN0aW9uKHQsbil7cmV0dXJuIGZldGNoKHQsbikudGhlbihHbyl9LHQudGV4dD1Jbyx0LnhtbD0kbyx0Lmh0bWw9V28sdC5zdmc9Wm8sdC5mb3JjZUNlbnRlcj1mdW5jdGlvbih0LG4pe3ZhciBlO2Z1bmN0aW9uIHIoKXt2YXIgcixpLG89ZS5sZW5ndGgsYT0wLHU9MDtmb3Iocj0wO3I8bzsrK3IpYSs9KGk9ZVtyXSkueCx1Kz1pLnk7Zm9yKGE9YS9vLXQsdT11L28tbixyPTA7cjxvOysrcikoaT1lW3JdKS54LT1hLGkueS09dX1yZXR1cm4gbnVsbD09dCYmKHQ9MCksbnVsbD09biYmKG49MCksci5pbml0aWFsaXplPWZ1bmN0aW9uKHQpe2U9dH0sci54PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PStuLHIpOnR9LHIueT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj0rdCxyKTpufSxyfSx0LmZvcmNlQ29sbGlkZT1mdW5jdGlvbih0KXt2YXIgbixlLHI9MSxpPTE7ZnVuY3Rpb24gbygpe2Zvcih2YXIgdCxvLHUsZixjLHMsbCxoPW4ubGVuZ3RoLGQ9MDtkPGk7KytkKWZvcihvPXJhKG4sdWEsZmEpLnZpc2l0QWZ0ZXIoYSksdD0wO3Q8aDsrK3QpdT1uW3RdLHM9ZVt1LmluZGV4XSxsPXMqcyxmPXUueCt1LnZ4LGM9dS55K3Uudnksby52aXNpdChwKTtmdW5jdGlvbiBwKHQsbixlLGksbyl7dmFyIGE9dC5kYXRhLGg9dC5yLGQ9cytoO2lmKCFhKXJldHVybiBuPmYrZHx8aTxmLWR8fGU+YytkfHxvPGMtZDtpZihhLmluZGV4PnUuaW5kZXgpe3ZhciBwPWYtYS54LWEudngsdj1jLWEueS1hLnZ5LGc9cCpwK3YqdjtnPGQqZCYmKDA9PT1wJiYoZys9KHA9Sm8oKSkqcCksMD09PXYmJihnKz0odj1KbygpKSp2KSxnPShkLShnPU1hdGguc3FydChnKSkpL2cqcix1LnZ4Kz0ocCo9ZykqKGQ9KGgqPWgpLyhsK2gpKSx1LnZ5Kz0odio9ZykqZCxhLnZ4LT1wKihkPTEtZCksYS52eS09dipkKX19fWZ1bmN0aW9uIGEodCl7aWYodC5kYXRhKXJldHVybiB0LnI9ZVt0LmRhdGEuaW5kZXhdO2Zvcih2YXIgbj10LnI9MDtuPDQ7KytuKXRbbl0mJnRbbl0ucj50LnImJih0LnI9dFtuXS5yKX1mdW5jdGlvbiB1KCl7aWYobil7dmFyIHIsaSxvPW4ubGVuZ3RoO2ZvcihlPW5ldyBBcnJheShvKSxyPTA7cjxvOysrcilpPW5bcl0sZVtpLmluZGV4XT0rdChpLHIsbil9fXJldHVybiJmdW5jdGlvbiIhPXR5cGVvZiB0JiYodD1RbyhudWxsPT10PzE6K3QpKSxvLmluaXRpYWxpemU9ZnVuY3Rpb24odCl7bj10LHUoKX0sby5pdGVyYXRpb25zPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSt0LG8pOml9LG8uc3RyZW5ndGg9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9K3Qsbyk6cn0sby5yYWRpdXM9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpRbygrbiksdSgpLG8pOnR9LG99LHQuZm9yY2VMaW5rPWZ1bmN0aW9uKHQpe3ZhciBuLGUscixpLG8sYT1jYSx1PWZ1bmN0aW9uKHQpe3JldHVybiAxL01hdGgubWluKGlbdC5zb3VyY2UuaW5kZXhdLGlbdC50YXJnZXQuaW5kZXhdKX0sZj1RbygzMCksYz0xO2Z1bmN0aW9uIHMocil7Zm9yKHZhciBpPTAsYT10Lmxlbmd0aDtpPGM7KytpKWZvcih2YXIgdSxmLHMsbCxoLGQscCx2PTA7djxhOysrdilmPSh1PXRbdl0pLnNvdXJjZSxsPShzPXUudGFyZ2V0KS54K3MudngtZi54LWYudnh8fEpvKCksaD1zLnkrcy52eS1mLnktZi52eXx8Sm8oKSxsKj1kPSgoZD1NYXRoLnNxcnQobCpsK2gqaCkpLWVbdl0pL2QqcipuW3ZdLGgqPWQscy52eC09bCoocD1vW3ZdKSxzLnZ5LT1oKnAsZi52eCs9bCoocD0xLXApLGYudnkrPWgqcH1mdW5jdGlvbiBsKCl7aWYocil7dmFyIHUsZixjPXIubGVuZ3RoLHM9dC5sZW5ndGgsbD1LaShyLGEpO2Zvcih1PTAsaT1uZXcgQXJyYXkoYyk7dTxzOysrdSkoZj10W3VdKS5pbmRleD11LCJvYmplY3QiIT10eXBlb2YgZi5zb3VyY2UmJihmLnNvdXJjZT1zYShsLGYuc291cmNlKSksIm9iamVjdCIhPXR5cGVvZiBmLnRhcmdldCYmKGYudGFyZ2V0PXNhKGwsZi50YXJnZXQpKSxpW2Yuc291cmNlLmluZGV4XT0oaVtmLnNvdXJjZS5pbmRleF18fDApKzEsaVtmLnRhcmdldC5pbmRleF09KGlbZi50YXJnZXQuaW5kZXhdfHwwKSsxO2Zvcih1PTAsbz1uZXcgQXJyYXkocyk7dTxzOysrdSlmPXRbdV0sb1t1XT1pW2Yuc291cmNlLmluZGV4XS8oaVtmLnNvdXJjZS5pbmRleF0raVtmLnRhcmdldC5pbmRleF0pO249bmV3IEFycmF5KHMpLGgoKSxlPW5ldyBBcnJheShzKSxkKCl9fWZ1bmN0aW9uIGgoKXtpZihyKWZvcih2YXIgZT0wLGk9dC5sZW5ndGg7ZTxpOysrZSluW2VdPSt1KHRbZV0sZSx0KX1mdW5jdGlvbiBkKCl7aWYocilmb3IodmFyIG49MCxpPXQubGVuZ3RoO248aTsrK24pZVtuXT0rZih0W25dLG4sdCl9cmV0dXJuIG51bGw9PXQmJih0PVtdKSxzLmluaXRpYWxpemU9ZnVuY3Rpb24odCl7cj10LGwoKX0scy5saW5rcz1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1uLGwoKSxzKTp0fSxzLmlkPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPXQscyk6YX0scy5pdGVyYXRpb25zPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjPSt0LHMpOmN9LHMuc3RyZW5ndGg9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpRbygrdCksaCgpLHMpOnV9LHMuZGlzdGFuY2U9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGY9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpRbygrdCksZCgpLHMpOmZ9LHN9LHQuZm9yY2VNYW55Qm9keT1mdW5jdGlvbigpe3ZhciB0LG4sZSxyLGk9UW8oLTMwKSxvPTEsYT0xLzAsdT0uODE7ZnVuY3Rpb24gZihyKXt2YXIgaSxvPXQubGVuZ3RoLGE9cmEodCxsYSxoYSkudmlzaXRBZnRlcihzKTtmb3IoZT1yLGk9MDtpPG87KytpKW49dFtpXSxhLnZpc2l0KGwpfWZ1bmN0aW9uIGMoKXtpZih0KXt2YXIgbixlLG89dC5sZW5ndGg7Zm9yKHI9bmV3IEFycmF5KG8pLG49MDtuPG87KytuKWU9dFtuXSxyW2UuaW5kZXhdPStpKGUsbix0KX19ZnVuY3Rpb24gcyh0KXt2YXIgbixlLGksbyxhLHU9MCxmPTA7aWYodC5sZW5ndGgpe2ZvcihpPW89YT0wO2E8NDsrK2EpKG49dFthXSkmJihlPU1hdGguYWJzKG4udmFsdWUpKSYmKHUrPW4udmFsdWUsZis9ZSxpKz1lKm4ueCxvKz1lKm4ueSk7dC54PWkvZix0Lnk9by9mfWVsc2V7KG49dCkueD1uLmRhdGEueCxuLnk9bi5kYXRhLnk7ZG97dSs9cltuLmRhdGEuaW5kZXhdfXdoaWxlKG49bi5uZXh0KX10LnZhbHVlPXV9ZnVuY3Rpb24gbCh0LGksZixjKXtpZighdC52YWx1ZSlyZXR1cm4hMDt2YXIgcz10Lngtbi54LGw9dC55LW4ueSxoPWMtaSxkPXMqcytsKmw7aWYoaCpoL3U8ZClyZXR1cm4gZDxhJiYoMD09PXMmJihkKz0ocz1KbygpKSpzKSwwPT09bCYmKGQrPShsPUpvKCkpKmwpLGQ8byYmKGQ9TWF0aC5zcXJ0KG8qZCkpLG4udngrPXMqdC52YWx1ZSplL2Qsbi52eSs9bCp0LnZhbHVlKmUvZCksITA7aWYoISh0Lmxlbmd0aHx8ZD49YSkpeyh0LmRhdGEhPT1ufHx0Lm5leHQpJiYoMD09PXMmJihkKz0ocz1KbygpKSpzKSwwPT09bCYmKGQrPShsPUpvKCkpKmwpLGQ8byYmKGQ9TWF0aC5zcXJ0KG8qZCkpKTtkb3t0LmRhdGEhPT1uJiYoaD1yW3QuZGF0YS5pbmRleF0qZS9kLG4udngrPXMqaCxuLnZ5Kz1sKmgpfXdoaWxlKHQ9dC5uZXh0KX19cmV0dXJuIGYuaW5pdGlhbGl6ZT1mdW5jdGlvbihuKXt0PW4sYygpfSxmLnN0cmVuZ3RoPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6UW8oK3QpLGMoKSxmKTppfSxmLmRpc3RhbmNlTWluPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPXQqdCxmKTpNYXRoLnNxcnQobyl9LGYuZGlzdGFuY2VNYXg9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9dCp0LGYpOk1hdGguc3FydChhKX0sZi50aGV0YT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT10KnQsZik6TWF0aC5zcXJ0KHUpfSxmfSx0LmZvcmNlUmFkaWFsPWZ1bmN0aW9uKHQsbixlKXt2YXIgcixpLG8sYT1RbyguMSk7ZnVuY3Rpb24gdSh0KXtmb3IodmFyIGE9MCx1PXIubGVuZ3RoO2E8dTsrK2Epe3ZhciBmPXJbYV0sYz1mLngtbnx8MWUtNixzPWYueS1lfHwxZS02LGw9TWF0aC5zcXJ0KGMqYytzKnMpLGg9KG9bYV0tbCkqaVthXSp0L2w7Zi52eCs9YypoLGYudnkrPXMqaH19ZnVuY3Rpb24gZigpe2lmKHIpe3ZhciBuLGU9ci5sZW5ndGg7Zm9yKGk9bmV3IEFycmF5KGUpLG89bmV3IEFycmF5KGUpLG49MDtuPGU7KytuKW9bbl09K3QocltuXSxuLHIpLGlbbl09aXNOYU4ob1tuXSk/MDorYShyW25dLG4scil9fXJldHVybiJmdW5jdGlvbiIhPXR5cGVvZiB0JiYodD1RbygrdCkpLG51bGw9PW4mJihuPTApLG51bGw9PWUmJihlPTApLHUuaW5pdGlhbGl6ZT1mdW5jdGlvbih0KXtyPXQsZigpfSx1LnN0cmVuZ3RoPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6UW8oK3QpLGYoKSx1KTphfSx1LnJhZGl1cz1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOlFvKCtuKSxmKCksdSk6dH0sdS54PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPSt0LHUpOm59LHUueT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT0rdCx1KTplfSx1fSx0LmZvcmNlU2ltdWxhdGlvbj1mdW5jdGlvbih0KXt2YXIgbixlPTEscj0uMDAxLGk9MS1NYXRoLnBvdyhyLDEvMzAwKSxvPTAsYT0uNix1PUtpKCksZj11cihzKSxjPUkoInRpY2siLCJlbmQiKTtmdW5jdGlvbiBzKCl7bCgpLGMuY2FsbCgidGljayIsbiksZTxyJiYoZi5zdG9wKCksYy5jYWxsKCJlbmQiLG4pKX1mdW5jdGlvbiBsKCl7dmFyIG4scixmPXQubGVuZ3RoO2ZvcihlKz0oby1lKSppLHUuZWFjaChmdW5jdGlvbih0KXt0KGUpfSksbj0wO248ZjsrK24pbnVsbD09KHI9dFtuXSkuZng/ci54Kz1yLnZ4Kj1hOihyLng9ci5meCxyLnZ4PTApLG51bGw9PXIuZnk/ci55Kz1yLnZ5Kj1hOihyLnk9ci5meSxyLnZ5PTApfWZ1bmN0aW9uIGgoKXtmb3IodmFyIG4sZT0wLHI9dC5sZW5ndGg7ZTxyOysrZSl7aWYoKG49dFtlXSkuaW5kZXg9ZSxpc05hTihuLngpfHxpc05hTihuLnkpKXt2YXIgaT1kYSpNYXRoLnNxcnQoZSksbz1lKnBhO24ueD1pKk1hdGguY29zKG8pLG4ueT1pKk1hdGguc2luKG8pfShpc05hTihuLnZ4KXx8aXNOYU4obi52eSkpJiYobi52eD1uLnZ5PTApfX1mdW5jdGlvbiBkKG4pe3JldHVybiBuLmluaXRpYWxpemUmJm4uaW5pdGlhbGl6ZSh0KSxufXJldHVybiBudWxsPT10JiYodD1bXSksaCgpLG49e3RpY2s6bCxyZXN0YXJ0OmZ1bmN0aW9uKCl7cmV0dXJuIGYucmVzdGFydChzKSxufSxzdG9wOmZ1bmN0aW9uKCl7cmV0dXJuIGYuc3RvcCgpLG59LG5vZGVzOmZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PWUsaCgpLHUuZWFjaChkKSxuKTp0fSxhbHBoYTpmdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT0rdCxuKTplfSxhbHBoYU1pbjpmdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0rdCxuKTpyfSxhbHBoYURlY2F5OmZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSt0LG4pOitpfSxhbHBoYVRhcmdldDpmdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz0rdCxuKTpvfSx2ZWxvY2l0eURlY2F5OmZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPTEtdCxuKToxLWF9LGZvcmNlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg+MT8obnVsbD09ZT91LnJlbW92ZSh0KTp1LnNldCh0LGQoZSkpLG4pOnUuZ2V0KHQpfSxmaW5kOmZ1bmN0aW9uKG4sZSxyKXt2YXIgaSxvLGEsdSxmLGM9MCxzPXQubGVuZ3RoO2ZvcihudWxsPT1yP3I9MS8wOnIqPXIsYz0wO2M8czsrK2MpKGE9KGk9bi0odT10W2NdKS54KSppKyhvPWUtdS55KSpvKTxyJiYoZj11LHI9YSk7cmV0dXJuIGZ9LG9uOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg+MT8oYy5vbih0LGUpLG4pOmMub24odCl9fX0sdC5mb3JjZVg9ZnVuY3Rpb24odCl7dmFyIG4sZSxyLGk9UW8oLjEpO2Z1bmN0aW9uIG8odCl7Zm9yKHZhciBpLG89MCxhPW4ubGVuZ3RoO288YTsrK28pKGk9bltvXSkudngrPShyW29dLWkueCkqZVtvXSp0fWZ1bmN0aW9uIGEoKXtpZihuKXt2YXIgbyxhPW4ubGVuZ3RoO2ZvcihlPW5ldyBBcnJheShhKSxyPW5ldyBBcnJheShhKSxvPTA7bzxhOysrbyllW29dPWlzTmFOKHJbb109K3QobltvXSxvLG4pKT8wOitpKG5bb10sbyxuKX19cmV0dXJuImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PVFvKG51bGw9PXQ/MDordCkpLG8uaW5pdGlhbGl6ZT1mdW5jdGlvbih0KXtuPXQsYSgpfSxvLnN0cmVuZ3RoPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6UW8oK3QpLGEoKSxvKTppfSxvLng9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpRbygrbiksYSgpLG8pOnR9LG99LHQuZm9yY2VZPWZ1bmN0aW9uKHQpe3ZhciBuLGUscixpPVFvKC4xKTtmdW5jdGlvbiBvKHQpe2Zvcih2YXIgaSxvPTAsYT1uLmxlbmd0aDtvPGE7KytvKShpPW5bb10pLnZ5Kz0ocltvXS1pLnkpKmVbb10qdH1mdW5jdGlvbiBhKCl7aWYobil7dmFyIG8sYT1uLmxlbmd0aDtmb3IoZT1uZXcgQXJyYXkoYSkscj1uZXcgQXJyYXkoYSksbz0wO288YTsrK28pZVtvXT1pc05hTihyW29dPSt0KG5bb10sbyxuKSk/MDoraShuW29dLG8sbil9fXJldHVybiJmdW5jdGlvbiIhPXR5cGVvZiB0JiYodD1RbyhudWxsPT10PzA6K3QpKSxvLmluaXRpYWxpemU9ZnVuY3Rpb24odCl7bj10LGEoKX0sby5zdHJlbmd0aD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlFvKCt0KSxhKCksbyk6aX0sby55PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PSJmdW5jdGlvbiI9PXR5cGVvZiBuP246UW8oK24pLGEoKSxvKTp0fSxvfSx0LmZvcm1hdERlZmF1bHRMb2NhbGU9U2EsdC5mb3JtYXRMb2NhbGU9TmEsdC5mb3JtYXRTcGVjaWZpZXI9YmEsdC5wcmVjaXNpb25GaXhlZD1FYSx0LnByZWNpc2lvblByZWZpeD1rYSx0LnByZWNpc2lvblJvdW5kPUNhLHQuZ2VvQXJlYT1mdW5jdGlvbih0KXtyZXR1cm4geXUucmVzZXQoKSxzdSh0LF91KSwyKnl1fSx0Lmdlb0JvdW5kcz1mdW5jdGlvbih0KXt2YXIgbixlLHIsaSxvLGEsdTtpZihSdT16dT0tKEN1PVB1PTEvMCksT3U9W10sc3UodCxyZiksZT1PdS5sZW5ndGgpe2ZvcihPdS5zb3J0KGRmKSxuPTEsbz1bcj1PdVswXV07bjxlOysrbilwZihyLChpPU91W25dKVswXSl8fHBmKHIsaVsxXSk/KGhmKHJbMF0saVsxXSk+aGYoclswXSxyWzFdKSYmKHJbMV09aVsxXSksaGYoaVswXSxyWzFdKT5oZihyWzBdLHJbMV0pJiYoclswXT1pWzBdKSk6by5wdXNoKHI9aSk7Zm9yKGE9LTEvMCxuPTAscj1vW2U9by5sZW5ndGgtMV07bjw9ZTtyPWksKytuKWk9b1tuXSwodT1oZihyWzFdLGlbMF0pKT5hJiYoYT11LEN1PWlbMF0senU9clsxXSl9cmV0dXJuIE91PVl1PW51bGwsQ3U9PT0xLzB8fFB1PT09MS8wP1tbTmFOLE5hTl0sW05hTixOYU5dXTpbW0N1LFB1XSxbenUsUnVdXX0sdC5nZW9DZW50cm9pZD1mdW5jdGlvbih0KXtCdT1GdT1JdT1IdT1qdT1YdT1HdT1WdT0kdT1XdT1adT0wLHN1KHQsdmYpO3ZhciBuPSR1LGU9V3Uscj1adSxpPW4qbitlKmUrcipyO3JldHVybiBpPFVhJiYobj1YdSxlPUd1LHI9VnUsRnU8RGEmJihuPUl1LGU9SHUscj1qdSksKGk9bipuK2UqZStyKnIpPFVhKT9bTmFOLE5hTl06W1hhKGUsbikqRmEsZXUoci9LYShpKSkqRmFdfSx0Lmdlb0NpcmNsZT1mdW5jdGlvbigpe3ZhciB0LG4sZT1OZihbMCwwXSkscj1OZig5MCksaT1OZig2KSxvPXtwb2ludDpmdW5jdGlvbihlLHIpe3QucHVzaChlPW4oZSxyKSksZVswXSo9RmEsZVsxXSo9RmF9fTtmdW5jdGlvbiBhKCl7dmFyIGE9ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyksdT1yLmFwcGx5KHRoaXMsYXJndW1lbnRzKSpJYSxmPWkuYXBwbHkodGhpcyxhcmd1bWVudHMpKklhO3JldHVybiB0PVtdLG49a2YoLWFbMF0qSWEsLWFbMV0qSWEsMCkuaW52ZXJ0LExmKG8sdSxmLDEpLGE9e3R5cGU6IlBvbHlnb24iLGNvb3JkaW5hdGVzOlt0XX0sdD1uPW51bGwsYX1yZXR1cm4gYS5jZW50ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpOZihbK3RbMF0sK3RbMV1dKSxhKTplfSxhLnJhZGl1cz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0iZnVuY3Rpb24iPT10eXBlb2YgdD90Ok5mKCt0KSxhKTpyfSxhLnByZWNpc2lvbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0iZnVuY3Rpb24iPT10eXBlb2YgdD90Ok5mKCt0KSxhKTppfSxhfSx0Lmdlb0NsaXBBbnRpbWVyaWRpYW49R2YsdC5nZW9DbGlwQ2lyY2xlPVZmLHQuZ2VvQ2xpcEV4dGVudD1mdW5jdGlvbigpe3ZhciB0LG4sZSxyPTAsaT0wLG89OTYwLGE9NTAwO3JldHVybiBlPXtzdHJlYW06ZnVuY3Rpb24oZSl7cmV0dXJuIHQmJm49PT1lP3Q6dD1aZihyLGksbyxhKShuPWUpfSxleHRlbnQ6ZnVuY3Rpb24odSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9K3VbMF1bMF0saT0rdVswXVsxXSxvPSt1WzFdWzBdLGE9K3VbMV1bMV0sdD1uPW51bGwsZSk6W1tyLGldLFtvLGFdXX19fSx0Lmdlb0NsaXBSZWN0YW5nbGU9WmYsdC5nZW9Db250YWlucz1mdW5jdGlvbih0LG4pe3JldHVybih0JiZjYy5oYXNPd25Qcm9wZXJ0eSh0LnR5cGUpP2NjW3QudHlwZV06bGMpKHQsbil9LHQuZ2VvRGlzdGFuY2U9ZmMsdC5nZW9HcmF0aWN1bGU9YmMsdC5nZW9HcmF0aWN1bGUxMD1mdW5jdGlvbigpe3JldHVybiBiYygpKCl9LHQuZ2VvSW50ZXJwb2xhdGU9ZnVuY3Rpb24odCxuKXt2YXIgZT10WzBdKklhLHI9dFsxXSpJYSxpPW5bMF0qSWEsbz1uWzFdKklhLGE9R2EociksdT1RYShyKSxmPUdhKG8pLGM9UWEobykscz1hKkdhKGUpLGw9YSpRYShlKSxoPWYqR2EoaSksZD1mKlFhKGkpLHA9MipldShLYShydShvLXIpK2EqZipydShpLWUpKSksdj1RYShwKSxnPXA/ZnVuY3Rpb24odCl7dmFyIG49UWEodCo9cCkvdixlPVFhKHAtdCkvdixyPWUqcytuKmgsaT1lKmwrbipkLG89ZSp1K24qYztyZXR1cm5bWGEoaSxyKSpGYSxYYShvLEthKHIqcitpKmkpKSpGYV19OmZ1bmN0aW9uKCl7cmV0dXJuW2UqRmEscipGYV19O3JldHVybiBnLmRpc3RhbmNlPXAsZ30sdC5nZW9MZW5ndGg9b2MsdC5nZW9QYXRoPWZ1bmN0aW9uKHQsbil7dmFyIGUscixpPTQuNTtmdW5jdGlvbiBvKHQpe3JldHVybiB0JiYoImZ1bmN0aW9uIj09dHlwZW9mIGkmJnIucG9pbnRSYWRpdXMoK2kuYXBwbHkodGhpcyxhcmd1bWVudHMpKSxzdSh0LGUocikpKSxyLnJlc3VsdCgpfXJldHVybiBvLmFyZWE9ZnVuY3Rpb24odCl7cmV0dXJuIHN1KHQsZShTYykpLFNjLnJlc3VsdCgpfSxvLm1lYXN1cmU9ZnVuY3Rpb24odCl7cmV0dXJuIHN1KHQsZShkcykpLGRzLnJlc3VsdCgpfSxvLmJvdW5kcz1mdW5jdGlvbih0KXtyZXR1cm4gc3UodCxlKFVjKSksVWMucmVzdWx0KCl9LG8uY2VudHJvaWQ9ZnVuY3Rpb24odCl7cmV0dXJuIHN1KHQsZShaYykpLFpjLnJlc3VsdCgpfSxvLnByb2plY3Rpb249ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9bnVsbD09bj8odD1udWxsLG1jKToodD1uKS5zdHJlYW0sbyk6dH0sby5jb250ZXh0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPW51bGw9PXQ/KG49bnVsbCxuZXcgZ3MpOm5ldyBhcyhuPXQpLCJmdW5jdGlvbiIhPXR5cGVvZiBpJiZyLnBvaW50UmFkaXVzKGkpLG8pOm59LG8ucG9pbnRSYWRpdXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDooci5wb2ludFJhZGl1cygrdCksK3QpLG8pOml9LG8ucHJvamVjdGlvbih0KS5jb250ZXh0KG4pfSx0Lmdlb0FsYmVycz1Ecyx0Lmdlb0FsYmVyc1VzYT1mdW5jdGlvbigpe3ZhciB0LG4sZSxyLGksbyxhPURzKCksdT1McygpLnJvdGF0ZShbMTU0LDBdKS5jZW50ZXIoWy0yLDU4LjVdKS5wYXJhbGxlbHMoWzU1LDY1XSksZj1McygpLnJvdGF0ZShbMTU3LDBdKS5jZW50ZXIoWy0zLDE5LjldKS5wYXJhbGxlbHMoWzgsMThdKSxjPXtwb2ludDpmdW5jdGlvbih0LG4pe289W3Qsbl19fTtmdW5jdGlvbiBzKHQpe3ZhciBuPXRbMF0sYT10WzFdO3JldHVybiBvPW51bGwsZS5wb2ludChuLGEpLG98fChyLnBvaW50KG4sYSksbyl8fChpLnBvaW50KG4sYSksbyl9ZnVuY3Rpb24gbCgpe3JldHVybiB0PW49bnVsbCxzfXJldHVybiBzLmludmVydD1mdW5jdGlvbih0KXt2YXIgbj1hLnNjYWxlKCksZT1hLnRyYW5zbGF0ZSgpLHI9KHRbMF0tZVswXSkvbixpPSh0WzFdLWVbMV0pL247cmV0dXJuKGk+PS4xMiYmaTwuMjM0JiZyPj0tLjQyNSYmcjwtLjIxND91Omk+PS4xNjYmJmk8LjIzNCYmcj49LS4yMTQmJnI8LS4xMTU/ZjphKS5pbnZlcnQodCl9LHMuc3RyZWFtPWZ1bmN0aW9uKGUpe3JldHVybiB0JiZuPT09ZT90OihyPVthLnN0cmVhbShuPWUpLHUuc3RyZWFtKGUpLGYuc3RyZWFtKGUpXSxpPXIubGVuZ3RoLHQ9e3BvaW50OmZ1bmN0aW9uKHQsbil7Zm9yKHZhciBlPS0xOysrZTxpOylyW2VdLnBvaW50KHQsbil9LHNwaGVyZTpmdW5jdGlvbigpe2Zvcih2YXIgdD0tMTsrK3Q8aTspclt0XS5zcGhlcmUoKX0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7Zm9yKHZhciB0PS0xOysrdDxpOylyW3RdLmxpbmVTdGFydCgpfSxsaW5lRW5kOmZ1bmN0aW9uKCl7Zm9yKHZhciB0PS0xOysrdDxpOylyW3RdLmxpbmVFbmQoKX0scG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7Zm9yKHZhciB0PS0xOysrdDxpOylyW3RdLnBvbHlnb25TdGFydCgpfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7Zm9yKHZhciB0PS0xOysrdDxpOylyW3RdLnBvbHlnb25FbmQoKX19KTt2YXIgcixpfSxzLnByZWNpc2lvbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYS5wcmVjaXNpb24odCksdS5wcmVjaXNpb24odCksZi5wcmVjaXNpb24odCksbCgpKTphLnByZWNpc2lvbigpfSxzLnNjYWxlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhLnNjYWxlKHQpLHUuc2NhbGUoLjM1KnQpLGYuc2NhbGUodCkscy50cmFuc2xhdGUoYS50cmFuc2xhdGUoKSkpOmEuc2NhbGUoKX0scy50cmFuc2xhdGU9ZnVuY3Rpb24odCl7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIGEudHJhbnNsYXRlKCk7dmFyIG49YS5zY2FsZSgpLG89K3RbMF0scz0rdFsxXTtyZXR1cm4gZT1hLnRyYW5zbGF0ZSh0KS5jbGlwRXh0ZW50KFtbby0uNDU1Km4scy0uMjM4Km5dLFtvKy40NTUqbixzKy4yMzgqbl1dKS5zdHJlYW0oYykscj11LnRyYW5zbGF0ZShbby0uMzA3Km4scysuMjAxKm5dKS5jbGlwRXh0ZW50KFtbby0uNDI1Km4rRGEscysuMTIqbitEYV0sW28tLjIxNCpuLURhLHMrLjIzNCpuLURhXV0pLnN0cmVhbShjKSxpPWYudHJhbnNsYXRlKFtvLS4yMDUqbixzKy4yMTIqbl0pLmNsaXBFeHRlbnQoW1tvLS4yMTQqbitEYSxzKy4xNjYqbitEYV0sW28tLjExNSpuLURhLHMrLjIzNCpuLURhXV0pLnN0cmVhbShjKSxsKCl9LHMuZml0RXh0ZW50PWZ1bmN0aW9uKHQsbil7cmV0dXJuIHhzKHMsdCxuKX0scy5maXRTaXplPWZ1bmN0aW9uKHQsbil7cmV0dXJuIHdzKHMsdCxuKX0scy5maXRXaWR0aD1mdW5jdGlvbih0LG4pe3JldHVybiBNcyhzLHQsbil9LHMuZml0SGVpZ2h0PWZ1bmN0aW9uKHQsbil7cmV0dXJuIEFzKHMsdCxuKX0scy5zY2FsZSgxMDcwKX0sdC5nZW9BemltdXRoYWxFcXVhbEFyZWE9ZnVuY3Rpb24oKXtyZXR1cm4gQ3MoT3MpLnNjYWxlKDEyNC43NSkuY2xpcEFuZ2xlKDE3OS45OTkpfSx0Lmdlb0F6aW11dGhhbEVxdWFsQXJlYVJhdz1Pcyx0Lmdlb0F6aW11dGhhbEVxdWlkaXN0YW50PWZ1bmN0aW9uKCl7cmV0dXJuIENzKFlzKS5zY2FsZSg3OS40MTg4KS5jbGlwQW5nbGUoMTc5Ljk5OSl9LHQuZ2VvQXppbXV0aGFsRXF1aWRpc3RhbnRSYXc9WXMsdC5nZW9Db25pY0NvbmZvcm1hbD1mdW5jdGlvbigpe3JldHVybiB6cyhIcykuc2NhbGUoMTA5LjUpLnBhcmFsbGVscyhbMzAsMzBdKX0sdC5nZW9Db25pY0NvbmZvcm1hbFJhdz1Icyx0Lmdlb0NvbmljRXF1YWxBcmVhPUxzLHQuZ2VvQ29uaWNFcXVhbEFyZWFSYXc9UnMsdC5nZW9Db25pY0VxdWlkaXN0YW50PWZ1bmN0aW9uKCl7cmV0dXJuIHpzKFhzKS5zY2FsZSgxMzEuMTU0KS5jZW50ZXIoWzAsMTMuOTM4OV0pfSx0Lmdlb0NvbmljRXF1aWRpc3RhbnRSYXc9WHMsdC5nZW9FcXVhbEVhcnRoPWZ1bmN0aW9uKCl7cmV0dXJuIENzKFFzKS5zY2FsZSgxNzcuMTU4KX0sdC5nZW9FcXVhbEVhcnRoUmF3PVFzLHQuZ2VvRXF1aXJlY3Rhbmd1bGFyPWZ1bmN0aW9uKCl7cmV0dXJuIENzKGpzKS5zY2FsZSgxNTIuNjMpfSx0Lmdlb0VxdWlyZWN0YW5ndWxhclJhdz1qcyx0Lmdlb0dub21vbmljPWZ1bmN0aW9uKCl7cmV0dXJuIENzKEpzKS5zY2FsZSgxNDQuMDQ5KS5jbGlwQW5nbGUoNjApfSx0Lmdlb0dub21vbmljUmF3PUpzLHQuZ2VvSWRlbnRpdHk9ZnVuY3Rpb24oKXt2YXIgdCxuLGUscixpLG8sYT0xLHU9MCxmPTAsYz0xLHM9MSxsPW1jLGg9bnVsbCxkPW1jO2Z1bmN0aW9uIHAoKXtyZXR1cm4gcj1pPW51bGwsb31yZXR1cm4gbz17c3RyZWFtOmZ1bmN0aW9uKHQpe3JldHVybiByJiZpPT09dD9yOnI9bChkKGk9dCkpfSxwb3N0Y2xpcDpmdW5jdGlvbihyKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZD1yLGg9dD1uPWU9bnVsbCxwKCkpOmR9LGNsaXBFeHRlbnQ6ZnVuY3Rpb24ocil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGQ9bnVsbD09cj8oaD10PW49ZT1udWxsLG1jKTpaZihoPStyWzBdWzBdLHQ9K3JbMF1bMV0sbj0rclsxXVswXSxlPStyWzFdWzFdKSxwKCkpOm51bGw9PWg/bnVsbDpbW2gsdF0sW24sZV1dfSxzY2FsZTpmdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obD1LcygoYT0rdCkqYyxhKnMsdSxmKSxwKCkpOmF9LHRyYW5zbGF0ZTpmdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obD1LcyhhKmMsYSpzLHU9K3RbMF0sZj0rdFsxXSkscCgpKTpbdSxmXX0scmVmbGVjdFg6ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGw9S3MoYSooYz10Py0xOjEpLGEqcyx1LGYpLHAoKSk6YzwwfSxyZWZsZWN0WTpmdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obD1LcyhhKmMsYSoocz10Py0xOjEpLHUsZikscCgpKTpzPDB9LGZpdEV4dGVudDpmdW5jdGlvbih0LG4pe3JldHVybiB4cyhvLHQsbil9LGZpdFNpemU6ZnVuY3Rpb24odCxuKXtyZXR1cm4gd3Mobyx0LG4pfSxmaXRXaWR0aDpmdW5jdGlvbih0LG4pe3JldHVybiBNcyhvLHQsbil9LGZpdEhlaWdodDpmdW5jdGlvbih0LG4pe3JldHVybiBBcyhvLHQsbil9fX0sdC5nZW9Qcm9qZWN0aW9uPUNzLHQuZ2VvUHJvamVjdGlvbk11dGF0b3I9UHMsdC5nZW9NZXJjYXRvcj1mdW5jdGlvbigpe3JldHVybiBGcyhCcykuc2NhbGUoOTYxL0JhKX0sdC5nZW9NZXJjYXRvclJhdz1Ccyx0Lmdlb05hdHVyYWxFYXJ0aDE9ZnVuY3Rpb24oKXtyZXR1cm4gQ3ModGwpLnNjYWxlKDE3NS4yOTUpfSx0Lmdlb05hdHVyYWxFYXJ0aDFSYXc9dGwsdC5nZW9PcnRob2dyYXBoaWM9ZnVuY3Rpb24oKXtyZXR1cm4gQ3MobmwpLnNjYWxlKDI0OS41KS5jbGlwQW5nbGUoOTArRGEpfSx0Lmdlb09ydGhvZ3JhcGhpY1Jhdz1ubCx0Lmdlb1N0ZXJlb2dyYXBoaWM9ZnVuY3Rpb24oKXtyZXR1cm4gQ3MoZWwpLnNjYWxlKDI1MCkuY2xpcEFuZ2xlKDE0Mil9LHQuZ2VvU3RlcmVvZ3JhcGhpY1Jhdz1lbCx0Lmdlb1RyYW5zdmVyc2VNZXJjYXRvcj1mdW5jdGlvbigpe3ZhciB0PUZzKHJsKSxuPXQuY2VudGVyLGU9dC5yb3RhdGU7cmV0dXJuIHQuY2VudGVyPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP24oWy10WzFdLHRbMF1dKTpbKHQ9bigpKVsxXSwtdFswXV19LHQucm90YXRlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP2UoW3RbMF0sdFsxXSx0Lmxlbmd0aD4yP3RbMl0rOTA6OTBdKTpbKHQ9ZSgpKVswXSx0WzFdLHRbMl0tOTBdfSxlKFswLDAsOTBdKS5zY2FsZSgxNTkuMTU1KX0sdC5nZW9UcmFuc3ZlcnNlTWVyY2F0b3JSYXc9cmwsdC5nZW9Sb3RhdGlvbj1SZix0Lmdlb1N0cmVhbT1zdSx0Lmdlb1RyYW5zZm9ybT1mdW5jdGlvbih0KXtyZXR1cm57c3RyZWFtOl9zKHQpfX0sdC5jbHVzdGVyPWZ1bmN0aW9uKCl7dmFyIHQ9aWwsbj0xLGU9MSxyPSExO2Z1bmN0aW9uIGkoaSl7dmFyIG8sYT0wO2kuZWFjaEFmdGVyKGZ1bmN0aW9uKG4pe3ZhciBlPW4uY2hpbGRyZW47ZT8obi54PWZ1bmN0aW9uKHQpe3JldHVybiB0LnJlZHVjZShvbCwwKS90Lmxlbmd0aH0oZSksbi55PWZ1bmN0aW9uKHQpe3JldHVybiAxK3QucmVkdWNlKGFsLDApfShlKSk6KG4ueD1vP2ErPXQobixvKTowLG4ueT0wLG89bil9KTt2YXIgdT1mdW5jdGlvbih0KXtmb3IodmFyIG47bj10LmNoaWxkcmVuOyl0PW5bMF07cmV0dXJuIHR9KGkpLGY9ZnVuY3Rpb24odCl7Zm9yKHZhciBuO249dC5jaGlsZHJlbjspdD1uW24ubGVuZ3RoLTFdO3JldHVybiB0fShpKSxjPXUueC10KHUsZikvMixzPWYueCt0KGYsdSkvMjtyZXR1cm4gaS5lYWNoQWZ0ZXIocj9mdW5jdGlvbih0KXt0Lng9KHQueC1pLngpKm4sdC55PShpLnktdC55KSplfTpmdW5jdGlvbih0KXt0Lng9KHQueC1jKS8ocy1jKSpuLHQueT0oMS0oaS55P3QueS9pLnk6MSkpKmV9KX1yZXR1cm4gaS5zZXBhcmF0aW9uPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PW4saSk6dH0saS5zaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPSExLG49K3RbMF0sZT0rdFsxXSxpKTpyP251bGw6W24sZV19LGkubm9kZVNpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9ITAsbj0rdFswXSxlPSt0WzFdLGkpOnI/W24sZV06bnVsbH0saX0sdC5oaWVyYXJjaHk9ZmwsdC5wYWNrPWZ1bmN0aW9uKCl7dmFyIHQ9bnVsbCxuPTEsZT0xLHI9RWw7ZnVuY3Rpb24gaShpKXtyZXR1cm4gaS54PW4vMixpLnk9ZS8yLHQ/aS5lYWNoQmVmb3JlKFBsKHQpKS5lYWNoQWZ0ZXIoemwociwuNSkpLmVhY2hCZWZvcmUoUmwoMSkpOmkuZWFjaEJlZm9yZShQbChDbCkpLmVhY2hBZnRlcih6bChFbCwxKSkuZWFjaEFmdGVyKHpsKHIsaS5yL01hdGgubWluKG4sZSkpKS5lYWNoQmVmb3JlKFJsKE1hdGgubWluKG4sZSkvKDIqaS5yKSkpLGl9cmV0dXJuIGkucmFkaXVzPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PW51bGw9PShlPW4pP251bGw6U2woZSksaSk6dDt2YXIgZX0saS5zaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPSt0WzBdLGU9K3RbMV0saSk6W24sZV19LGkucGFkZGluZz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0iZnVuY3Rpb24iPT10eXBlb2YgdD90OmtsKCt0KSxpKTpyfSxpfSx0LnBhY2tTaWJsaW5ncz1mdW5jdGlvbih0KXtyZXR1cm4gTmwodCksdH0sdC5wYWNrRW5jbG9zZT1wbCx0LnBhcnRpdGlvbj1mdW5jdGlvbigpe3ZhciB0PTEsbj0xLGU9MCxyPSExO2Z1bmN0aW9uIGkoaSl7dmFyIG89aS5oZWlnaHQrMTtyZXR1cm4gaS54MD1pLnkwPWUsaS54MT10LGkueTE9bi9vLGkuZWFjaEJlZm9yZShmdW5jdGlvbih0LG4pe3JldHVybiBmdW5jdGlvbihyKXtyLmNoaWxkcmVuJiZEbChyLHIueDAsdCooci5kZXB0aCsxKS9uLHIueDEsdCooci5kZXB0aCsyKS9uKTt2YXIgaT1yLngwLG89ci55MCxhPXIueDEtZSx1PXIueTEtZTthPGkmJihpPWE9KGkrYSkvMiksdTxvJiYobz11PShvK3UpLzIpLHIueDA9aSxyLnkwPW8sci54MT1hLHIueTE9dX19KG4sbykpLHImJmkuZWFjaEJlZm9yZShMbCksaX1yZXR1cm4gaS5yb3VuZD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0hIXQsaSk6cn0saS5zaXplPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PStlWzBdLG49K2VbMV0saSk6W3Qsbl19LGkucGFkZGluZz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT0rdCxpKTplfSxpfSx0LnN0cmF0aWZ5PWZ1bmN0aW9uKCl7dmFyIHQ9WWwsbj1CbDtmdW5jdGlvbiBlKGUpe3ZhciByLGksbyxhLHUsZixjLHM9ZS5sZW5ndGgsbD1uZXcgQXJyYXkocyksaD17fTtmb3IoaT0wO2k8czsrK2kpcj1lW2ldLHU9bFtpXT1uZXcgaGwociksbnVsbCE9KGY9dChyLGksZSkpJiYoZis9IiIpJiYoaFtjPVVsKyh1LmlkPWYpXT1jIGluIGg/T2w6dSk7Zm9yKGk9MDtpPHM7KytpKWlmKHU9bFtpXSxudWxsIT0oZj1uKGVbaV0saSxlKSkmJihmKz0iIikpe2lmKCEoYT1oW1VsK2ZdKSl0aHJvdyBuZXcgRXJyb3IoIm1pc3Npbmc6ICIrZik7aWYoYT09PU9sKXRocm93IG5ldyBFcnJvcigiYW1iaWd1b3VzOiAiK2YpO2EuY2hpbGRyZW4/YS5jaGlsZHJlbi5wdXNoKHUpOmEuY2hpbGRyZW49W3VdLHUucGFyZW50PWF9ZWxzZXtpZihvKXRocm93IG5ldyBFcnJvcigibXVsdGlwbGUgcm9vdHMiKTtvPXV9aWYoIW8pdGhyb3cgbmV3IEVycm9yKCJubyByb290Iik7aWYoby5wYXJlbnQ9cWwsby5lYWNoQmVmb3JlKGZ1bmN0aW9uKHQpe3QuZGVwdGg9dC5wYXJlbnQuZGVwdGgrMSwtLXN9KS5lYWNoQmVmb3JlKGxsKSxvLnBhcmVudD1udWxsLHM+MCl0aHJvdyBuZXcgRXJyb3IoImN5Y2xlIik7cmV0dXJuIG99cmV0dXJuIGUuaWQ9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9U2wobiksZSk6dH0sZS5wYXJlbnRJZD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj1TbCh0KSxlKTpufSxlfSx0LnRyZWU9ZnVuY3Rpb24oKXt2YXIgdD1GbCxuPTEsZT0xLHI9bnVsbDtmdW5jdGlvbiBpKGkpe3ZhciBmPWZ1bmN0aW9uKHQpe2Zvcih2YXIgbixlLHIsaSxvLGE9bmV3IEdsKHQsMCksdT1bYV07bj11LnBvcCgpOylpZihyPW4uXy5jaGlsZHJlbilmb3Iobi5jaGlsZHJlbj1uZXcgQXJyYXkobz1yLmxlbmd0aCksaT1vLTE7aT49MDstLWkpdS5wdXNoKGU9bi5jaGlsZHJlbltpXT1uZXcgR2wocltpXSxpKSksZS5wYXJlbnQ9bjtyZXR1cm4oYS5wYXJlbnQ9bmV3IEdsKG51bGwsMCkpLmNoaWxkcmVuPVthXSxhfShpKTtpZihmLmVhY2hBZnRlcihvKSxmLnBhcmVudC5tPS1mLnosZi5lYWNoQmVmb3JlKGEpLHIpaS5lYWNoQmVmb3JlKHUpO2Vsc2V7dmFyIGM9aSxzPWksbD1pO2kuZWFjaEJlZm9yZShmdW5jdGlvbih0KXt0Lng8Yy54JiYoYz10KSx0Lng+cy54JiYocz10KSx0LmRlcHRoPmwuZGVwdGgmJihsPXQpfSk7dmFyIGg9Yz09PXM/MTp0KGMscykvMixkPWgtYy54LHA9bi8ocy54K2grZCksdj1lLyhsLmRlcHRofHwxKTtpLmVhY2hCZWZvcmUoZnVuY3Rpb24odCl7dC54PSh0LngrZCkqcCx0Lnk9dC5kZXB0aCp2fSl9cmV0dXJuIGl9ZnVuY3Rpb24gbyhuKXt2YXIgZT1uLmNoaWxkcmVuLHI9bi5wYXJlbnQuY2hpbGRyZW4saT1uLmk/cltuLmktMV06bnVsbDtpZihlKXshZnVuY3Rpb24odCl7Zm9yKHZhciBuLGU9MCxyPTAsaT10LmNoaWxkcmVuLG89aS5sZW5ndGg7LS1vPj0wOykobj1pW29dKS56Kz1lLG4ubSs9ZSxlKz1uLnMrKHIrPW4uYyl9KG4pO3ZhciBvPShlWzBdLnorZVtlLmxlbmd0aC0xXS56KS8yO2k/KG4uej1pLnordChuLl8saS5fKSxuLm09bi56LW8pOm4uej1vfWVsc2UgaSYmKG4uej1pLnordChuLl8saS5fKSk7bi5wYXJlbnQuQT1mdW5jdGlvbihuLGUscil7aWYoZSl7Zm9yKHZhciBpLG89bixhPW4sdT1lLGY9by5wYXJlbnQuY2hpbGRyZW5bMF0sYz1vLm0scz1hLm0sbD11Lm0saD1mLm07dT1IbCh1KSxvPUlsKG8pLHUmJm87KWY9SWwoZiksKGE9SGwoYSkpLmE9biwoaT11LnorbC1vLnotYyt0KHUuXyxvLl8pKT4wJiYoamwoWGwodSxuLHIpLG4saSksYys9aSxzKz1pKSxsKz11Lm0sYys9by5tLGgrPWYubSxzKz1hLm07dSYmIUhsKGEpJiYoYS50PXUsYS5tKz1sLXMpLG8mJiFJbChmKSYmKGYudD1vLGYubSs9Yy1oLHI9bil9cmV0dXJuIHJ9KG4saSxuLnBhcmVudC5BfHxyWzBdKX1mdW5jdGlvbiBhKHQpe3QuXy54PXQueit0LnBhcmVudC5tLHQubSs9dC5wYXJlbnQubX1mdW5jdGlvbiB1KHQpe3QueCo9bix0Lnk9dC5kZXB0aCplfXJldHVybiBpLnNlcGFyYXRpb249ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9bixpKTp0fSxpLnNpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9ITEsbj0rdFswXSxlPSt0WzFdLGkpOnI/bnVsbDpbbixlXX0saS5ub2RlU2l6ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0hMCxuPSt0WzBdLGU9K3RbMV0saSk6cj9bbixlXTpudWxsfSxpfSx0LnRyZWVtYXA9ZnVuY3Rpb24oKXt2YXIgdD1abCxuPSExLGU9MSxyPTEsaT1bMF0sbz1FbCxhPUVsLHU9RWwsZj1FbCxjPUVsO2Z1bmN0aW9uIHModCl7cmV0dXJuIHQueDA9dC55MD0wLHQueDE9ZSx0LnkxPXIsdC5lYWNoQmVmb3JlKGwpLGk9WzBdLG4mJnQuZWFjaEJlZm9yZShMbCksdH1mdW5jdGlvbiBsKG4pe3ZhciBlPWlbbi5kZXB0aF0scj1uLngwK2Uscz1uLnkwK2UsbD1uLngxLWUsaD1uLnkxLWU7bDxyJiYocj1sPShyK2wpLzIpLGg8cyYmKHM9aD0ocytoKS8yKSxuLngwPXIsbi55MD1zLG4ueDE9bCxuLnkxPWgsbi5jaGlsZHJlbiYmKGU9aVtuLmRlcHRoKzFdPW8obikvMixyKz1jKG4pLWUscys9YShuKS1lLChsLT11KG4pLWUpPHImJihyPWw9KHIrbCkvMiksKGgtPWYobiktZSk8cyYmKHM9aD0ocytoKS8yKSx0KG4scixzLGwsaCkpfXJldHVybiBzLnJvdW5kPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPSEhdCxzKTpufSxzLnNpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9K3RbMF0scj0rdFsxXSxzKTpbZSxyXX0scy50aWxlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PVNsKG4pLHMpOnR9LHMucGFkZGluZz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD9zLnBhZGRpbmdJbm5lcih0KS5wYWRkaW5nT3V0ZXIodCk6cy5wYWRkaW5nSW5uZXIoKX0scy5wYWRkaW5nSW5uZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDprbCgrdCkscyk6b30scy5wYWRkaW5nT3V0ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/cy5wYWRkaW5nVG9wKHQpLnBhZGRpbmdSaWdodCh0KS5wYWRkaW5nQm90dG9tKHQpLnBhZGRpbmdMZWZ0KHQpOnMucGFkZGluZ1RvcCgpfSxzLnBhZGRpbmdUb3A9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDprbCgrdCkscyk6YX0scy5wYWRkaW5nUmlnaHQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDprbCgrdCkscyk6dX0scy5wYWRkaW5nQm90dG9tPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhmPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6a2woK3QpLHMpOmZ9LHMucGFkZGluZ0xlZnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGM9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDprbCgrdCkscyk6Y30sc30sdC50cmVlbWFwQmluYXJ5PWZ1bmN0aW9uKHQsbixlLHIsaSl7dmFyIG8sYSx1PXQuY2hpbGRyZW4sZj11Lmxlbmd0aCxjPW5ldyBBcnJheShmKzEpO2ZvcihjWzBdPWE9bz0wO288ZjsrK28pY1tvKzFdPWErPXVbb10udmFsdWU7IWZ1bmN0aW9uIHQobixlLHIsaSxvLGEsZil7aWYobj49ZS0xKXt2YXIgcz11W25dO3JldHVybiBzLngwPWkscy55MD1vLHMueDE9YSx2b2lkKHMueTE9Zil9Zm9yKHZhciBsPWNbbl0saD1yLzIrbCxkPW4rMSxwPWUtMTtkPHA7KXt2YXIgdj1kK3A+Pj4xO2Nbdl08aD9kPXYrMTpwPXZ9aC1jW2QtMV08Y1tkXS1oJiZuKzE8ZCYmLS1kO3ZhciBnPWNbZF0tbCx5PXItZztpZihhLWk+Zi1vKXt2YXIgXz0oaSp5K2EqZykvcjt0KG4sZCxnLGksbyxfLGYpLHQoZCxlLHksXyxvLGEsZil9ZWxzZXt2YXIgYj0obyp5K2YqZykvcjt0KG4sZCxnLGksbyxhLGIpLHQoZCxlLHksaSxiLGEsZil9fSgwLGYsdC52YWx1ZSxuLGUscixpKX0sdC50cmVlbWFwRGljZT1EbCx0LnRyZWVtYXBTbGljZT1WbCx0LnRyZWVtYXBTbGljZURpY2U9ZnVuY3Rpb24odCxuLGUscixpKXsoMSZ0LmRlcHRoP1ZsOkRsKSh0LG4sZSxyLGkpfSx0LnRyZWVtYXBTcXVhcmlmeT1abCx0LnRyZWVtYXBSZXNxdWFyaWZ5PVFsLHQuaW50ZXJwb2xhdGU9bWUsdC5pbnRlcnBvbGF0ZUFycmF5PWRlLHQuaW50ZXJwb2xhdGVCYXNpcz1lZSx0LmludGVycG9sYXRlQmFzaXNDbG9zZWQ9cmUsdC5pbnRlcnBvbGF0ZURhdGU9cGUsdC5pbnRlcnBvbGF0ZURpc2NyZXRlPWZ1bmN0aW9uKHQpe3ZhciBuPXQubGVuZ3RoO3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gdFtNYXRoLm1heCgwLE1hdGgubWluKG4tMSxNYXRoLmZsb29yKGUqbikpKV19fSx0LmludGVycG9sYXRlSHVlPWZ1bmN0aW9uKHQsbil7dmFyIGU9YWUoK3QsK24pO3JldHVybiBmdW5jdGlvbih0KXt2YXIgbj1lKHQpO3JldHVybiBuLTM2MCpNYXRoLmZsb29yKG4vMzYwKX19LHQuaW50ZXJwb2xhdGVOdW1iZXI9dmUsdC5pbnRlcnBvbGF0ZU9iamVjdD1nZSx0LmludGVycG9sYXRlUm91bmQ9eGUsdC5pbnRlcnBvbGF0ZVN0cmluZz1iZSx0LmludGVycG9sYXRlVHJhbnNmb3JtQ3NzPUNlLHQuaW50ZXJwb2xhdGVUcmFuc2Zvcm1Tdmc9UGUsdC5pbnRlcnBvbGF0ZVpvb209cWUsdC5pbnRlcnBvbGF0ZVJnYj1jZSx0LmludGVycG9sYXRlUmdiQmFzaXM9bGUsdC5pbnRlcnBvbGF0ZVJnYkJhc2lzQ2xvc2VkPWhlLHQuaW50ZXJwb2xhdGVIc2w9WWUsdC5pbnRlcnBvbGF0ZUhzbExvbmc9QmUsdC5pbnRlcnBvbGF0ZUxhYj1mdW5jdGlvbih0LG4pe3ZhciBlPWZlKCh0PVVuKHQpKS5sLChuPVVuKG4pKS5sKSxyPWZlKHQuYSxuLmEpLGk9ZmUodC5iLG4uYiksbz1mZSh0Lm9wYWNpdHksbi5vcGFjaXR5KTtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIHQubD1lKG4pLHQuYT1yKG4pLHQuYj1pKG4pLHQub3BhY2l0eT1vKG4pLHQrIiJ9fSx0LmludGVycG9sYXRlSGNsPUllLHQuaW50ZXJwb2xhdGVIY2xMb25nPUhlLHQuaW50ZXJwb2xhdGVDdWJlaGVsaXg9WGUsdC5pbnRlcnBvbGF0ZUN1YmVoZWxpeExvbmc9R2UsdC5waWVjZXdpc2U9ZnVuY3Rpb24odCxuKXtmb3IodmFyIGU9MCxyPW4ubGVuZ3RoLTEsaT1uWzBdLG89bmV3IEFycmF5KHI8MD8wOnIpO2U8cjspb1tlXT10KGksaT1uWysrZV0pO3JldHVybiBmdW5jdGlvbih0KXt2YXIgbj1NYXRoLm1heCgwLE1hdGgubWluKHItMSxNYXRoLmZsb29yKHQqPXIpKSk7cmV0dXJuIG9bbl0odC1uKX19LHQucXVhbnRpemU9ZnVuY3Rpb24odCxuKXtmb3IodmFyIGU9bmV3IEFycmF5KG4pLHI9MDtyPG47KytyKWVbcl09dChyLyhuLTEpKTtyZXR1cm4gZX0sdC5wYXRoPUdpLHQucG9seWdvbkFyZWE9ZnVuY3Rpb24odCl7Zm9yKHZhciBuLGU9LTEscj10Lmxlbmd0aCxpPXRbci0xXSxvPTA7KytlPHI7KW49aSxpPXRbZV0sbys9blsxXSppWzBdLW5bMF0qaVsxXTtyZXR1cm4gby8yfSx0LnBvbHlnb25DZW50cm9pZD1mdW5jdGlvbih0KXtmb3IodmFyIG4sZSxyPS0xLGk9dC5sZW5ndGgsbz0wLGE9MCx1PXRbaS0xXSxmPTA7KytyPGk7KW49dSx1PXRbcl0sZis9ZT1uWzBdKnVbMV0tdVswXSpuWzFdLG8rPShuWzBdK3VbMF0pKmUsYSs9KG5bMV0rdVsxXSkqZTtyZXR1cm5bby8oZio9MyksYS9mXX0sdC5wb2x5Z29uSHVsbD1mdW5jdGlvbih0KXtpZigoZT10Lmxlbmd0aCk8MylyZXR1cm4gbnVsbDt2YXIgbixlLHI9bmV3IEFycmF5KGUpLGk9bmV3IEFycmF5KGUpO2ZvcihuPTA7bjxlOysrbilyW25dPVsrdFtuXVswXSwrdFtuXVsxXSxuXTtmb3Ioci5zb3J0KEpsKSxuPTA7bjxlOysrbilpW25dPVtyW25dWzBdLC1yW25dWzFdXTt2YXIgbz1LbChyKSxhPUtsKGkpLHU9YVswXT09PW9bMF0sZj1hW2EubGVuZ3RoLTFdPT09b1tvLmxlbmd0aC0xXSxjPVtdO2ZvcihuPW8ubGVuZ3RoLTE7bj49MDstLW4pYy5wdXNoKHRbcltvW25dXVsyXV0pO2ZvcihuPSt1O248YS5sZW5ndGgtZjsrK24pYy5wdXNoKHRbclthW25dXVsyXV0pO3JldHVybiBjfSx0LnBvbHlnb25Db250YWlucz1mdW5jdGlvbih0LG4pe2Zvcih2YXIgZSxyLGk9dC5sZW5ndGgsbz10W2ktMV0sYT1uWzBdLHU9blsxXSxmPW9bMF0sYz1vWzFdLHM9ITEsbD0wO2w8aTsrK2wpZT0obz10W2xdKVswXSwocj1vWzFdKT51IT1jPnUmJmE8KGYtZSkqKHUtcikvKGMtcikrZSYmKHM9IXMpLGY9ZSxjPXI7cmV0dXJuIHN9LHQucG9seWdvbkxlbmd0aD1mdW5jdGlvbih0KXtmb3IodmFyIG4sZSxyPS0xLGk9dC5sZW5ndGgsbz10W2ktMV0sYT1vWzBdLHU9b1sxXSxmPTA7KytyPGk7KW49YSxlPXUsbi09YT0obz10W3JdKVswXSxlLT11PW9bMV0sZis9TWF0aC5zcXJ0KG4qbitlKmUpO3JldHVybiBmfSx0LnF1YWR0cmVlPXJhLHQucmFuZG9tVW5pZm9ybT1uaCx0LnJhbmRvbU5vcm1hbD1laCx0LnJhbmRvbUxvZ05vcm1hbD1yaCx0LnJhbmRvbUJhdGVzPW9oLHQucmFuZG9tSXJ3aW5IYWxsPWloLHQucmFuZG9tRXhwb25lbnRpYWw9YWgsdC5zY2FsZUJhbmQ9aGgsdC5zY2FsZVBvaW50PWZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uIHQobil7dmFyIGU9bi5jb3B5O3JldHVybiBuLnBhZGRpbmc9bi5wYWRkaW5nT3V0ZXIsZGVsZXRlIG4ucGFkZGluZ0lubmVyLGRlbGV0ZSBuLnBhZGRpbmdPdXRlcixuLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gdChlKCkpfSxufShoaCgpLnBhZGRpbmdJbm5lcigxKSl9LHQuc2NhbGVJZGVudGl0eT1mdW5jdGlvbiB0KCl7dmFyIG49WzAsMV07ZnVuY3Rpb24gZSh0KXtyZXR1cm4rdH1yZXR1cm4gZS5pbnZlcnQ9ZSxlLmRvbWFpbj1lLnJhbmdlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPWZoLmNhbGwodCxwaCksZSk6bi5zbGljZSgpfSxlLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gdCgpLmRvbWFpbihuKX0seGgoZSl9LHQuc2NhbGVMaW5lYXI9ZnVuY3Rpb24gdCgpe3ZhciBuPW1oKGdoLHZlKTtyZXR1cm4gbi5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIGJoKG4sdCgpKX0seGgobil9LHQuc2NhbGVMb2c9ZnVuY3Rpb24gbigpe3ZhciBlPW1oKE1oLEFoKS5kb21haW4oWzEsMTBdKSxyPWUuZG9tYWluLGk9MTAsbz1TaCgxMCksYT1OaCgxMCk7ZnVuY3Rpb24gdSgpe3JldHVybiBvPVNoKGkpLGE9TmgoaSkscigpWzBdPDAmJihvPUVoKG8pLGE9RWgoYSkpLGV9cmV0dXJuIGUuYmFzZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0rdCx1KCkpOml9LGUuZG9tYWluPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyKHQpLHUoKSk6cigpfSxlLnRpY2tzPWZ1bmN0aW9uKHQpe3ZhciBuLGU9cigpLHU9ZVswXSxmPWVbZS5sZW5ndGgtMV07KG49Zjx1KSYmKGg9dSx1PWYsZj1oKTt2YXIgYyxzLGwsaD1vKHUpLGQ9byhmKSxwPW51bGw9PXQ/MTA6K3Qsdj1bXTtpZighKGklMSkmJmQtaDxwKXtpZihoPU1hdGgucm91bmQoaCktMSxkPU1hdGgucm91bmQoZCkrMSx1PjApe2Zvcig7aDxkOysraClmb3Iocz0xLGM9YShoKTtzPGk7KytzKWlmKCEoKGw9YypzKTx1KSl7aWYobD5mKWJyZWFrO3YucHVzaChsKX19ZWxzZSBmb3IoO2g8ZDsrK2gpZm9yKHM9aS0xLGM9YShoKTtzPj0xOy0tcylpZighKChsPWMqcyk8dSkpe2lmKGw+ZilicmVhazt2LnB1c2gobCl9fWVsc2Ugdj1tKGgsZCxNYXRoLm1pbihkLWgscCkpLm1hcChhKTtyZXR1cm4gbj92LnJldmVyc2UoKTp2fSxlLnRpY2tGb3JtYXQ9ZnVuY3Rpb24obixyKXtpZihudWxsPT1yJiYocj0xMD09PWk/Ii4wZSI6IiwiKSwiZnVuY3Rpb24iIT10eXBlb2YgciYmKHI9dC5mb3JtYXQocikpLG49PT0xLzApcmV0dXJuIHI7bnVsbD09biYmKG49MTApO3ZhciB1PU1hdGgubWF4KDEsaSpuL2UudGlja3MoKS5sZW5ndGgpO3JldHVybiBmdW5jdGlvbih0KXt2YXIgbj10L2EoTWF0aC5yb3VuZChvKHQpKSk7cmV0dXJuIG4qaTxpLS41JiYobio9aSksbjw9dT9yKHQpOiIifX0sZS5uaWNlPWZ1bmN0aW9uKCl7cmV0dXJuIHIod2gocigpLHtmbG9vcjpmdW5jdGlvbih0KXtyZXR1cm4gYShNYXRoLmZsb29yKG8odCkpKX0sY2VpbDpmdW5jdGlvbih0KXtyZXR1cm4gYShNYXRoLmNlaWwobyh0KSkpfX0pKX0sZS5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIGJoKGUsbigpLmJhc2UoaSkpfSxlfSx0LnNjYWxlT3JkaW5hbD1saCx0LnNjYWxlSW1wbGljaXQ9c2gsdC5zY2FsZVBvdz1DaCx0LnNjYWxlU3FydD1mdW5jdGlvbigpe3JldHVybiBDaCgpLmV4cG9uZW50KC41KX0sdC5zY2FsZVF1YW50aWxlPWZ1bmN0aW9uIHQoKXt2YXIgZT1bXSxyPVtdLG89W107ZnVuY3Rpb24gYSgpe3ZhciB0PTAsbj1NYXRoLm1heCgxLHIubGVuZ3RoKTtmb3Iobz1uZXcgQXJyYXkobi0xKTsrK3Q8bjspb1t0LTFdPUEoZSx0L24pO3JldHVybiB1fWZ1bmN0aW9uIHUodCl7aWYoIWlzTmFOKHQ9K3QpKXJldHVybiByW2kobyx0KV19cmV0dXJuIHUuaW52ZXJ0RXh0ZW50PWZ1bmN0aW9uKHQpe3ZhciBuPXIuaW5kZXhPZih0KTtyZXR1cm4gbjwwP1tOYU4sTmFOXTpbbj4wP29bbi0xXTplWzBdLG48by5sZW5ndGg/b1tuXTplW2UubGVuZ3RoLTFdXX0sdS5kb21haW49ZnVuY3Rpb24odCl7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIGUuc2xpY2UoKTtlPVtdO2Zvcih2YXIgcixpPTAsbz10Lmxlbmd0aDtpPG87KytpKW51bGw9PShyPXRbaV0pfHxpc05hTihyPStyKXx8ZS5wdXNoKHIpO3JldHVybiBlLnNvcnQobiksYSgpfSx1LnJhbmdlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPWNoLmNhbGwodCksYSgpKTpyLnNsaWNlKCl9LHUucXVhbnRpbGVzPWZ1bmN0aW9uKCl7cmV0dXJuIG8uc2xpY2UoKX0sdS5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIHQoKS5kb21haW4oZSkucmFuZ2Uocil9LHV9LHQuc2NhbGVRdWFudGl6ZT1mdW5jdGlvbiB0KCl7dmFyIG49MCxlPTEscj0xLG89Wy41XSxhPVswLDFdO2Z1bmN0aW9uIHUodCl7aWYodDw9dClyZXR1cm4gYVtpKG8sdCwwLHIpXX1mdW5jdGlvbiBmKCl7dmFyIHQ9LTE7Zm9yKG89bmV3IEFycmF5KHIpOysrdDxyOylvW3RdPSgodCsxKSplLSh0LXIpKm4pLyhyKzEpO3JldHVybiB1fXJldHVybiB1LmRvbWFpbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj0rdFswXSxlPSt0WzFdLGYoKSk6W24sZV19LHUucmFuZ2U9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9KGE9Y2guY2FsbCh0KSkubGVuZ3RoLTEsZigpKTphLnNsaWNlKCl9LHUuaW52ZXJ0RXh0ZW50PWZ1bmN0aW9uKHQpe3ZhciBpPWEuaW5kZXhPZih0KTtyZXR1cm4gaTwwP1tOYU4sTmFOXTppPDE/W24sb1swXV06aT49cj9bb1tyLTFdLGVdOltvW2ktMV0sb1tpXV19LHUuY29weT1mdW5jdGlvbigpe3JldHVybiB0KCkuZG9tYWluKFtuLGVdKS5yYW5nZShhKX0seGgodSl9LHQuc2NhbGVUaHJlc2hvbGQ9ZnVuY3Rpb24gdCgpe3ZhciBuPVsuNV0sZT1bMCwxXSxyPTE7ZnVuY3Rpb24gbyh0KXtpZih0PD10KXJldHVybiBlW2kobix0LDAscildfXJldHVybiBvLmRvbWFpbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj1jaC5jYWxsKHQpLHI9TWF0aC5taW4obi5sZW5ndGgsZS5sZW5ndGgtMSksbyk6bi5zbGljZSgpfSxvLnJhbmdlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPWNoLmNhbGwodCkscj1NYXRoLm1pbihuLmxlbmd0aCxlLmxlbmd0aC0xKSxvKTplLnNsaWNlKCl9LG8uaW52ZXJ0RXh0ZW50PWZ1bmN0aW9uKHQpe3ZhciByPWUuaW5kZXhPZih0KTtyZXR1cm5bbltyLTFdLG5bcl1dfSxvLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gdCgpLmRvbWFpbihuKS5yYW5nZShlKX0sb30sdC5zY2FsZVRpbWU9ZnVuY3Rpb24oKXtyZXR1cm4gY3YoY2QsdWQsVmgsamgsSWgsQmgsT2gsTGgsdC50aW1lRm9ybWF0KS5kb21haW4oW25ldyBEYXRlKDJlMywwLDEpLG5ldyBEYXRlKDJlMywwLDIpXSl9LHQuc2NhbGVVdGM9ZnVuY3Rpb24oKXtyZXR1cm4gY3YoTGQsemQsX2QsdmQsZGQsbGQsT2gsTGgsdC51dGNGb3JtYXQpLmRvbWFpbihbRGF0ZS5VVEMoMmUzLDAsMSksRGF0ZS5VVEMoMmUzLDAsMildKX0sdC5zY2FsZVNlcXVlbnRpYWw9ZnVuY3Rpb24gdChuKXt2YXIgZT0wLHI9MSxpPTEsbz0hMTtmdW5jdGlvbiBhKHQpe3ZhciByPSh0LWUpKmk7cmV0dXJuIG4obz9NYXRoLm1heCgwLE1hdGgubWluKDEscikpOnIpfXJldHVybiBhLmRvbWFpbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT0rdFswXSxyPSt0WzFdLGk9ZT09PXI/MDoxLyhyLWUpLGEpOltlLHJdfSxhLmNsYW1wPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPSEhdCxhKTpvfSxhLmludGVycG9sYXRvcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj10LGEpOm59LGEuY29weT1mdW5jdGlvbigpe3JldHVybiB0KG4pLmRvbWFpbihbZSxyXSkuY2xhbXAobyl9LHhoKGEpfSx0LnNjYWxlRGl2ZXJnaW5nPWZ1bmN0aW9uIHQobil7dmFyIGU9MCxyPS41LGk9MSxvPTEsYT0xLHU9ITE7ZnVuY3Rpb24gZih0KXt2YXIgZT0uNSsoKHQ9K3QpLXIpKih0PHI/bzphKTtyZXR1cm4gbih1P01hdGgubWF4KDAsTWF0aC5taW4oMSxlKSk6ZSl9cmV0dXJuIGYuZG9tYWluPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPSt0WzBdLHI9K3RbMV0saT0rdFsyXSxvPWU9PT1yPzA6LjUvKHItZSksYT1yPT09aT8wOi41LyhpLXIpLGYpOltlLHIsaV19LGYuY2xhbXA9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9ISF0LGYpOnV9LGYuaW50ZXJwb2xhdG9yPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPXQsZik6bn0sZi5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIHQobikuZG9tYWluKFtlLHIsaV0pLmNsYW1wKHUpfSx4aChmKX0sdC5zY2hlbWVDYXRlZ29yeTEwPWx2LHQuc2NoZW1lQWNjZW50PWh2LHQuc2NoZW1lRGFyazI9ZHYsdC5zY2hlbWVQYWlyZWQ9cHYsdC5zY2hlbWVQYXN0ZWwxPXZ2LHQuc2NoZW1lUGFzdGVsMj1ndix0LnNjaGVtZVNldDE9eXYsdC5zY2hlbWVTZXQyPV92LHQuc2NoZW1lU2V0Mz1idix0LmludGVycG9sYXRlQnJCRz13dix0LnNjaGVtZUJyQkc9eHYsdC5pbnRlcnBvbGF0ZVBSR249QXYsdC5zY2hlbWVQUkduPU12LHQuaW50ZXJwb2xhdGVQaVlHPU52LHQuc2NoZW1lUGlZRz1Udix0LmludGVycG9sYXRlUHVPcj1Fdix0LnNjaGVtZVB1T3I9U3YsdC5pbnRlcnBvbGF0ZVJkQnU9Q3YsdC5zY2hlbWVSZEJ1PWt2LHQuaW50ZXJwb2xhdGVSZEd5PXp2LHQuc2NoZW1lUmRHeT1Qdix0LmludGVycG9sYXRlUmRZbEJ1PUx2LHQuc2NoZW1lUmRZbEJ1PVJ2LHQuaW50ZXJwb2xhdGVSZFlsR249VXYsdC5zY2hlbWVSZFlsR249RHYsdC5pbnRlcnBvbGF0ZVNwZWN0cmFsPU92LHQuc2NoZW1lU3BlY3RyYWw9cXYsdC5pbnRlcnBvbGF0ZUJ1R249QnYsdC5zY2hlbWVCdUduPVl2LHQuaW50ZXJwb2xhdGVCdVB1PUl2LHQuc2NoZW1lQnVQdT1Gdix0LmludGVycG9sYXRlR25CdT1qdix0LnNjaGVtZUduQnU9SHYsdC5pbnRlcnBvbGF0ZU9yUmQ9R3YsdC5zY2hlbWVPclJkPVh2LHQuaW50ZXJwb2xhdGVQdUJ1R249JHYsdC5zY2hlbWVQdUJ1R249VnYsdC5pbnRlcnBvbGF0ZVB1QnU9WnYsdC5zY2hlbWVQdUJ1PVd2LHQuaW50ZXJwb2xhdGVQdVJkPUp2LHQuc2NoZW1lUHVSZD1Rdix0LmludGVycG9sYXRlUmRQdT10Zyx0LnNjaGVtZVJkUHU9S3YsdC5pbnRlcnBvbGF0ZVlsR25CdT1lZyx0LnNjaGVtZVlsR25CdT1uZyx0LmludGVycG9sYXRlWWxHbj1pZyx0LnNjaGVtZVlsR249cmcsdC5pbnRlcnBvbGF0ZVlsT3JCcj1hZyx0LnNjaGVtZVlsT3JCcj1vZyx0LmludGVycG9sYXRlWWxPclJkPWZnLHQuc2NoZW1lWWxPclJkPXVnLHQuaW50ZXJwb2xhdGVCbHVlcz1zZyx0LnNjaGVtZUJsdWVzPWNnLHQuaW50ZXJwb2xhdGVHcmVlbnM9aGcsdC5zY2hlbWVHcmVlbnM9bGcsdC5pbnRlcnBvbGF0ZUdyZXlzPXBnLHQuc2NoZW1lR3JleXM9ZGcsdC5pbnRlcnBvbGF0ZVB1cnBsZXM9Z2csdC5zY2hlbWVQdXJwbGVzPXZnLHQuaW50ZXJwb2xhdGVSZWRzPV9nLHQuc2NoZW1lUmVkcz15Zyx0LmludGVycG9sYXRlT3Jhbmdlcz1tZyx0LnNjaGVtZU9yYW5nZXM9YmcsdC5pbnRlcnBvbGF0ZUN1YmVoZWxpeERlZmF1bHQ9eGcsdC5pbnRlcnBvbGF0ZVJhaW5ib3c9ZnVuY3Rpb24odCl7KHQ8MHx8dD4xKSYmKHQtPU1hdGguZmxvb3IodCkpO3ZhciBuPU1hdGguYWJzKHQtLjUpO3JldHVybiBBZy5oPTM2MCp0LTEwMCxBZy5zPTEuNS0xLjUqbixBZy5sPS44LS45Km4sQWcrIiJ9LHQuaW50ZXJwb2xhdGVXYXJtPXdnLHQuaW50ZXJwb2xhdGVDb29sPU1nLHQuaW50ZXJwb2xhdGVTaW5lYm93PWZ1bmN0aW9uKHQpe3ZhciBuO3JldHVybiB0PSguNS10KSpNYXRoLlBJLFRnLnI9MjU1KihuPU1hdGguc2luKHQpKSpuLFRnLmc9MjU1KihuPU1hdGguc2luKHQrTmcpKSpuLFRnLmI9MjU1KihuPU1hdGguc2luKHQrU2cpKSpuLFRnKyIifSx0LmludGVycG9sYXRlVmlyaWRpcz1rZyx0LmludGVycG9sYXRlTWFnbWE9Q2csdC5pbnRlcnBvbGF0ZUluZmVybm89UGcsdC5pbnRlcnBvbGF0ZVBsYXNtYT16Zyx0LmNyZWF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gRHQoVyh0KS5jYWxsKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkpfSx0LmNyZWF0b3I9Vyx0LmxvY2FsPXF0LHQubWF0Y2hlcj1ydCx0Lm1vdXNlPUZ0LHQubmFtZXNwYWNlPSQsdC5uYW1lc3BhY2VzPVYsdC5jbGllbnRQb2ludD1CdCx0LnNlbGVjdD1EdCx0LnNlbGVjdEFsbD1mdW5jdGlvbih0KXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQ/bmV3IFJ0KFtkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHQpXSxbZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50XSk6bmV3IFJ0KFtudWxsPT10P1tdOnRdLHp0KX0sdC5zZWxlY3Rpb249THQsdC5zZWxlY3Rvcj1RLHQuc2VsZWN0b3JBbGw9Syx0LnN0eWxlPWx0LHQudG91Y2g9SXQsdC50b3VjaGVzPWZ1bmN0aW9uKHQsbil7bnVsbD09biYmKG49WXQoKS50b3VjaGVzKTtmb3IodmFyIGU9MCxyPW4/bi5sZW5ndGg6MCxpPW5ldyBBcnJheShyKTtlPHI7KytlKWlbZV09QnQodCxuW2VdKTtyZXR1cm4gaX0sdC53aW5kb3c9c3QsdC5jdXN0b21FdmVudD1DdCx0LmFyYz1mdW5jdGlvbigpe3ZhciB0PUdnLG49VmcsZT1SZygwKSxyPW51bGwsaT0kZyxvPVdnLGE9WmcsdT1udWxsO2Z1bmN0aW9uIGYoKXt2YXIgZixjLHMsbD0rdC5hcHBseSh0aGlzLGFyZ3VtZW50cyksaD0rbi5hcHBseSh0aGlzLGFyZ3VtZW50cyksZD1pLmFwcGx5KHRoaXMsYXJndW1lbnRzKS1IZyxwPW8uYXBwbHkodGhpcyxhcmd1bWVudHMpLUhnLHY9TGcocC1kKSxnPXA+ZDtpZih1fHwodT1mPUdpKCkpLGg8bCYmKGM9aCxoPWwsbD1jKSxoPkZnKWlmKHY+amctRmcpdS5tb3ZlVG8oaCpVZyhkKSxoKllnKGQpKSx1LmFyYygwLDAsaCxkLHAsIWcpLGw+RmcmJih1Lm1vdmVUbyhsKlVnKHApLGwqWWcocCkpLHUuYXJjKDAsMCxsLHAsZCxnKSk7ZWxzZXt2YXIgeSxfLGI9ZCxtPXAseD1kLHc9cCxNPXYsQT12LFQ9YS5hcHBseSh0aGlzLGFyZ3VtZW50cykvMixOPVQ+RmcmJihyPytyLmFwcGx5KHRoaXMsYXJndW1lbnRzKTpCZyhsKmwraCpoKSksUz1PZyhMZyhoLWwpLzIsK2UuYXBwbHkodGhpcyxhcmd1bWVudHMpKSxFPVMsaz1TO2lmKE4+Rmcpe3ZhciBDPVhnKE4vbCpZZyhUKSksUD1YZyhOL2gqWWcoVCkpOyhNLT0yKkMpPkZnPyh4Kz1DKj1nPzE6LTEsdy09Qyk6KE09MCx4PXc9KGQrcCkvMiksKEEtPTIqUCk+Rmc/KGIrPVAqPWc/MTotMSxtLT1QKTooQT0wLGI9bT0oZCtwKS8yKX12YXIgej1oKlVnKGIpLFI9aCpZZyhiKSxMPWwqVWcodyksRD1sKllnKHcpO2lmKFM+Rmcpe3ZhciBVPWgqVWcobSkscT1oKllnKG0pLE89bCpVZyh4KSxZPWwqWWcoeCk7aWYodjxJZyl7dmFyIEI9TT5GZz9mdW5jdGlvbih0LG4sZSxyLGksbyxhLHUpe3ZhciBmPWUtdCxjPXItbixzPWEtaSxsPXUtbyxoPShzKihuLW8pLWwqKHQtaSkpLyhsKmYtcypjKTtyZXR1cm5bdCtoKmYsbitoKmNdfSh6LFIsTyxZLFUscSxMLEQpOltMLERdLEY9ei1CWzBdLEk9Ui1CWzFdLEg9VS1CWzBdLGo9cS1CWzFdLFg9MS9ZZygoKHM9KEYqSCtJKmopLyhCZyhGKkYrSSpJKSpCZyhIKkgraipqKSkpPjE/MDpzPC0xP0lnOk1hdGguYWNvcyhzKSkvMiksRz1CZyhCWzBdKkJbMF0rQlsxXSpCWzFdKTtFPU9nKFMsKGwtRykvKFgtMSkpLGs9T2coUywoaC1HKS8oWCsxKSl9fUE+Rmc/az5GZz8oeT1RZyhPLFkseixSLGgsayxnKSxfPVFnKFUscSxMLEQsaCxrLGcpLHUubW92ZVRvKHkuY3greS54MDEseS5jeSt5LnkwMSksazxTP3UuYXJjKHkuY3gseS5jeSxrLERnKHkueTAxLHkueDAxKSxEZyhfLnkwMSxfLngwMSksIWcpOih1LmFyYyh5LmN4LHkuY3ksayxEZyh5LnkwMSx5LngwMSksRGcoeS55MTEseS54MTEpLCFnKSx1LmFyYygwLDAsaCxEZyh5LmN5K3kueTExLHkuY3greS54MTEpLERnKF8uY3krXy55MTEsXy5jeCtfLngxMSksIWcpLHUuYXJjKF8uY3gsXy5jeSxrLERnKF8ueTExLF8ueDExKSxEZyhfLnkwMSxfLngwMSksIWcpKSk6KHUubW92ZVRvKHosUiksdS5hcmMoMCwwLGgsYixtLCFnKSk6dS5tb3ZlVG8oeixSKSxsPkZnJiZNPkZnP0U+Rmc/KHk9UWcoTCxELFUscSxsLC1FLGcpLF89UWcoeixSLE8sWSxsLC1FLGcpLHUubGluZVRvKHkuY3greS54MDEseS5jeSt5LnkwMSksRTxTP3UuYXJjKHkuY3gseS5jeSxFLERnKHkueTAxLHkueDAxKSxEZyhfLnkwMSxfLngwMSksIWcpOih1LmFyYyh5LmN4LHkuY3ksRSxEZyh5LnkwMSx5LngwMSksRGcoeS55MTEseS54MTEpLCFnKSx1LmFyYygwLDAsbCxEZyh5LmN5K3kueTExLHkuY3greS54MTEpLERnKF8uY3krXy55MTEsXy5jeCtfLngxMSksZyksdS5hcmMoXy5jeCxfLmN5LEUsRGcoXy55MTEsXy54MTEpLERnKF8ueTAxLF8ueDAxKSwhZykpKTp1LmFyYygwLDAsbCx3LHgsZyk6dS5saW5lVG8oTCxEKX1lbHNlIHUubW92ZVRvKDAsMCk7aWYodS5jbG9zZVBhdGgoKSxmKXJldHVybiB1PW51bGwsZisiInx8bnVsbH1yZXR1cm4gZi5jZW50cm9pZD1mdW5jdGlvbigpe3ZhciBlPSgrdC5hcHBseSh0aGlzLGFyZ3VtZW50cykrICtuLmFwcGx5KHRoaXMsYXJndW1lbnRzKSkvMixyPSgraS5hcHBseSh0aGlzLGFyZ3VtZW50cykrICtvLmFwcGx5KHRoaXMsYXJndW1lbnRzKSkvMi1JZy8yO3JldHVybltVZyhyKSplLFlnKHIpKmVdfSxmLmlubmVyUmFkaXVzPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PSJmdW5jdGlvbiI9PXR5cGVvZiBuP246UmcoK24pLGYpOnR9LGYub3V0ZXJSYWRpdXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpSZygrdCksZik6bn0sZi5jb3JuZXJSYWRpdXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpSZygrdCksZik6ZX0sZi5wYWRSYWRpdXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9bnVsbD09dD9udWxsOiJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6UmcoK3QpLGYpOnJ9LGYuc3RhcnRBbmdsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlJnKCt0KSxmKTppfSxmLmVuZEFuZ2xlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6UmcoK3QpLGYpOm99LGYucGFkQW5nbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpSZygrdCksZik6YX0sZi5jb250ZXh0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PW51bGw9PXQ/bnVsbDp0LGYpOnV9LGZ9LHQuYXJlYT1yeSx0LmxpbmU9ZXksdC5waWU9ZnVuY3Rpb24oKXt2YXIgdD1veSxuPWl5LGU9bnVsbCxyPVJnKDApLGk9UmcoamcpLG89UmcoMCk7ZnVuY3Rpb24gYShhKXt2YXIgdSxmLGMscyxsLGg9YS5sZW5ndGgsZD0wLHA9bmV3IEFycmF5KGgpLHY9bmV3IEFycmF5KGgpLGc9K3IuYXBwbHkodGhpcyxhcmd1bWVudHMpLHk9TWF0aC5taW4oamcsTWF0aC5tYXgoLWpnLGkuYXBwbHkodGhpcyxhcmd1bWVudHMpLWcpKSxfPU1hdGgubWluKE1hdGguYWJzKHkpL2gsby5hcHBseSh0aGlzLGFyZ3VtZW50cykpLGI9XyooeTwwPy0xOjEpO2Zvcih1PTA7dTxoOysrdSkobD12W3BbdV09dV09K3QoYVt1XSx1LGEpKT4wJiYoZCs9bCk7Zm9yKG51bGwhPW4/cC5zb3J0KGZ1bmN0aW9uKHQsZSl7cmV0dXJuIG4odlt0XSx2W2VdKX0pOm51bGwhPWUmJnAuc29ydChmdW5jdGlvbih0LG4pe3JldHVybiBlKGFbdF0sYVtuXSl9KSx1PTAsYz1kPyh5LWgqYikvZDowO3U8aDsrK3UsZz1zKWY9cFt1XSxzPWcrKChsPXZbZl0pPjA/bCpjOjApK2IsdltmXT17ZGF0YTphW2ZdLGluZGV4OnUsdmFsdWU6bCxzdGFydEFuZ2xlOmcsZW5kQW5nbGU6cyxwYWRBbmdsZTpffTtyZXR1cm4gdn1yZXR1cm4gYS52YWx1ZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOlJnKCtuKSxhKTp0fSxhLnNvcnRWYWx1ZXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49dCxlPW51bGwsYSk6bn0sYS5zb3J0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPXQsbj1udWxsLGEpOmV9LGEuc3RhcnRBbmdsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlJnKCt0KSxhKTpyfSxhLmVuZEFuZ2xlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6UmcoK3QpLGEpOml9LGEucGFkQW5nbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpSZygrdCksYSk6b30sYX0sdC5hcmVhUmFkaWFsPWx5LHQucmFkaWFsQXJlYT1seSx0LmxpbmVSYWRpYWw9c3ksdC5yYWRpYWxMaW5lPXN5LHQucG9pbnRSYWRpYWw9aHksdC5saW5rSG9yaXpvbnRhbD1mdW5jdGlvbigpe3JldHVybiBneSh5eSl9LHQubGlua1ZlcnRpY2FsPWZ1bmN0aW9uKCl7cmV0dXJuIGd5KF95KX0sdC5saW5rUmFkaWFsPWZ1bmN0aW9uKCl7dmFyIHQ9Z3koYnkpO3JldHVybiB0LmFuZ2xlPXQueCxkZWxldGUgdC54LHQucmFkaXVzPXQueSxkZWxldGUgdC55LHR9LHQuc3ltYm9sPWZ1bmN0aW9uKCl7dmFyIHQ9UmcobXkpLG49UmcoNjQpLGU9bnVsbDtmdW5jdGlvbiByKCl7dmFyIHI7aWYoZXx8KGU9cj1HaSgpKSx0LmFwcGx5KHRoaXMsYXJndW1lbnRzKS5kcmF3KGUsK24uYXBwbHkodGhpcyxhcmd1bWVudHMpKSxyKXJldHVybiBlPW51bGwscisiInx8bnVsbH1yZXR1cm4gci50eXBlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PSJmdW5jdGlvbiI9PXR5cGVvZiBuP246Umcobikscik6dH0sci5zaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6UmcoK3QpLHIpOm59LHIuY29udGV4dD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT1udWxsPT10P251bGw6dCxyKTplfSxyfSx0LnN5bWJvbHM9VXksdC5zeW1ib2xDaXJjbGU9bXksdC5zeW1ib2xDcm9zcz14eSx0LnN5bWJvbERpYW1vbmQ9QXksdC5zeW1ib2xTcXVhcmU9a3ksdC5zeW1ib2xTdGFyPUV5LHQuc3ltYm9sVHJpYW5nbGU9UHksdC5zeW1ib2xXeWU9RHksdC5jdXJ2ZUJhc2lzQ2xvc2VkPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgQnkodCl9LHQuY3VydmVCYXNpc09wZW49ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBGeSh0KX0sdC5jdXJ2ZUJhc2lzPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgWXkodCl9LHQuY3VydmVCdW5kbGU9SHksdC5jdXJ2ZUNhcmRpbmFsQ2xvc2VkPSR5LHQuY3VydmVDYXJkaW5hbE9wZW49WnksdC5jdXJ2ZUNhcmRpbmFsPUd5LHQuY3VydmVDYXRtdWxsUm9tQ2xvc2VkPW5fLHQuY3VydmVDYXRtdWxsUm9tT3Blbj1yXyx0LmN1cnZlQ2F0bXVsbFJvbT1LeSx0LmN1cnZlTGluZWFyQ2xvc2VkPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgaV8odCl9LHQuY3VydmVMaW5lYXI9S2csdC5jdXJ2ZU1vbm90b25lWD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGNfKHQpfSx0LmN1cnZlTW9ub3RvbmVZPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgc18odCl9LHQuY3VydmVOYXR1cmFsPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgaF8odCl9LHQuY3VydmVTdGVwPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgcF8odCwuNSl9LHQuY3VydmVTdGVwQWZ0ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBwXyh0LDEpfSx0LmN1cnZlU3RlcEJlZm9yZT1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IHBfKHQsMCl9LHQuc3RhY2s9ZnVuY3Rpb24oKXt2YXIgdD1SZyhbXSksbj1nXyxlPXZfLHI9eV87ZnVuY3Rpb24gaShpKXt2YXIgbyxhLHU9dC5hcHBseSh0aGlzLGFyZ3VtZW50cyksZj1pLmxlbmd0aCxjPXUubGVuZ3RoLHM9bmV3IEFycmF5KGMpO2ZvcihvPTA7bzxjOysrbyl7Zm9yKHZhciBsLGg9dVtvXSxkPXNbb109bmV3IEFycmF5KGYpLHA9MDtwPGY7KytwKWRbcF09bD1bMCwrcihpW3BdLGgscCxpKV0sbC5kYXRhPWlbcF07ZC5rZXk9aH1mb3Iobz0wLGE9bihzKTtvPGM7KytvKXNbYVtvXV0uaW5kZXg9bztyZXR1cm4gZShzLGEpLHN9cmV0dXJuIGkua2V5cz1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOlJnKGR5LmNhbGwobikpLGkpOnR9LGkudmFsdWU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpSZygrdCksaSk6cn0saS5vcmRlcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj1udWxsPT10P2dfOiJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6UmcoZHkuY2FsbCh0KSksaSk6bn0saS5vZmZzZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9bnVsbD09dD92Xzp0LGkpOmV9LGl9LHQuc3RhY2tPZmZzZXRFeHBhbmQ9ZnVuY3Rpb24odCxuKXtpZigocj10Lmxlbmd0aCk+MCl7Zm9yKHZhciBlLHIsaSxvPTAsYT10WzBdLmxlbmd0aDtvPGE7KytvKXtmb3IoaT1lPTA7ZTxyOysrZSlpKz10W2VdW29dWzFdfHwwO2lmKGkpZm9yKGU9MDtlPHI7KytlKXRbZV1bb11bMV0vPWl9dl8odCxuKX19LHQuc3RhY2tPZmZzZXREaXZlcmdpbmc9ZnVuY3Rpb24odCxuKXtpZigodT10Lmxlbmd0aCk+MSlmb3IodmFyIGUscixpLG8sYSx1LGY9MCxjPXRbblswXV0ubGVuZ3RoO2Y8YzsrK2YpZm9yKG89YT0wLGU9MDtlPHU7KytlKShpPShyPXRbbltlXV1bZl0pWzFdLXJbMF0pPj0wPyhyWzBdPW8sclsxXT1vKz1pKTppPDA/KHJbMV09YSxyWzBdPWErPWkpOnJbMF09b30sdC5zdGFja09mZnNldE5vbmU9dl8sdC5zdGFja09mZnNldFNpbGhvdWV0dGU9ZnVuY3Rpb24odCxuKXtpZigoZT10Lmxlbmd0aCk+MCl7Zm9yKHZhciBlLHI9MCxpPXRbblswXV0sbz1pLmxlbmd0aDtyPG87KytyKXtmb3IodmFyIGE9MCx1PTA7YTxlOysrYSl1Kz10W2FdW3JdWzFdfHwwO2lbcl1bMV0rPWlbcl1bMF09LXUvMn12Xyh0LG4pfX0sdC5zdGFja09mZnNldFdpZ2dsZT1mdW5jdGlvbih0LG4pe2lmKChpPXQubGVuZ3RoKT4wJiYocj0oZT10W25bMF1dKS5sZW5ndGgpPjApe2Zvcih2YXIgZSxyLGksbz0wLGE9MTthPHI7KythKXtmb3IodmFyIHU9MCxmPTAsYz0wO3U8aTsrK3Upe2Zvcih2YXIgcz10W25bdV1dLGw9c1thXVsxXXx8MCxoPShsLShzW2EtMV1bMV18fDApKS8yLGQ9MDtkPHU7KytkKXt2YXIgcD10W25bZF1dO2grPShwW2FdWzFdfHwwKS0ocFthLTFdWzFdfHwwKX1mKz1sLGMrPWgqbH1lW2EtMV1bMV0rPWVbYS0xXVswXT1vLGYmJihvLT1jL2YpfWVbYS0xXVsxXSs9ZVthLTFdWzBdPW8sdl8odCxuKX19LHQuc3RhY2tPcmRlckFzY2VuZGluZz1fXyx0LnN0YWNrT3JkZXJEZXNjZW5kaW5nPWZ1bmN0aW9uKHQpe3JldHVybiBfXyh0KS5yZXZlcnNlKCl9LHQuc3RhY2tPcmRlckluc2lkZU91dD1mdW5jdGlvbih0KXt2YXIgbixlLHI9dC5sZW5ndGgsaT10Lm1hcChiXyksbz1nXyh0KS5zb3J0KGZ1bmN0aW9uKHQsbil7cmV0dXJuIGlbbl0taVt0XX0pLGE9MCx1PTAsZj1bXSxjPVtdO2ZvcihuPTA7bjxyOysrbillPW9bbl0sYTx1PyhhKz1pW2VdLGYucHVzaChlKSk6KHUrPWlbZV0sYy5wdXNoKGUpKTtyZXR1cm4gYy5yZXZlcnNlKCkuY29uY2F0KGYpfSx0LnN0YWNrT3JkZXJOb25lPWdfLHQuc3RhY2tPcmRlclJldmVyc2U9ZnVuY3Rpb24odCl7cmV0dXJuIGdfKHQpLnJldmVyc2UoKX0sdC50aW1lSW50ZXJ2YWw9UmgsdC50aW1lTWlsbGlzZWNvbmQ9TGgsdC50aW1lTWlsbGlzZWNvbmRzPURoLHQudXRjTWlsbGlzZWNvbmQ9TGgsdC51dGNNaWxsaXNlY29uZHM9RGgsdC50aW1lU2Vjb25kPU9oLHQudGltZVNlY29uZHM9WWgsdC51dGNTZWNvbmQ9T2gsdC51dGNTZWNvbmRzPVloLHQudGltZU1pbnV0ZT1CaCx0LnRpbWVNaW51dGVzPUZoLHQudGltZUhvdXI9SWgsdC50aW1lSG91cnM9SGgsdC50aW1lRGF5PWpoLHQudGltZURheXM9WGgsdC50aW1lV2Vlaz1WaCx0LnRpbWVXZWVrcz10ZCx0LnRpbWVTdW5kYXk9VmgsdC50aW1lU3VuZGF5cz10ZCx0LnRpbWVNb25kYXk9JGgsdC50aW1lTW9uZGF5cz1uZCx0LnRpbWVUdWVzZGF5PVdoLHQudGltZVR1ZXNkYXlzPWVkLHQudGltZVdlZG5lc2RheT1aaCx0LnRpbWVXZWRuZXNkYXlzPXJkLHQudGltZVRodXJzZGF5PVFoLHQudGltZVRodXJzZGF5cz1pZCx0LnRpbWVGcmlkYXk9SmgsdC50aW1lRnJpZGF5cz1vZCx0LnRpbWVTYXR1cmRheT1LaCx0LnRpbWVTYXR1cmRheXM9YWQsdC50aW1lTW9udGg9dWQsdC50aW1lTW9udGhzPWZkLHQudGltZVllYXI9Y2QsdC50aW1lWWVhcnM9c2QsdC51dGNNaW51dGU9bGQsdC51dGNNaW51dGVzPWhkLHQudXRjSG91cj1kZCx0LnV0Y0hvdXJzPXBkLHQudXRjRGF5PXZkLHQudXRjRGF5cz1nZCx0LnV0Y1dlZWs9X2QsdC51dGNXZWVrcz1UZCx0LnV0Y1N1bmRheT1fZCx0LnV0Y1N1bmRheXM9VGQsdC51dGNNb25kYXk9YmQsdC51dGNNb25kYXlzPU5kLHQudXRjVHVlc2RheT1tZCx0LnV0Y1R1ZXNkYXlzPVNkLHQudXRjV2VkbmVzZGF5PXhkLHQudXRjV2VkbmVzZGF5cz1FZCx0LnV0Y1RodXJzZGF5PXdkLHQudXRjVGh1cnNkYXlzPWtkLHQudXRjRnJpZGF5PU1kLHQudXRjRnJpZGF5cz1DZCx0LnV0Y1NhdHVyZGF5PUFkLHQudXRjU2F0dXJkYXlzPVBkLHQudXRjTW9udGg9emQsdC51dGNNb250aHM9UmQsdC51dGNZZWFyPUxkLHQudXRjWWVhcnM9RGQsdC50aW1lRm9ybWF0RGVmYXVsdExvY2FsZT1RcCx0LnRpbWVGb3JtYXRMb2NhbGU9WWQsdC5pc29Gb3JtYXQ9SnAsdC5pc29QYXJzZT1LcCx0Lm5vdz1pcix0LnRpbWVyPXVyLHQudGltZXJGbHVzaD1mcix0LnRpbWVvdXQ9aHIsdC5pbnRlcnZhbD1mdW5jdGlvbih0LG4sZSl7dmFyIHI9bmV3IGFyLGk9bjtyZXR1cm4gbnVsbD09bj8oci5yZXN0YXJ0KHQsbixlKSxyKToobj0rbixlPW51bGw9PWU/aXIoKTorZSxyLnJlc3RhcnQoZnVuY3Rpb24gbyhhKXthKz1pLHIucmVzdGFydChvLGkrPW4sZSksdChhKX0sbixlKSxyKX0sdC50cmFuc2l0aW9uPXpyLHQuYWN0aXZlPWZ1bmN0aW9uKHQsbil7dmFyIGUscixpPXQuX190cmFuc2l0aW9uO2lmKGkpZm9yKHIgaW4gbj1udWxsPT1uP251bGw6bisiIixpKWlmKChlPWlbcl0pLnN0YXRlPmdyJiZlLm5hbWU9PT1uKXJldHVybiBuZXcgUHIoW1t0XV0sbGksbiwrcik7cmV0dXJuIG51bGx9LHQuaW50ZXJydXB0PU5yLHQudm9yb25vaT1mdW5jdGlvbigpe3ZhciB0PXhfLG49d18sZT1udWxsO2Z1bmN0aW9uIHIocil7cmV0dXJuIG5ldyBlYihyLm1hcChmdW5jdGlvbihlLGkpe3ZhciBvPVtNYXRoLnJvdW5kKHQoZSxpLHIpL0tfKSpLXyxNYXRoLnJvdW5kKG4oZSxpLHIpL0tfKSpLX107cmV0dXJuIG8uaW5kZXg9aSxvLmRhdGE9ZSxvfSksZSl9cmV0dXJuIHIucG9seWdvbnM9ZnVuY3Rpb24odCl7cmV0dXJuIHIodCkucG9seWdvbnMoKX0sci5saW5rcz1mdW5jdGlvbih0KXtyZXR1cm4gcih0KS5saW5rcygpfSxyLnRyaWFuZ2xlcz1mdW5jdGlvbih0KXtyZXR1cm4gcih0KS50cmlhbmdsZXMoKX0sci54PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PSJmdW5jdGlvbiI9PXR5cGVvZiBuP246bV8oK24pLHIpOnR9LHIueT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj0iZnVuY3Rpb24iPT10eXBlb2YgdD90Om1fKCt0KSxyKTpufSxyLmV4dGVudD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT1udWxsPT10P251bGw6W1srdFswXVswXSwrdFswXVsxXV0sWyt0WzFdWzBdLCt0WzFdWzFdXV0scik6ZSYmW1tlWzBdWzBdLGVbMF1bMV1dLFtlWzFdWzBdLGVbMV1bMV1dXX0sci5zaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPW51bGw9PXQ/bnVsbDpbWzAsMF0sWyt0WzBdLCt0WzFdXV0scik6ZSYmW2VbMV1bMF0tZVswXVswXSxlWzFdWzFdLWVbMF1bMV1dfSxyfSx0Lnpvb209ZnVuY3Rpb24oKXt2YXIgbixlLHI9c2IsaT1sYixvPXZiLGE9ZGIsdT1wYixmPVswLDEvMF0sYz1bWy0xLzAsLTEvMF0sWzEvMCwxLzBdXSxzPTI1MCxsPXFlLGg9W10sZD1JKCJzdGFydCIsInpvb20iLCJlbmQiKSxwPTUwMCx2PTE1MCxnPTA7ZnVuY3Rpb24geSh0KXt0LnByb3BlcnR5KCJfX3pvb20iLGhiKS5vbigid2hlZWwuem9vbSIsQSkub24oIm1vdXNlZG93bi56b29tIixUKS5vbigiZGJsY2xpY2suem9vbSIsTikuZmlsdGVyKHUpLm9uKCJ0b3VjaHN0YXJ0Lnpvb20iLFMpLm9uKCJ0b3VjaG1vdmUuem9vbSIsRSkub24oInRvdWNoZW5kLnpvb20gdG91Y2hjYW5jZWwuem9vbSIsaykuc3R5bGUoInRvdWNoLWFjdGlvbiIsIm5vbmUiKS5zdHlsZSgiLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yIiwicmdiYSgwLDAsMCwwKSIpfWZ1bmN0aW9uIF8odCxuKXtyZXR1cm4obj1NYXRoLm1heChmWzBdLE1hdGgubWluKGZbMV0sbikpKT09PXQuaz90Om5ldyBvYihuLHQueCx0LnkpfWZ1bmN0aW9uIGIodCxuLGUpe3ZhciByPW5bMF0tZVswXSp0LmssaT1uWzFdLWVbMV0qdC5rO3JldHVybiByPT09dC54JiZpPT09dC55P3Q6bmV3IG9iKHQuayxyLGkpfWZ1bmN0aW9uIG0odCl7cmV0dXJuWygrdFswXVswXSsgK3RbMV1bMF0pLzIsKCt0WzBdWzFdKyArdFsxXVsxXSkvMl19ZnVuY3Rpb24geCh0LG4sZSl7dC5vbigic3RhcnQuem9vbSIsZnVuY3Rpb24oKXt3KHRoaXMsYXJndW1lbnRzKS5zdGFydCgpfSkub24oImludGVycnVwdC56b29tIGVuZC56b29tIixmdW5jdGlvbigpe3codGhpcyxhcmd1bWVudHMpLmVuZCgpfSkudHdlZW4oInpvb20iLGZ1bmN0aW9uKCl7dmFyIHQ9YXJndW1lbnRzLHI9dyh0aGlzLHQpLG89aS5hcHBseSh0aGlzLHQpLGE9ZXx8bShvKSx1PU1hdGgubWF4KG9bMV1bMF0tb1swXVswXSxvWzFdWzFdLW9bMF1bMV0pLGY9dGhpcy5fX3pvb20sYz0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uLmFwcGx5KHRoaXMsdCk6bixzPWwoZi5pbnZlcnQoYSkuY29uY2F0KHUvZi5rKSxjLmludmVydChhKS5jb25jYXQodS9jLmspKTtyZXR1cm4gZnVuY3Rpb24odCl7aWYoMT09PXQpdD1jO2Vsc2V7dmFyIG49cyh0KSxlPXUvblsyXTt0PW5ldyBvYihlLGFbMF0tblswXSplLGFbMV0tblsxXSplKX1yLnpvb20obnVsbCx0KX19KX1mdW5jdGlvbiB3KHQsbil7Zm9yKHZhciBlLHI9MCxpPWgubGVuZ3RoO3I8aTsrK3IpaWYoKGU9aFtyXSkudGhhdD09PXQpcmV0dXJuIGU7cmV0dXJuIG5ldyBNKHQsbil9ZnVuY3Rpb24gTSh0LG4pe3RoaXMudGhhdD10LHRoaXMuYXJncz1uLHRoaXMuaW5kZXg9LTEsdGhpcy5hY3RpdmU9MCx0aGlzLmV4dGVudD1pLmFwcGx5KHQsbil9ZnVuY3Rpb24gQSgpe2lmKHIuYXBwbHkodGhpcyxhcmd1bWVudHMpKXt2YXIgdD13KHRoaXMsYXJndW1lbnRzKSxuPXRoaXMuX196b29tLGU9TWF0aC5tYXgoZlswXSxNYXRoLm1pbihmWzFdLG4uaypNYXRoLnBvdygyLGEuYXBwbHkodGhpcyxhcmd1bWVudHMpKSkpLGk9RnQodGhpcyk7aWYodC53aGVlbCl0Lm1vdXNlWzBdWzBdPT09aVswXSYmdC5tb3VzZVswXVsxXT09PWlbMV18fCh0Lm1vdXNlWzFdPW4uaW52ZXJ0KHQubW91c2VbMF09aSkpLGNsZWFyVGltZW91dCh0LndoZWVsKTtlbHNle2lmKG4uaz09PWUpcmV0dXJuO3QubW91c2U9W2ksbi5pbnZlcnQoaSldLE5yKHRoaXMpLHQuc3RhcnQoKX1jYigpLHQud2hlZWw9c2V0VGltZW91dChmdW5jdGlvbigpe3Qud2hlZWw9bnVsbCx0LmVuZCgpfSx2KSx0Lnpvb20oIm1vdXNlIixvKGIoXyhuLGUpLHQubW91c2VbMF0sdC5tb3VzZVsxXSksdC5leHRlbnQsYykpfX1mdW5jdGlvbiBUKCl7aWYoIWUmJnIuYXBwbHkodGhpcyxhcmd1bWVudHMpKXt2YXIgbj13KHRoaXMsYXJndW1lbnRzKSxpPUR0KHQuZXZlbnQudmlldykub24oIm1vdXNlbW92ZS56b29tIixmdW5jdGlvbigpe2lmKGNiKCksIW4ubW92ZWQpe3ZhciBlPXQuZXZlbnQuY2xpZW50WC11LHI9dC5ldmVudC5jbGllbnRZLWY7bi5tb3ZlZD1lKmUrcipyPmd9bi56b29tKCJtb3VzZSIsbyhiKG4udGhhdC5fX3pvb20sbi5tb3VzZVswXT1GdChuLnRoYXQpLG4ubW91c2VbMV0pLG4uZXh0ZW50LGMpKX0sITApLm9uKCJtb3VzZXVwLnpvb20iLGZ1bmN0aW9uKCl7aS5vbigibW91c2Vtb3ZlLnpvb20gbW91c2V1cC56b29tIixudWxsKSxHdCh0LmV2ZW50LnZpZXcsbi5tb3ZlZCksY2IoKSxuLmVuZCgpfSwhMCksYT1GdCh0aGlzKSx1PXQuZXZlbnQuY2xpZW50WCxmPXQuZXZlbnQuY2xpZW50WTtYdCh0LmV2ZW50LnZpZXcpLGZiKCksbi5tb3VzZT1bYSx0aGlzLl9fem9vbS5pbnZlcnQoYSldLE5yKHRoaXMpLG4uc3RhcnQoKX19ZnVuY3Rpb24gTigpe2lmKHIuYXBwbHkodGhpcyxhcmd1bWVudHMpKXt2YXIgbj10aGlzLl9fem9vbSxlPUZ0KHRoaXMpLGE9bi5pbnZlcnQoZSksdT1uLmsqKHQuZXZlbnQuc2hpZnRLZXk/LjU6MiksZj1vKGIoXyhuLHUpLGUsYSksaS5hcHBseSh0aGlzLGFyZ3VtZW50cyksYyk7Y2IoKSxzPjA/RHQodGhpcykudHJhbnNpdGlvbigpLmR1cmF0aW9uKHMpLmNhbGwoeCxmLGUpOkR0KHRoaXMpLmNhbGwoeS50cmFuc2Zvcm0sZil9fWZ1bmN0aW9uIFMoKXtpZihyLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl7dmFyIGUsaSxvLGEsdT13KHRoaXMsYXJndW1lbnRzKSxmPXQuZXZlbnQuY2hhbmdlZFRvdWNoZXMsYz1mLmxlbmd0aDtmb3IoZmIoKSxpPTA7aTxjOysraSlhPVthPUl0KHRoaXMsZiwobz1mW2ldKS5pZGVudGlmaWVyKSx0aGlzLl9fem9vbS5pbnZlcnQoYSksby5pZGVudGlmaWVyXSx1LnRvdWNoMD91LnRvdWNoMXx8KHUudG91Y2gxPWEpOih1LnRvdWNoMD1hLGU9ITApO2lmKG4mJihuPWNsZWFyVGltZW91dChuKSwhdS50b3VjaDEpKXJldHVybiB1LmVuZCgpLHZvaWQoKGE9RHQodGhpcykub24oImRibGNsaWNrLnpvb20iKSkmJmEuYXBwbHkodGhpcyxhcmd1bWVudHMpKTtlJiYobj1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7bj1udWxsfSxwKSxOcih0aGlzKSx1LnN0YXJ0KCkpfX1mdW5jdGlvbiBFKCl7dmFyIGUscixpLGEsdT13KHRoaXMsYXJndW1lbnRzKSxmPXQuZXZlbnQuY2hhbmdlZFRvdWNoZXMscz1mLmxlbmd0aDtmb3IoY2IoKSxuJiYobj1jbGVhclRpbWVvdXQobikpLGU9MDtlPHM7KytlKWk9SXQodGhpcyxmLChyPWZbZV0pLmlkZW50aWZpZXIpLHUudG91Y2gwJiZ1LnRvdWNoMFsyXT09PXIuaWRlbnRpZmllcj91LnRvdWNoMFswXT1pOnUudG91Y2gxJiZ1LnRvdWNoMVsyXT09PXIuaWRlbnRpZmllciYmKHUudG91Y2gxWzBdPWkpO2lmKHI9dS50aGF0Ll9fem9vbSx1LnRvdWNoMSl7dmFyIGw9dS50b3VjaDBbMF0saD11LnRvdWNoMFsxXSxkPXUudG91Y2gxWzBdLHA9dS50b3VjaDFbMV0sdj0odj1kWzBdLWxbMF0pKnYrKHY9ZFsxXS1sWzFdKSp2LGc9KGc9cFswXS1oWzBdKSpnKyhnPXBbMV0taFsxXSkqZztyPV8ocixNYXRoLnNxcnQodi9nKSksaT1bKGxbMF0rZFswXSkvMiwobFsxXStkWzFdKS8yXSxhPVsoaFswXStwWzBdKS8yLChoWzFdK3BbMV0pLzJdfWVsc2V7aWYoIXUudG91Y2gwKXJldHVybjtpPXUudG91Y2gwWzBdLGE9dS50b3VjaDBbMV19dS56b29tKCJ0b3VjaCIsbyhiKHIsaSxhKSx1LmV4dGVudCxjKSl9ZnVuY3Rpb24gaygpe3ZhciBuLHIsaT13KHRoaXMsYXJndW1lbnRzKSxvPXQuZXZlbnQuY2hhbmdlZFRvdWNoZXMsYT1vLmxlbmd0aDtmb3IoZmIoKSxlJiZjbGVhclRpbWVvdXQoZSksZT1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZT1udWxsfSxwKSxuPTA7bjxhOysrbilyPW9bbl0saS50b3VjaDAmJmkudG91Y2gwWzJdPT09ci5pZGVudGlmaWVyP2RlbGV0ZSBpLnRvdWNoMDppLnRvdWNoMSYmaS50b3VjaDFbMl09PT1yLmlkZW50aWZpZXImJmRlbGV0ZSBpLnRvdWNoMTtpLnRvdWNoMSYmIWkudG91Y2gwJiYoaS50b3VjaDA9aS50b3VjaDEsZGVsZXRlIGkudG91Y2gxKSxpLnRvdWNoMD9pLnRvdWNoMFsxXT10aGlzLl9fem9vbS5pbnZlcnQoaS50b3VjaDBbMF0pOmkuZW5kKCl9cmV0dXJuIHkudHJhbnNmb3JtPWZ1bmN0aW9uKHQsbil7dmFyIGU9dC5zZWxlY3Rpb24/dC5zZWxlY3Rpb24oKTp0O2UucHJvcGVydHkoIl9fem9vbSIsaGIpLHQhPT1lP3godCxuKTplLmludGVycnVwdCgpLmVhY2goZnVuY3Rpb24oKXt3KHRoaXMsYXJndW1lbnRzKS5zdGFydCgpLnpvb20obnVsbCwiZnVuY3Rpb24iPT10eXBlb2Ygbj9uLmFwcGx5KHRoaXMsYXJndW1lbnRzKTpuKS5lbmQoKX0pfSx5LnNjYWxlQnk9ZnVuY3Rpb24odCxuKXt5LnNjYWxlVG8odCxmdW5jdGlvbigpe3JldHVybiB0aGlzLl9fem9vbS5rKigiZnVuY3Rpb24iPT10eXBlb2Ygbj9uLmFwcGx5KHRoaXMsYXJndW1lbnRzKTpuKX0pfSx5LnNjYWxlVG89ZnVuY3Rpb24odCxuKXt5LnRyYW5zZm9ybSh0LGZ1bmN0aW9uKCl7dmFyIHQ9aS5hcHBseSh0aGlzLGFyZ3VtZW50cyksZT10aGlzLl9fem9vbSxyPW0odCksYT1lLmludmVydChyKSx1PSJmdW5jdGlvbiI9PXR5cGVvZiBuP24uYXBwbHkodGhpcyxhcmd1bWVudHMpOm47cmV0dXJuIG8oYihfKGUsdSkscixhKSx0LGMpfSl9LHkudHJhbnNsYXRlQnk9ZnVuY3Rpb24odCxuLGUpe3kudHJhbnNmb3JtKHQsZnVuY3Rpb24oKXtyZXR1cm4gbyh0aGlzLl9fem9vbS50cmFuc2xhdGUoImZ1bmN0aW9uIj09dHlwZW9mIG4/bi5hcHBseSh0aGlzLGFyZ3VtZW50cyk6biwiZnVuY3Rpb24iPT10eXBlb2YgZT9lLmFwcGx5KHRoaXMsYXJndW1lbnRzKTplKSxpLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxjKX0pfSx5LnRyYW5zbGF0ZVRvPWZ1bmN0aW9uKHQsbixlKXt5LnRyYW5zZm9ybSh0LGZ1bmN0aW9uKCl7dmFyIHQ9aS5hcHBseSh0aGlzLGFyZ3VtZW50cykscj10aGlzLl9fem9vbSxhPW0odCk7cmV0dXJuIG8oYWIudHJhbnNsYXRlKGFbMF0sYVsxXSkuc2NhbGUoci5rKS50cmFuc2xhdGUoImZ1bmN0aW9uIj09dHlwZW9mIG4/LW4uYXBwbHkodGhpcyxhcmd1bWVudHMpOi1uLCJmdW5jdGlvbiI9PXR5cGVvZiBlPy1lLmFwcGx5KHRoaXMsYXJndW1lbnRzKTotZSksdCxjKX0pfSxNLnByb3RvdHlwZT17c3RhcnQ6ZnVuY3Rpb24oKXtyZXR1cm4gMT09Kyt0aGlzLmFjdGl2ZSYmKHRoaXMuaW5kZXg9aC5wdXNoKHRoaXMpLTEsdGhpcy5lbWl0KCJzdGFydCIpKSx0aGlzfSx6b29tOmZ1bmN0aW9uKHQsbil7cmV0dXJuIHRoaXMubW91c2UmJiJtb3VzZSIhPT10JiYodGhpcy5tb3VzZVsxXT1uLmludmVydCh0aGlzLm1vdXNlWzBdKSksdGhpcy50b3VjaDAmJiJ0b3VjaCIhPT10JiYodGhpcy50b3VjaDBbMV09bi5pbnZlcnQodGhpcy50b3VjaDBbMF0pKSx0aGlzLnRvdWNoMSYmInRvdWNoIiE9PXQmJih0aGlzLnRvdWNoMVsxXT1uLmludmVydCh0aGlzLnRvdWNoMVswXSkpLHRoaXMudGhhdC5fX3pvb209bix0aGlzLmVtaXQoInpvb20iKSx0aGlzfSxlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gMD09LS10aGlzLmFjdGl2ZSYmKGguc3BsaWNlKHRoaXMuaW5kZXgsMSksdGhpcy5pbmRleD0tMSx0aGlzLmVtaXQoImVuZCIpKSx0aGlzfSxlbWl0OmZ1bmN0aW9uKHQpe0N0KG5ldyBpYih5LHQsdGhpcy50aGF0Ll9fem9vbSksZC5hcHBseSxkLFt0LHRoaXMudGhhdCx0aGlzLmFyZ3NdKX19LHkud2hlZWxEZWx0YT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OnJiKCt0KSx5KTphfSx5LmZpbHRlcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0iZnVuY3Rpb24iPT10eXBlb2YgdD90OnJiKCEhdCkseSk6cn0seS50b3VjaGFibGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpyYighIXQpLHkpOnV9LHkuZXh0ZW50PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6cmIoW1srdFswXVswXSwrdFswXVsxXV0sWyt0WzFdWzBdLCt0WzFdWzFdXV0pLHkpOml9LHkuc2NhbGVFeHRlbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGZbMF09K3RbMF0sZlsxXT0rdFsxXSx5KTpbZlswXSxmWzFdXX0seS50cmFuc2xhdGVFeHRlbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGNbMF1bMF09K3RbMF1bMF0sY1sxXVswXT0rdFsxXVswXSxjWzBdWzFdPSt0WzBdWzFdLGNbMV1bMV09K3RbMV1bMV0seSk6W1tjWzBdWzBdLGNbMF1bMV1dLFtjWzFdWzBdLGNbMV1bMV1dXX0seS5jb25zdHJhaW49ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89dCx5KTpvfSx5LmR1cmF0aW9uPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhzPSt0LHkpOnN9LHkuaW50ZXJwb2xhdGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGw9dCx5KTpsfSx5Lm9uPWZ1bmN0aW9uKCl7dmFyIHQ9ZC5vbi5hcHBseShkLGFyZ3VtZW50cyk7cmV0dXJuIHQ9PT1kP3k6dH0seS5jbGlja0Rpc3RhbmNlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhnPSh0PSt0KSp0LHkpOk1hdGguc3FydChnKX0seX0sdC56b29tVHJhbnNmb3JtPXViLHQuem9vbUlkZW50aXR5PWFiLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KX0pOwo8L3NjcmlwdD48c2NyaXB0Pi8qCgogTG9kYXNoIDxodHRwczovL2xvZGFzaC5jb20vPgogQ29weXJpZ2h0IEpTIEZvdW5kYXRpb24gYW5kIG90aGVyIGNvbnRyaWJ1dG9ycyA8aHR0cHM6Ly9qcy5mb3VuZGF0aW9uLz4KIFJlbGVhc2VkIHVuZGVyIE1JVCBsaWNlbnNlIDxodHRwczovL2xvZGFzaC5jb20vbGljZW5zZT4KIEJhc2VkIG9uIFVuZGVyc2NvcmUuanMgMS44LjMgPGh0dHA6Ly91bmRlcnNjb3JlanMub3JnL0xJQ0VOU0U+CiBDb3B5cmlnaHQgSmVyZW15IEFzaGtlbmFzLCBEb2N1bWVudENsb3VkIGFuZCBJbnZlc3RpZ2F0aXZlIFJlcG9ydGVycyAmIEVkaXRvcnMKKi8KKGZ1bmN0aW9uKCl7dmFyIHVuZGVmaW5lZDt2YXIgVkVSU0lPTj0iNC4xNy41Ijt2YXIgTEFSR0VfQVJSQVlfU0laRT0yMDA7dmFyIENPUkVfRVJST1JfVEVYVD0iVW5zdXBwb3J0ZWQgY29yZS1qcyB1c2UuIFRyeSBodHRwczovL25wbXMuaW8vc2VhcmNoP3FceDNkcG9ueWZpbGwuIixGVU5DX0VSUk9SX1RFWFQ9IkV4cGVjdGVkIGEgZnVuY3Rpb24iO3ZhciBIQVNIX1VOREVGSU5FRD0iX19sb2Rhc2hfaGFzaF91bmRlZmluZWRfXyI7dmFyIE1BWF9NRU1PSVpFX1NJWkU9NTAwO3ZhciBQTEFDRUhPTERFUj0iX19sb2Rhc2hfcGxhY2Vob2xkZXJfXyI7dmFyIENMT05FX0RFRVBfRkxBRz0xLENMT05FX0ZMQVRfRkxBRz0yLENMT05FX1NZTUJPTFNfRkxBRz00O3ZhciBDT01QQVJFX1BBUlRJQUxfRkxBRz0xLENPTVBBUkVfVU5PUkRFUkVEX0ZMQUc9Mjt2YXIgV1JBUF9CSU5EX0ZMQUc9MSxXUkFQX0JJTkRfS0VZX0ZMQUc9MixXUkFQX0NVUlJZX0JPVU5EX0ZMQUc9NCxXUkFQX0NVUlJZX0ZMQUc9CjgsV1JBUF9DVVJSWV9SSUdIVF9GTEFHPTE2LFdSQVBfUEFSVElBTF9GTEFHPTMyLFdSQVBfUEFSVElBTF9SSUdIVF9GTEFHPTY0LFdSQVBfQVJZX0ZMQUc9MTI4LFdSQVBfUkVBUkdfRkxBRz0yNTYsV1JBUF9GTElQX0ZMQUc9NTEyO3ZhciBERUZBVUxUX1RSVU5DX0xFTkdUSD0zMCxERUZBVUxUX1RSVU5DX09NSVNTSU9OPSIuLi4iO3ZhciBIT1RfQ09VTlQ9ODAwLEhPVF9TUEFOPTE2O3ZhciBMQVpZX0ZJTFRFUl9GTEFHPTEsTEFaWV9NQVBfRkxBRz0yLExBWllfV0hJTEVfRkxBRz0zO3ZhciBJTkZJTklUWT0xLzAsTUFYX1NBRkVfSU5URUdFUj05MDA3MTk5MjU0NzQwOTkxLE1BWF9JTlRFR0VSPTEuNzk3NjkzMTM0ODYyMzE1N0UzMDgsTkFOPTAvMDt2YXIgTUFYX0FSUkFZX0xFTkdUSD00Mjk0OTY3Mjk1LE1BWF9BUlJBWV9JTkRFWD1NQVhfQVJSQVlfTEVOR1RILTEsSEFMRl9NQVhfQVJSQVlfTEVOR1RIPU1BWF9BUlJBWV9MRU5HVEg+Pj4xO3ZhciB3cmFwRmxhZ3M9W1siYXJ5IiwKV1JBUF9BUllfRkxBR10sWyJiaW5kIixXUkFQX0JJTkRfRkxBR10sWyJiaW5kS2V5IixXUkFQX0JJTkRfS0VZX0ZMQUddLFsiY3VycnkiLFdSQVBfQ1VSUllfRkxBR10sWyJjdXJyeVJpZ2h0IixXUkFQX0NVUlJZX1JJR0hUX0ZMQUddLFsiZmxpcCIsV1JBUF9GTElQX0ZMQUddLFsicGFydGlhbCIsV1JBUF9QQVJUSUFMX0ZMQUddLFsicGFydGlhbFJpZ2h0IixXUkFQX1BBUlRJQUxfUklHSFRfRkxBR10sWyJyZWFyZyIsV1JBUF9SRUFSR19GTEFHXV07dmFyIGFyZ3NUYWc9IltvYmplY3QgQXJndW1lbnRzXSIsYXJyYXlUYWc9IltvYmplY3QgQXJyYXldIixhc3luY1RhZz0iW29iamVjdCBBc3luY0Z1bmN0aW9uXSIsYm9vbFRhZz0iW29iamVjdCBCb29sZWFuXSIsZGF0ZVRhZz0iW29iamVjdCBEYXRlXSIsZG9tRXhjVGFnPSJbb2JqZWN0IERPTUV4Y2VwdGlvbl0iLGVycm9yVGFnPSJbb2JqZWN0IEVycm9yXSIsZnVuY1RhZz0iW29iamVjdCBGdW5jdGlvbl0iLGdlblRhZz0iW29iamVjdCBHZW5lcmF0b3JGdW5jdGlvbl0iLAptYXBUYWc9IltvYmplY3QgTWFwXSIsbnVtYmVyVGFnPSJbb2JqZWN0IE51bWJlcl0iLG51bGxUYWc9IltvYmplY3QgTnVsbF0iLG9iamVjdFRhZz0iW29iamVjdCBPYmplY3RdIixwcm9taXNlVGFnPSJbb2JqZWN0IFByb21pc2VdIixwcm94eVRhZz0iW29iamVjdCBQcm94eV0iLHJlZ2V4cFRhZz0iW29iamVjdCBSZWdFeHBdIixzZXRUYWc9IltvYmplY3QgU2V0XSIsc3RyaW5nVGFnPSJbb2JqZWN0IFN0cmluZ10iLHN5bWJvbFRhZz0iW29iamVjdCBTeW1ib2xdIix1bmRlZmluZWRUYWc9IltvYmplY3QgVW5kZWZpbmVkXSIsd2Vha01hcFRhZz0iW29iamVjdCBXZWFrTWFwXSIsd2Vha1NldFRhZz0iW29iamVjdCBXZWFrU2V0XSI7dmFyIGFycmF5QnVmZmVyVGFnPSJbb2JqZWN0IEFycmF5QnVmZmVyXSIsZGF0YVZpZXdUYWc9IltvYmplY3QgRGF0YVZpZXddIixmbG9hdDMyVGFnPSJbb2JqZWN0IEZsb2F0MzJBcnJheV0iLGZsb2F0NjRUYWc9IltvYmplY3QgRmxvYXQ2NEFycmF5XSIsCmludDhUYWc9IltvYmplY3QgSW50OEFycmF5XSIsaW50MTZUYWc9IltvYmplY3QgSW50MTZBcnJheV0iLGludDMyVGFnPSJbb2JqZWN0IEludDMyQXJyYXldIix1aW50OFRhZz0iW29iamVjdCBVaW50OEFycmF5XSIsdWludDhDbGFtcGVkVGFnPSJbb2JqZWN0IFVpbnQ4Q2xhbXBlZEFycmF5XSIsdWludDE2VGFnPSJbb2JqZWN0IFVpbnQxNkFycmF5XSIsdWludDMyVGFnPSJbb2JqZWN0IFVpbnQzMkFycmF5XSI7dmFyIHJlRW1wdHlTdHJpbmdMZWFkaW5nPS9cYl9fcCBcKz0gJyc7L2cscmVFbXB0eVN0cmluZ01pZGRsZT0vXGIoX19wIFwrPSkgJycgXCsvZyxyZUVtcHR5U3RyaW5nVHJhaWxpbmc9LyhfX2VcKC4qP1wpfFxiX190XCkpIFwrXG4nJzsvZzt2YXIgcmVFc2NhcGVkSHRtbD0vJig/OmFtcHxsdHxndHxxdW90fCMzOSk7L2cscmVVbmVzY2FwZWRIdG1sPS9bJjw+IiddL2cscmVIYXNFc2NhcGVkSHRtbD1SZWdFeHAocmVFc2NhcGVkSHRtbC5zb3VyY2UpLHJlSGFzVW5lc2NhcGVkSHRtbD0KUmVnRXhwKHJlVW5lc2NhcGVkSHRtbC5zb3VyY2UpO3ZhciByZUVzY2FwZT0vPCUtKFtcc1xTXSs/KSU+L2cscmVFdmFsdWF0ZT0vPCUoW1xzXFNdKz8pJT4vZyxyZUludGVycG9sYXRlPS88JT0oW1xzXFNdKz8pJT4vZzt2YXIgcmVJc0RlZXBQcm9wPS9cLnxcWyg/OlteW1xdXSp8KFsiJ10pKD86KD8hXDEpW15cXF18XFwuKSo/XDEpXF0vLHJlSXNQbGFpblByb3A9L15cdyokLyxyZVByb3BOYW1lPS9bXi5bXF1dK3xcWyg/OigtP1xkKyg/OlwuXGQrKT8pfChbIiddKSgoPzooPyFcMilbXlxcXXxcXC4pKj8pXDIpXF18KD89KD86XC58XFtcXSkoPzpcLnxcW1xdfCQpKS9nO3ZhciByZVJlZ0V4cENoYXI9L1tcXF4kLiorPygpW1xde318XS9nLHJlSGFzUmVnRXhwQ2hhcj1SZWdFeHAocmVSZWdFeHBDaGFyLnNvdXJjZSk7dmFyIHJlVHJpbT0vXlxzK3xccyskL2cscmVUcmltU3RhcnQ9L15ccysvLHJlVHJpbUVuZD0vXHMrJC87dmFyIHJlV3JhcENvbW1lbnQ9L1x7KD86XG5cL1wqIFxbd3JhcHBlZCB3aXRoIC4rXF0gXCpcLyk/XG4/LywKcmVXcmFwRGV0YWlscz0vXHtcblwvXCogXFt3cmFwcGVkIHdpdGggKC4rKVxdIFwqLyxyZVNwbGl0RGV0YWlscz0vLD8gJiAvO3ZhciByZUFzY2lpV29yZD0vW15ceDAwLVx4MmZceDNhLVx4NDBceDViLVx4NjBceDdiLVx4N2ZdKy9nO3ZhciByZUVzY2FwZUNoYXI9L1xcKFxcKT8vZzt2YXIgcmVFc1RlbXBsYXRlPS9cJFx7KFteXFx9XSooPzpcXC5bXlxcfV0qKSopXH0vZzt2YXIgcmVGbGFncz0vXHcqJC87dmFyIHJlSXNCYWRIZXg9L15bLStdMHhbMC05YS1mXSskL2k7dmFyIHJlSXNCaW5hcnk9L14wYlswMV0rJC9pO3ZhciByZUlzSG9zdEN0b3I9L15cW29iamVjdCAuKz9Db25zdHJ1Y3RvclxdJC87dmFyIHJlSXNPY3RhbD0vXjBvWzAtN10rJC9pO3ZhciByZUlzVWludD0vXig/OjB8WzEtOV1cZCopJC87dmFyIHJlTGF0aW49L1tceGMwLVx4ZDZceGQ4LVx4ZjZceGY4LVx4ZmZcdTAxMDAtXHUwMTdmXS9nO3ZhciByZU5vTWF0Y2g9LygkXikvO3ZhciByZVVuZXNjYXBlZFN0cmluZz0KL1snXG5cclx1MjAyOFx1MjAyOVxcXS9nO3ZhciByc0FzdHJhbFJhbmdlPSJcXHVkODAwLVxcdWRmZmYiLHJzQ29tYm9NYXJrc1JhbmdlPSJcXHUwMzAwLVxcdTAzNmYiLHJlQ29tYm9IYWxmTWFya3NSYW5nZT0iXFx1ZmUyMC1cXHVmZTJmIixyc0NvbWJvU3ltYm9sc1JhbmdlPSJcXHUyMGQwLVxcdTIwZmYiLHJzQ29tYm9SYW5nZT1yc0NvbWJvTWFya3NSYW5nZStyZUNvbWJvSGFsZk1hcmtzUmFuZ2UrcnNDb21ib1N5bWJvbHNSYW5nZSxyc0RpbmdiYXRSYW5nZT0iXFx1MjcwMC1cXHUyN2JmIixyc0xvd2VyUmFuZ2U9ImEtelxceGRmLVxceGY2XFx4ZjgtXFx4ZmYiLHJzTWF0aE9wUmFuZ2U9IlxceGFjXFx4YjFcXHhkN1xceGY3Iixyc05vbkNoYXJSYW5nZT0iXFx4MDAtXFx4MmZcXHgzYS1cXHg0MFxceDViLVxceDYwXFx4N2ItXFx4YmYiLHJzUHVuY3R1YXRpb25SYW5nZT0iXFx1MjAwMC1cXHUyMDZmIixyc1NwYWNlUmFuZ2U9IiBcXHRcXHgwYlxcZlxceGEwXFx1ZmVmZlxcblxcclxcdTIwMjhcXHUyMDI5XFx1MTY4MFxcdTE4MGVcXHUyMDAwXFx1MjAwMVxcdTIwMDJcXHUyMDAzXFx1MjAwNFxcdTIwMDVcXHUyMDA2XFx1MjAwN1xcdTIwMDhcXHUyMDA5XFx1MjAwYVxcdTIwMmZcXHUyMDVmXFx1MzAwMCIsCnJzVXBwZXJSYW5nZT0iQS1aXFx4YzAtXFx4ZDZcXHhkOC1cXHhkZSIscnNWYXJSYW5nZT0iXFx1ZmUwZVxcdWZlMGYiLHJzQnJlYWtSYW5nZT1yc01hdGhPcFJhbmdlK3JzTm9uQ2hhclJhbmdlK3JzUHVuY3R1YXRpb25SYW5nZStyc1NwYWNlUmFuZ2U7dmFyIHJzQXBvcz0iWydcdTIwMTldIixyc0FzdHJhbD0iWyIrcnNBc3RyYWxSYW5nZSsiXSIscnNCcmVhaz0iWyIrcnNCcmVha1JhbmdlKyJdIixyc0NvbWJvPSJbIityc0NvbWJvUmFuZ2UrIl0iLHJzRGlnaXRzPSJcXGQrIixyc0RpbmdiYXQ9IlsiK3JzRGluZ2JhdFJhbmdlKyJdIixyc0xvd2VyPSJbIityc0xvd2VyUmFuZ2UrIl0iLHJzTWlzYz0iW14iK3JzQXN0cmFsUmFuZ2UrcnNCcmVha1JhbmdlK3JzRGlnaXRzK3JzRGluZ2JhdFJhbmdlK3JzTG93ZXJSYW5nZStyc1VwcGVyUmFuZ2UrIl0iLHJzRml0ej0iXFx1ZDgzY1tcXHVkZmZiLVxcdWRmZmZdIixyc01vZGlmaWVyPSIoPzoiK3JzQ29tYm8rInwiK3JzRml0eisiKSIscnNOb25Bc3RyYWw9CiJbXiIrcnNBc3RyYWxSYW5nZSsiXSIscnNSZWdpb25hbD0iKD86XFx1ZDgzY1tcXHVkZGU2LVxcdWRkZmZdKXsyfSIscnNTdXJyUGFpcj0iW1xcdWQ4MDAtXFx1ZGJmZl1bXFx1ZGMwMC1cXHVkZmZmXSIscnNVcHBlcj0iWyIrcnNVcHBlclJhbmdlKyJdIixyc1pXSj0iXFx1MjAwZCI7dmFyIHJzTWlzY0xvd2VyPSIoPzoiK3JzTG93ZXIrInwiK3JzTWlzYysiKSIscnNNaXNjVXBwZXI9Iig/OiIrcnNVcHBlcisifCIrcnNNaXNjKyIpIixyc09wdENvbnRyTG93ZXI9Iig/OiIrcnNBcG9zKyIoPzpkfGxsfG18cmV8c3x0fHZlKSk/Iixyc09wdENvbnRyVXBwZXI9Iig/OiIrcnNBcG9zKyIoPzpEfExMfE18UkV8U3xUfFZFKSk/IixyZU9wdE1vZD1yc01vZGlmaWVyKyI/Iixyc09wdFZhcj0iWyIrcnNWYXJSYW5nZSsiXT8iLHJzT3B0Sm9pbj0iKD86Iityc1pXSisiKD86IitbcnNOb25Bc3RyYWwscnNSZWdpb25hbCxyc1N1cnJQYWlyXS5qb2luKCJ8IikrIikiK3JzT3B0VmFyK3JlT3B0TW9kKwoiKSoiLHJzT3JkTG93ZXI9IlxcZCooPzoxc3R8Mm5kfDNyZHwoPyFbMTIzXSlcXGR0aCkoP1x4M2RcXGJ8W0EtWl9dKSIscnNPcmRVcHBlcj0iXFxkKig/OjFTVHwyTkR8M1JEfCg/IVsxMjNdKVxcZFRIKSg/XHgzZFxcYnxbYS16X10pIixyc1NlcT1yc09wdFZhcityZU9wdE1vZCtyc09wdEpvaW4scnNFbW9qaT0iKD86IitbcnNEaW5nYmF0LHJzUmVnaW9uYWwscnNTdXJyUGFpcl0uam9pbigifCIpKyIpIityc1NlcSxyc1N5bWJvbD0iKD86IitbcnNOb25Bc3RyYWwrcnNDb21ibysiPyIscnNDb21ibyxyc1JlZ2lvbmFsLHJzU3VyclBhaXIscnNBc3RyYWxdLmpvaW4oInwiKSsiKSI7dmFyIHJlQXBvcz1SZWdFeHAocnNBcG9zLCJnIik7dmFyIHJlQ29tYm9NYXJrPVJlZ0V4cChyc0NvbWJvLCJnIik7dmFyIHJlVW5pY29kZT1SZWdFeHAocnNGaXR6KyIoP1x4M2QiK3JzRml0eisiKXwiK3JzU3ltYm9sK3JzU2VxLCJnIik7dmFyIHJlVW5pY29kZVdvcmQ9UmVnRXhwKFtyc1VwcGVyKyI/IisKcnNMb3dlcisiKyIrcnNPcHRDb250ckxvd2VyKyIoP1x4M2QiK1tyc0JyZWFrLHJzVXBwZXIsIiQiXS5qb2luKCJ8IikrIikiLHJzTWlzY1VwcGVyKyIrIityc09wdENvbnRyVXBwZXIrIig/XHgzZCIrW3JzQnJlYWsscnNVcHBlcityc01pc2NMb3dlciwiJCJdLmpvaW4oInwiKSsiKSIscnNVcHBlcisiPyIrcnNNaXNjTG93ZXIrIisiK3JzT3B0Q29udHJMb3dlcixyc1VwcGVyKyIrIityc09wdENvbnRyVXBwZXIscnNPcmRVcHBlcixyc09yZExvd2VyLHJzRGlnaXRzLHJzRW1vamldLmpvaW4oInwiKSwiZyIpO3ZhciByZUhhc1VuaWNvZGU9UmVnRXhwKCJbIityc1pXSityc0FzdHJhbFJhbmdlK3JzQ29tYm9SYW5nZStyc1ZhclJhbmdlKyJdIik7dmFyIHJlSGFzVW5pY29kZVdvcmQ9L1thLXpdW0EtWl18W0EtWl17Mix9W2Etel18WzAtOV1bYS16QS1aXXxbYS16QS1aXVswLTldfFteYS16QS1aMC05IF0vO3ZhciBjb250ZXh0UHJvcHM9WyJBcnJheSIsIkJ1ZmZlciIsIkRhdGFWaWV3IiwKIkRhdGUiLCJFcnJvciIsIkZsb2F0MzJBcnJheSIsIkZsb2F0NjRBcnJheSIsIkZ1bmN0aW9uIiwiSW50OEFycmF5IiwiSW50MTZBcnJheSIsIkludDMyQXJyYXkiLCJNYXAiLCJNYXRoIiwiT2JqZWN0IiwiUHJvbWlzZSIsIlJlZ0V4cCIsIlNldCIsIlN0cmluZyIsIlN5bWJvbCIsIlR5cGVFcnJvciIsIlVpbnQ4QXJyYXkiLCJVaW50OENsYW1wZWRBcnJheSIsIlVpbnQxNkFycmF5IiwiVWludDMyQXJyYXkiLCJXZWFrTWFwIiwiXyIsImNsZWFyVGltZW91dCIsImlzRmluaXRlIiwicGFyc2VJbnQiLCJzZXRUaW1lb3V0Il07dmFyIHRlbXBsYXRlQ291bnRlcj0tMTt2YXIgdHlwZWRBcnJheVRhZ3M9e307dHlwZWRBcnJheVRhZ3NbZmxvYXQzMlRhZ109dHlwZWRBcnJheVRhZ3NbZmxvYXQ2NFRhZ109dHlwZWRBcnJheVRhZ3NbaW50OFRhZ109dHlwZWRBcnJheVRhZ3NbaW50MTZUYWddPXR5cGVkQXJyYXlUYWdzW2ludDMyVGFnXT10eXBlZEFycmF5VGFnc1t1aW50OFRhZ109dHlwZWRBcnJheVRhZ3NbdWludDhDbGFtcGVkVGFnXT0KdHlwZWRBcnJheVRhZ3NbdWludDE2VGFnXT10eXBlZEFycmF5VGFnc1t1aW50MzJUYWddPXRydWU7dHlwZWRBcnJheVRhZ3NbYXJnc1RhZ109dHlwZWRBcnJheVRhZ3NbYXJyYXlUYWddPXR5cGVkQXJyYXlUYWdzW2FycmF5QnVmZmVyVGFnXT10eXBlZEFycmF5VGFnc1tib29sVGFnXT10eXBlZEFycmF5VGFnc1tkYXRhVmlld1RhZ109dHlwZWRBcnJheVRhZ3NbZGF0ZVRhZ109dHlwZWRBcnJheVRhZ3NbZXJyb3JUYWddPXR5cGVkQXJyYXlUYWdzW2Z1bmNUYWddPXR5cGVkQXJyYXlUYWdzW21hcFRhZ109dHlwZWRBcnJheVRhZ3NbbnVtYmVyVGFnXT10eXBlZEFycmF5VGFnc1tvYmplY3RUYWddPXR5cGVkQXJyYXlUYWdzW3JlZ2V4cFRhZ109dHlwZWRBcnJheVRhZ3Nbc2V0VGFnXT10eXBlZEFycmF5VGFnc1tzdHJpbmdUYWddPXR5cGVkQXJyYXlUYWdzW3dlYWtNYXBUYWddPWZhbHNlO3ZhciBjbG9uZWFibGVUYWdzPXt9O2Nsb25lYWJsZVRhZ3NbYXJnc1RhZ109Y2xvbmVhYmxlVGFnc1thcnJheVRhZ109CmNsb25lYWJsZVRhZ3NbYXJyYXlCdWZmZXJUYWddPWNsb25lYWJsZVRhZ3NbZGF0YVZpZXdUYWddPWNsb25lYWJsZVRhZ3NbYm9vbFRhZ109Y2xvbmVhYmxlVGFnc1tkYXRlVGFnXT1jbG9uZWFibGVUYWdzW2Zsb2F0MzJUYWddPWNsb25lYWJsZVRhZ3NbZmxvYXQ2NFRhZ109Y2xvbmVhYmxlVGFnc1tpbnQ4VGFnXT1jbG9uZWFibGVUYWdzW2ludDE2VGFnXT1jbG9uZWFibGVUYWdzW2ludDMyVGFnXT1jbG9uZWFibGVUYWdzW21hcFRhZ109Y2xvbmVhYmxlVGFnc1tudW1iZXJUYWddPWNsb25lYWJsZVRhZ3Nbb2JqZWN0VGFnXT1jbG9uZWFibGVUYWdzW3JlZ2V4cFRhZ109Y2xvbmVhYmxlVGFnc1tzZXRUYWddPWNsb25lYWJsZVRhZ3Nbc3RyaW5nVGFnXT1jbG9uZWFibGVUYWdzW3N5bWJvbFRhZ109Y2xvbmVhYmxlVGFnc1t1aW50OFRhZ109Y2xvbmVhYmxlVGFnc1t1aW50OENsYW1wZWRUYWddPWNsb25lYWJsZVRhZ3NbdWludDE2VGFnXT1jbG9uZWFibGVUYWdzW3VpbnQzMlRhZ109dHJ1ZTsKY2xvbmVhYmxlVGFnc1tlcnJvclRhZ109Y2xvbmVhYmxlVGFnc1tmdW5jVGFnXT1jbG9uZWFibGVUYWdzW3dlYWtNYXBUYWddPWZhbHNlO3ZhciBkZWJ1cnJlZExldHRlcnM9eyJcdTAwYzAiOiJBIiwiXHUwMGMxIjoiQSIsIlx1MDBjMiI6IkEiLCJcdTAwYzMiOiJBIiwiXHUwMGM0IjoiQSIsIlx1MDBjNSI6IkEiLCJcdTAwZTAiOiJhIiwiXHUwMGUxIjoiYSIsIlx1MDBlMiI6ImEiLCJcdTAwZTMiOiJhIiwiXHUwMGU0IjoiYSIsIlx1MDBlNSI6ImEiLCJcdTAwYzciOiJDIiwiXHUwMGU3IjoiYyIsIlx1MDBkMCI6IkQiLCJcdTAwZjAiOiJkIiwiXHUwMGM4IjoiRSIsIlx1MDBjOSI6IkUiLCJcdTAwY2EiOiJFIiwiXHUwMGNiIjoiRSIsIlx1MDBlOCI6ImUiLCJcdTAwZTkiOiJlIiwiXHUwMGVhIjoiZSIsIlx1MDBlYiI6ImUiLCJcdTAwY2MiOiJJIiwiXHUwMGNkIjoiSSIsIlx1MDBjZSI6IkkiLCJcdTAwY2YiOiJJIiwiXHUwMGVjIjoiaSIsIlx1MDBlZCI6ImkiLCJcdTAwZWUiOiJpIiwKIlx1MDBlZiI6ImkiLCJcdTAwZDEiOiJOIiwiXHUwMGYxIjoibiIsIlx1MDBkMiI6Ik8iLCJcdTAwZDMiOiJPIiwiXHUwMGQ0IjoiTyIsIlx1MDBkNSI6Ik8iLCJcdTAwZDYiOiJPIiwiXHUwMGQ4IjoiTyIsIlx1MDBmMiI6Im8iLCJcdTAwZjMiOiJvIiwiXHUwMGY0IjoibyIsIlx1MDBmNSI6Im8iLCJcdTAwZjYiOiJvIiwiXHUwMGY4IjoibyIsIlx1MDBkOSI6IlUiLCJcdTAwZGEiOiJVIiwiXHUwMGRiIjoiVSIsIlx1MDBkYyI6IlUiLCJcdTAwZjkiOiJ1IiwiXHUwMGZhIjoidSIsIlx1MDBmYiI6InUiLCJcdTAwZmMiOiJ1IiwiXHUwMGRkIjoiWSIsIlx1MDBmZCI6InkiLCJcdTAwZmYiOiJ5IiwiXHUwMGM2IjoiQWUiLCJcdTAwZTYiOiJhZSIsIlx1MDBkZSI6IlRoIiwiXHUwMGZlIjoidGgiLCJcdTAwZGYiOiJzcyIsIlx1MDEwMCI6IkEiLCJcdTAxMDIiOiJBIiwiXHUwMTA0IjoiQSIsIlx1MDEwMSI6ImEiLCJcdTAxMDMiOiJhIiwiXHUwMTA1IjoiYSIsIlx1MDEwNiI6IkMiLCJcdTAxMDgiOiJDIiwKIlx1MDEwYSI6IkMiLCJcdTAxMGMiOiJDIiwiXHUwMTA3IjoiYyIsIlx1MDEwOSI6ImMiLCJcdTAxMGIiOiJjIiwiXHUwMTBkIjoiYyIsIlx1MDEwZSI6IkQiLCJcdTAxMTAiOiJEIiwiXHUwMTBmIjoiZCIsIlx1MDExMSI6ImQiLCJcdTAxMTIiOiJFIiwiXHUwMTE0IjoiRSIsIlx1MDExNiI6IkUiLCJcdTAxMTgiOiJFIiwiXHUwMTFhIjoiRSIsIlx1MDExMyI6ImUiLCJcdTAxMTUiOiJlIiwiXHUwMTE3IjoiZSIsIlx1MDExOSI6ImUiLCJcdTAxMWIiOiJlIiwiXHUwMTFjIjoiRyIsIlx1MDExZSI6IkciLCJcdTAxMjAiOiJHIiwiXHUwMTIyIjoiRyIsIlx1MDExZCI6ImciLCJcdTAxMWYiOiJnIiwiXHUwMTIxIjoiZyIsIlx1MDEyMyI6ImciLCJcdTAxMjQiOiJIIiwiXHUwMTI2IjoiSCIsIlx1MDEyNSI6ImgiLCJcdTAxMjciOiJoIiwiXHUwMTI4IjoiSSIsIlx1MDEyYSI6IkkiLCJcdTAxMmMiOiJJIiwiXHUwMTJlIjoiSSIsIlx1MDEzMCI6IkkiLCJcdTAxMjkiOiJpIiwiXHUwMTJiIjoiaSIsCiJcdTAxMmQiOiJpIiwiXHUwMTJmIjoiaSIsIlx1MDEzMSI6ImkiLCJcdTAxMzQiOiJKIiwiXHUwMTM1IjoiaiIsIlx1MDEzNiI6IksiLCJcdTAxMzciOiJrIiwiXHUwMTM4IjoiayIsIlx1MDEzOSI6IkwiLCJcdTAxM2IiOiJMIiwiXHUwMTNkIjoiTCIsIlx1MDEzZiI6IkwiLCJcdTAxNDEiOiJMIiwiXHUwMTNhIjoibCIsIlx1MDEzYyI6ImwiLCJcdTAxM2UiOiJsIiwiXHUwMTQwIjoibCIsIlx1MDE0MiI6ImwiLCJcdTAxNDMiOiJOIiwiXHUwMTQ1IjoiTiIsIlx1MDE0NyI6Ik4iLCJcdTAxNGEiOiJOIiwiXHUwMTQ0IjoibiIsIlx1MDE0NiI6Im4iLCJcdTAxNDgiOiJuIiwiXHUwMTRiIjoibiIsIlx1MDE0YyI6Ik8iLCJcdTAxNGUiOiJPIiwiXHUwMTUwIjoiTyIsIlx1MDE0ZCI6Im8iLCJcdTAxNGYiOiJvIiwiXHUwMTUxIjoibyIsIlx1MDE1NCI6IlIiLCJcdTAxNTYiOiJSIiwiXHUwMTU4IjoiUiIsIlx1MDE1NSI6InIiLCJcdTAxNTciOiJyIiwiXHUwMTU5IjoiciIsIlx1MDE1YSI6IlMiLAoiXHUwMTVjIjoiUyIsIlx1MDE1ZSI6IlMiLCJcdTAxNjAiOiJTIiwiXHUwMTViIjoicyIsIlx1MDE1ZCI6InMiLCJcdTAxNWYiOiJzIiwiXHUwMTYxIjoicyIsIlx1MDE2MiI6IlQiLCJcdTAxNjQiOiJUIiwiXHUwMTY2IjoiVCIsIlx1MDE2MyI6InQiLCJcdTAxNjUiOiJ0IiwiXHUwMTY3IjoidCIsIlx1MDE2OCI6IlUiLCJcdTAxNmEiOiJVIiwiXHUwMTZjIjoiVSIsIlx1MDE2ZSI6IlUiLCJcdTAxNzAiOiJVIiwiXHUwMTcyIjoiVSIsIlx1MDE2OSI6InUiLCJcdTAxNmIiOiJ1IiwiXHUwMTZkIjoidSIsIlx1MDE2ZiI6InUiLCJcdTAxNzEiOiJ1IiwiXHUwMTczIjoidSIsIlx1MDE3NCI6IlciLCJcdTAxNzUiOiJ3IiwiXHUwMTc2IjoiWSIsIlx1MDE3NyI6InkiLCJcdTAxNzgiOiJZIiwiXHUwMTc5IjoiWiIsIlx1MDE3YiI6IloiLCJcdTAxN2QiOiJaIiwiXHUwMTdhIjoieiIsIlx1MDE3YyI6InoiLCJcdTAxN2UiOiJ6IiwiXHUwMTMyIjoiSUoiLCJcdTAxMzMiOiJpaiIsIlx1MDE1MiI6Ik9lIiwKIlx1MDE1MyI6Im9lIiwiXHUwMTQ5IjoiJ24iLCJcdTAxN2YiOiJzIn07dmFyIGh0bWxFc2NhcGVzPXsiXHgyNiI6Ilx4MjZhbXA7IiwiXHgzYyI6Ilx4MjZsdDsiLCJceDNlIjoiXHgyNmd0OyIsJyInOiJceDI2cXVvdDsiLCInIjoiXHgyNiMzOTsifTt2YXIgaHRtbFVuZXNjYXBlcz17Ilx4MjZhbXA7IjoiXHgyNiIsIlx4MjZsdDsiOiJceDNjIiwiXHgyNmd0OyI6Ilx4M2UiLCJceDI2cXVvdDsiOiciJywiXHgyNiMzOTsiOiInIn07dmFyIHN0cmluZ0VzY2FwZXM9eyJcXCI6IlxcIiwiJyI6IiciLCJcbiI6Im4iLCJcciI6InIiLCJcdTIwMjgiOiJ1MjAyOCIsIlx1MjAyOSI6InUyMDI5In07dmFyIGZyZWVQYXJzZUZsb2F0PXBhcnNlRmxvYXQsZnJlZVBhcnNlSW50PXBhcnNlSW50O3ZhciBmcmVlR2xvYmFsPXR5cGVvZiBnbG9iYWw9PSJvYmplY3QiJiZnbG9iYWwmJmdsb2JhbC5PYmplY3Q9PT1PYmplY3QmJmdsb2JhbDt2YXIgZnJlZVNlbGY9dHlwZW9mIHNlbGY9PSJvYmplY3QiJiYKc2VsZiYmc2VsZi5PYmplY3Q9PT1PYmplY3QmJnNlbGY7dmFyIHJvb3Q9ZnJlZUdsb2JhbHx8ZnJlZVNlbGZ8fEZ1bmN0aW9uKCJyZXR1cm4gdGhpcyIpKCk7dmFyIGZyZWVFeHBvcnRzPXR5cGVvZiBleHBvcnRzPT0ib2JqZWN0IiYmZXhwb3J0cyYmIWV4cG9ydHMubm9kZVR5cGUmJmV4cG9ydHM7dmFyIGZyZWVNb2R1bGU9ZnJlZUV4cG9ydHMmJnR5cGVvZiBtb2R1bGU9PSJvYmplY3QiJiZtb2R1bGUmJiFtb2R1bGUubm9kZVR5cGUmJm1vZHVsZTt2YXIgbW9kdWxlRXhwb3J0cz1mcmVlTW9kdWxlJiZmcmVlTW9kdWxlLmV4cG9ydHM9PT1mcmVlRXhwb3J0czt2YXIgZnJlZVByb2Nlc3M9bW9kdWxlRXhwb3J0cyYmZnJlZUdsb2JhbC5wcm9jZXNzO3ZhciBub2RlVXRpbD1mdW5jdGlvbigpe3RyeXtyZXR1cm4gZnJlZVByb2Nlc3MmJmZyZWVQcm9jZXNzLmJpbmRpbmcmJmZyZWVQcm9jZXNzLmJpbmRpbmcoInV0aWwiKX1jYXRjaChlKXt9fSgpO3ZhciBub2RlSXNBcnJheUJ1ZmZlcj1ub2RlVXRpbCYmCm5vZGVVdGlsLmlzQXJyYXlCdWZmZXIsbm9kZUlzRGF0ZT1ub2RlVXRpbCYmbm9kZVV0aWwuaXNEYXRlLG5vZGVJc01hcD1ub2RlVXRpbCYmbm9kZVV0aWwuaXNNYXAsbm9kZUlzUmVnRXhwPW5vZGVVdGlsJiZub2RlVXRpbC5pc1JlZ0V4cCxub2RlSXNTZXQ9bm9kZVV0aWwmJm5vZGVVdGlsLmlzU2V0LG5vZGVJc1R5cGVkQXJyYXk9bm9kZVV0aWwmJm5vZGVVdGlsLmlzVHlwZWRBcnJheTtmdW5jdGlvbiBhcHBseShmdW5jLHRoaXNBcmcsYXJncyl7c3dpdGNoKGFyZ3MubGVuZ3RoKXtjYXNlIDA6cmV0dXJuIGZ1bmMuY2FsbCh0aGlzQXJnKTtjYXNlIDE6cmV0dXJuIGZ1bmMuY2FsbCh0aGlzQXJnLGFyZ3NbMF0pO2Nhc2UgMjpyZXR1cm4gZnVuYy5jYWxsKHRoaXNBcmcsYXJnc1swXSxhcmdzWzFdKTtjYXNlIDM6cmV0dXJuIGZ1bmMuY2FsbCh0aGlzQXJnLGFyZ3NbMF0sYXJnc1sxXSxhcmdzWzJdKX1yZXR1cm4gZnVuYy5hcHBseSh0aGlzQXJnLGFyZ3MpfWZ1bmN0aW9uIGFycmF5QWdncmVnYXRvcihhcnJheSwKc2V0dGVyLGl0ZXJhdGVlLGFjY3VtdWxhdG9yKXt2YXIgaW5kZXg9LTEsbGVuZ3RoPWFycmF5PT1udWxsPzA6YXJyYXkubGVuZ3RoO3doaWxlKCsraW5kZXg8bGVuZ3RoKXt2YXIgdmFsdWU9YXJyYXlbaW5kZXhdO3NldHRlcihhY2N1bXVsYXRvcix2YWx1ZSxpdGVyYXRlZSh2YWx1ZSksYXJyYXkpfXJldHVybiBhY2N1bXVsYXRvcn1mdW5jdGlvbiBhcnJheUVhY2goYXJyYXksaXRlcmF0ZWUpe3ZhciBpbmRleD0tMSxsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7d2hpbGUoKytpbmRleDxsZW5ndGgpaWYoaXRlcmF0ZWUoYXJyYXlbaW5kZXhdLGluZGV4LGFycmF5KT09PWZhbHNlKWJyZWFrO3JldHVybiBhcnJheX1mdW5jdGlvbiBhcnJheUVhY2hSaWdodChhcnJheSxpdGVyYXRlZSl7dmFyIGxlbmd0aD1hcnJheT09bnVsbD8wOmFycmF5Lmxlbmd0aDt3aGlsZShsZW5ndGgtLSlpZihpdGVyYXRlZShhcnJheVtsZW5ndGhdLGxlbmd0aCxhcnJheSk9PT1mYWxzZSlicmVhazsKcmV0dXJuIGFycmF5fWZ1bmN0aW9uIGFycmF5RXZlcnkoYXJyYXkscHJlZGljYXRlKXt2YXIgaW5kZXg9LTEsbGVuZ3RoPWFycmF5PT1udWxsPzA6YXJyYXkubGVuZ3RoO3doaWxlKCsraW5kZXg8bGVuZ3RoKWlmKCFwcmVkaWNhdGUoYXJyYXlbaW5kZXhdLGluZGV4LGFycmF5KSlyZXR1cm4gZmFsc2U7cmV0dXJuIHRydWV9ZnVuY3Rpb24gYXJyYXlGaWx0ZXIoYXJyYXkscHJlZGljYXRlKXt2YXIgaW5kZXg9LTEsbGVuZ3RoPWFycmF5PT1udWxsPzA6YXJyYXkubGVuZ3RoLHJlc0luZGV4PTAscmVzdWx0PVtdO3doaWxlKCsraW5kZXg8bGVuZ3RoKXt2YXIgdmFsdWU9YXJyYXlbaW5kZXhdO2lmKHByZWRpY2F0ZSh2YWx1ZSxpbmRleCxhcnJheSkpcmVzdWx0W3Jlc0luZGV4KytdPXZhbHVlfXJldHVybiByZXN1bHR9ZnVuY3Rpb24gYXJyYXlJbmNsdWRlcyhhcnJheSx2YWx1ZSl7dmFyIGxlbmd0aD1hcnJheT09bnVsbD8wOmFycmF5Lmxlbmd0aDtyZXR1cm4hIWxlbmd0aCYmYmFzZUluZGV4T2YoYXJyYXksCnZhbHVlLDApPi0xfWZ1bmN0aW9uIGFycmF5SW5jbHVkZXNXaXRoKGFycmF5LHZhbHVlLGNvbXBhcmF0b3Ipe3ZhciBpbmRleD0tMSxsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7d2hpbGUoKytpbmRleDxsZW5ndGgpaWYoY29tcGFyYXRvcih2YWx1ZSxhcnJheVtpbmRleF0pKXJldHVybiB0cnVlO3JldHVybiBmYWxzZX1mdW5jdGlvbiBhcnJheU1hcChhcnJheSxpdGVyYXRlZSl7dmFyIGluZGV4PS0xLGxlbmd0aD1hcnJheT09bnVsbD8wOmFycmF5Lmxlbmd0aCxyZXN1bHQ9QXJyYXkobGVuZ3RoKTt3aGlsZSgrK2luZGV4PGxlbmd0aClyZXN1bHRbaW5kZXhdPWl0ZXJhdGVlKGFycmF5W2luZGV4XSxpbmRleCxhcnJheSk7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBhcnJheVB1c2goYXJyYXksdmFsdWVzKXt2YXIgaW5kZXg9LTEsbGVuZ3RoPXZhbHVlcy5sZW5ndGgsb2Zmc2V0PWFycmF5Lmxlbmd0aDt3aGlsZSgrK2luZGV4PGxlbmd0aClhcnJheVtvZmZzZXQraW5kZXhdPQp2YWx1ZXNbaW5kZXhdO3JldHVybiBhcnJheX1mdW5jdGlvbiBhcnJheVJlZHVjZShhcnJheSxpdGVyYXRlZSxhY2N1bXVsYXRvcixpbml0QWNjdW0pe3ZhciBpbmRleD0tMSxsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7aWYoaW5pdEFjY3VtJiZsZW5ndGgpYWNjdW11bGF0b3I9YXJyYXlbKytpbmRleF07d2hpbGUoKytpbmRleDxsZW5ndGgpYWNjdW11bGF0b3I9aXRlcmF0ZWUoYWNjdW11bGF0b3IsYXJyYXlbaW5kZXhdLGluZGV4LGFycmF5KTtyZXR1cm4gYWNjdW11bGF0b3J9ZnVuY3Rpb24gYXJyYXlSZWR1Y2VSaWdodChhcnJheSxpdGVyYXRlZSxhY2N1bXVsYXRvcixpbml0QWNjdW0pe3ZhciBsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7aWYoaW5pdEFjY3VtJiZsZW5ndGgpYWNjdW11bGF0b3I9YXJyYXlbLS1sZW5ndGhdO3doaWxlKGxlbmd0aC0tKWFjY3VtdWxhdG9yPWl0ZXJhdGVlKGFjY3VtdWxhdG9yLGFycmF5W2xlbmd0aF0sbGVuZ3RoLGFycmF5KTsKcmV0dXJuIGFjY3VtdWxhdG9yfWZ1bmN0aW9uIGFycmF5U29tZShhcnJheSxwcmVkaWNhdGUpe3ZhciBpbmRleD0tMSxsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7d2hpbGUoKytpbmRleDxsZW5ndGgpaWYocHJlZGljYXRlKGFycmF5W2luZGV4XSxpbmRleCxhcnJheSkpcmV0dXJuIHRydWU7cmV0dXJuIGZhbHNlfXZhciBhc2NpaVNpemU9YmFzZVByb3BlcnR5KCJsZW5ndGgiKTtmdW5jdGlvbiBhc2NpaVRvQXJyYXkoc3RyaW5nKXtyZXR1cm4gc3RyaW5nLnNwbGl0KCIiKX1mdW5jdGlvbiBhc2NpaVdvcmRzKHN0cmluZyl7cmV0dXJuIHN0cmluZy5tYXRjaChyZUFzY2lpV29yZCl8fFtdfWZ1bmN0aW9uIGJhc2VGaW5kS2V5KGNvbGxlY3Rpb24scHJlZGljYXRlLGVhY2hGdW5jKXt2YXIgcmVzdWx0O2VhY2hGdW5jKGNvbGxlY3Rpb24sZnVuY3Rpb24odmFsdWUsa2V5LGNvbGxlY3Rpb24pe2lmKHByZWRpY2F0ZSh2YWx1ZSxrZXksY29sbGVjdGlvbikpe3Jlc3VsdD1rZXk7CnJldHVybiBmYWxzZX19KTtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGJhc2VGaW5kSW5kZXgoYXJyYXkscHJlZGljYXRlLGZyb21JbmRleCxmcm9tUmlnaHQpe3ZhciBsZW5ndGg9YXJyYXkubGVuZ3RoLGluZGV4PWZyb21JbmRleCsoZnJvbVJpZ2h0PzE6LTEpO3doaWxlKGZyb21SaWdodD9pbmRleC0tOisraW5kZXg8bGVuZ3RoKWlmKHByZWRpY2F0ZShhcnJheVtpbmRleF0saW5kZXgsYXJyYXkpKXJldHVybiBpbmRleDtyZXR1cm4tMX1mdW5jdGlvbiBiYXNlSW5kZXhPZihhcnJheSx2YWx1ZSxmcm9tSW5kZXgpe3JldHVybiB2YWx1ZT09PXZhbHVlP3N0cmljdEluZGV4T2YoYXJyYXksdmFsdWUsZnJvbUluZGV4KTpiYXNlRmluZEluZGV4KGFycmF5LGJhc2VJc05hTixmcm9tSW5kZXgpfWZ1bmN0aW9uIGJhc2VJbmRleE9mV2l0aChhcnJheSx2YWx1ZSxmcm9tSW5kZXgsY29tcGFyYXRvcil7dmFyIGluZGV4PWZyb21JbmRleC0xLGxlbmd0aD1hcnJheS5sZW5ndGg7d2hpbGUoKytpbmRleDwKbGVuZ3RoKWlmKGNvbXBhcmF0b3IoYXJyYXlbaW5kZXhdLHZhbHVlKSlyZXR1cm4gaW5kZXg7cmV0dXJuLTF9ZnVuY3Rpb24gYmFzZUlzTmFOKHZhbHVlKXtyZXR1cm4gdmFsdWUhPT12YWx1ZX1mdW5jdGlvbiBiYXNlTWVhbihhcnJheSxpdGVyYXRlZSl7dmFyIGxlbmd0aD1hcnJheT09bnVsbD8wOmFycmF5Lmxlbmd0aDtyZXR1cm4gbGVuZ3RoP2Jhc2VTdW0oYXJyYXksaXRlcmF0ZWUpL2xlbmd0aDpOQU59ZnVuY3Rpb24gYmFzZVByb3BlcnR5KGtleSl7cmV0dXJuIGZ1bmN0aW9uKG9iamVjdCl7cmV0dXJuIG9iamVjdD09bnVsbD91bmRlZmluZWQ6b2JqZWN0W2tleV19fWZ1bmN0aW9uIGJhc2VQcm9wZXJ0eU9mKG9iamVjdCl7cmV0dXJuIGZ1bmN0aW9uKGtleSl7cmV0dXJuIG9iamVjdD09bnVsbD91bmRlZmluZWQ6b2JqZWN0W2tleV19fWZ1bmN0aW9uIGJhc2VSZWR1Y2UoY29sbGVjdGlvbixpdGVyYXRlZSxhY2N1bXVsYXRvcixpbml0QWNjdW0sZWFjaEZ1bmMpe2VhY2hGdW5jKGNvbGxlY3Rpb24sCmZ1bmN0aW9uKHZhbHVlLGluZGV4LGNvbGxlY3Rpb24pe2FjY3VtdWxhdG9yPWluaXRBY2N1bT8oaW5pdEFjY3VtPWZhbHNlLHZhbHVlKTppdGVyYXRlZShhY2N1bXVsYXRvcix2YWx1ZSxpbmRleCxjb2xsZWN0aW9uKX0pO3JldHVybiBhY2N1bXVsYXRvcn1mdW5jdGlvbiBiYXNlU29ydEJ5KGFycmF5LGNvbXBhcmVyKXt2YXIgbGVuZ3RoPWFycmF5Lmxlbmd0aDthcnJheS5zb3J0KGNvbXBhcmVyKTt3aGlsZShsZW5ndGgtLSlhcnJheVtsZW5ndGhdPWFycmF5W2xlbmd0aF0udmFsdWU7cmV0dXJuIGFycmF5fWZ1bmN0aW9uIGJhc2VTdW0oYXJyYXksaXRlcmF0ZWUpe3ZhciByZXN1bHQsaW5kZXg9LTEsbGVuZ3RoPWFycmF5Lmxlbmd0aDt3aGlsZSgrK2luZGV4PGxlbmd0aCl7dmFyIGN1cnJlbnQ9aXRlcmF0ZWUoYXJyYXlbaW5kZXhdKTtpZihjdXJyZW50IT09dW5kZWZpbmVkKXJlc3VsdD1yZXN1bHQ9PT11bmRlZmluZWQ/Y3VycmVudDpyZXN1bHQrY3VycmVudH1yZXR1cm4gcmVzdWx0fQpmdW5jdGlvbiBiYXNlVGltZXMobixpdGVyYXRlZSl7dmFyIGluZGV4PS0xLHJlc3VsdD1BcnJheShuKTt3aGlsZSgrK2luZGV4PG4pcmVzdWx0W2luZGV4XT1pdGVyYXRlZShpbmRleCk7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBiYXNlVG9QYWlycyhvYmplY3QscHJvcHMpe3JldHVybiBhcnJheU1hcChwcm9wcyxmdW5jdGlvbihrZXkpe3JldHVybltrZXksb2JqZWN0W2tleV1dfSl9ZnVuY3Rpb24gYmFzZVVuYXJ5KGZ1bmMpe3JldHVybiBmdW5jdGlvbih2YWx1ZSl7cmV0dXJuIGZ1bmModmFsdWUpfX1mdW5jdGlvbiBiYXNlVmFsdWVzKG9iamVjdCxwcm9wcyl7cmV0dXJuIGFycmF5TWFwKHByb3BzLGZ1bmN0aW9uKGtleSl7cmV0dXJuIG9iamVjdFtrZXldfSl9ZnVuY3Rpb24gY2FjaGVIYXMoY2FjaGUsa2V5KXtyZXR1cm4gY2FjaGUuaGFzKGtleSl9ZnVuY3Rpb24gY2hhcnNTdGFydEluZGV4KHN0clN5bWJvbHMsY2hyU3ltYm9scyl7dmFyIGluZGV4PS0xLGxlbmd0aD1zdHJTeW1ib2xzLmxlbmd0aDsKd2hpbGUoKytpbmRleDxsZW5ndGgmJmJhc2VJbmRleE9mKGNoclN5bWJvbHMsc3RyU3ltYm9sc1tpbmRleF0sMCk+LTEpO3JldHVybiBpbmRleH1mdW5jdGlvbiBjaGFyc0VuZEluZGV4KHN0clN5bWJvbHMsY2hyU3ltYm9scyl7dmFyIGluZGV4PXN0clN5bWJvbHMubGVuZ3RoO3doaWxlKGluZGV4LS0mJmJhc2VJbmRleE9mKGNoclN5bWJvbHMsc3RyU3ltYm9sc1tpbmRleF0sMCk+LTEpO3JldHVybiBpbmRleH1mdW5jdGlvbiBjb3VudEhvbGRlcnMoYXJyYXkscGxhY2Vob2xkZXIpe3ZhciBsZW5ndGg9YXJyYXkubGVuZ3RoLHJlc3VsdD0wO3doaWxlKGxlbmd0aC0tKWlmKGFycmF5W2xlbmd0aF09PT1wbGFjZWhvbGRlcikrK3Jlc3VsdDtyZXR1cm4gcmVzdWx0fXZhciBkZWJ1cnJMZXR0ZXI9YmFzZVByb3BlcnR5T2YoZGVidXJyZWRMZXR0ZXJzKTt2YXIgZXNjYXBlSHRtbENoYXI9YmFzZVByb3BlcnR5T2YoaHRtbEVzY2FwZXMpO2Z1bmN0aW9uIGVzY2FwZVN0cmluZ0NoYXIoY2hyKXtyZXR1cm4iXFwiKwpzdHJpbmdFc2NhcGVzW2Nocl19ZnVuY3Rpb24gZ2V0VmFsdWUob2JqZWN0LGtleSl7cmV0dXJuIG9iamVjdD09bnVsbD91bmRlZmluZWQ6b2JqZWN0W2tleV19ZnVuY3Rpb24gaGFzVW5pY29kZShzdHJpbmcpe3JldHVybiByZUhhc1VuaWNvZGUudGVzdChzdHJpbmcpfWZ1bmN0aW9uIGhhc1VuaWNvZGVXb3JkKHN0cmluZyl7cmV0dXJuIHJlSGFzVW5pY29kZVdvcmQudGVzdChzdHJpbmcpfWZ1bmN0aW9uIGl0ZXJhdG9yVG9BcnJheShpdGVyYXRvcil7dmFyIGRhdGEscmVzdWx0PVtdO3doaWxlKCEoZGF0YT1pdGVyYXRvci5uZXh0KCkpLmRvbmUpcmVzdWx0LnB1c2goZGF0YS52YWx1ZSk7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBtYXBUb0FycmF5KG1hcCl7dmFyIGluZGV4PS0xLHJlc3VsdD1BcnJheShtYXAuc2l6ZSk7bWFwLmZvckVhY2goZnVuY3Rpb24odmFsdWUsa2V5KXtyZXN1bHRbKytpbmRleF09W2tleSx2YWx1ZV19KTtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIG92ZXJBcmcoZnVuYywKdHJhbnNmb3JtKXtyZXR1cm4gZnVuY3Rpb24oYXJnKXtyZXR1cm4gZnVuYyh0cmFuc2Zvcm0oYXJnKSl9fWZ1bmN0aW9uIHJlcGxhY2VIb2xkZXJzKGFycmF5LHBsYWNlaG9sZGVyKXt2YXIgaW5kZXg9LTEsbGVuZ3RoPWFycmF5Lmxlbmd0aCxyZXNJbmRleD0wLHJlc3VsdD1bXTt3aGlsZSgrK2luZGV4PGxlbmd0aCl7dmFyIHZhbHVlPWFycmF5W2luZGV4XTtpZih2YWx1ZT09PXBsYWNlaG9sZGVyfHx2YWx1ZT09PVBMQUNFSE9MREVSKXthcnJheVtpbmRleF09UExBQ0VIT0xERVI7cmVzdWx0W3Jlc0luZGV4KytdPWluZGV4fX1yZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIHNhZmVHZXQob2JqZWN0LGtleSl7cmV0dXJuIGtleT09Il9fcHJvdG9fXyI/dW5kZWZpbmVkOm9iamVjdFtrZXldfWZ1bmN0aW9uIHNldFRvQXJyYXkoc2V0KXt2YXIgaW5kZXg9LTEscmVzdWx0PUFycmF5KHNldC5zaXplKTtzZXQuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSl7cmVzdWx0WysraW5kZXhdPXZhbHVlfSk7CnJldHVybiByZXN1bHR9ZnVuY3Rpb24gc2V0VG9QYWlycyhzZXQpe3ZhciBpbmRleD0tMSxyZXN1bHQ9QXJyYXkoc2V0LnNpemUpO3NldC5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlKXtyZXN1bHRbKytpbmRleF09W3ZhbHVlLHZhbHVlXX0pO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gc3RyaWN0SW5kZXhPZihhcnJheSx2YWx1ZSxmcm9tSW5kZXgpe3ZhciBpbmRleD1mcm9tSW5kZXgtMSxsZW5ndGg9YXJyYXkubGVuZ3RoO3doaWxlKCsraW5kZXg8bGVuZ3RoKWlmKGFycmF5W2luZGV4XT09PXZhbHVlKXJldHVybiBpbmRleDtyZXR1cm4tMX1mdW5jdGlvbiBzdHJpY3RMYXN0SW5kZXhPZihhcnJheSx2YWx1ZSxmcm9tSW5kZXgpe3ZhciBpbmRleD1mcm9tSW5kZXgrMTt3aGlsZShpbmRleC0tKWlmKGFycmF5W2luZGV4XT09PXZhbHVlKXJldHVybiBpbmRleDtyZXR1cm4gaW5kZXh9ZnVuY3Rpb24gc3RyaW5nU2l6ZShzdHJpbmcpe3JldHVybiBoYXNVbmljb2RlKHN0cmluZyk/dW5pY29kZVNpemUoc3RyaW5nKToKYXNjaWlTaXplKHN0cmluZyl9ZnVuY3Rpb24gc3RyaW5nVG9BcnJheShzdHJpbmcpe3JldHVybiBoYXNVbmljb2RlKHN0cmluZyk/dW5pY29kZVRvQXJyYXkoc3RyaW5nKTphc2NpaVRvQXJyYXkoc3RyaW5nKX12YXIgdW5lc2NhcGVIdG1sQ2hhcj1iYXNlUHJvcGVydHlPZihodG1sVW5lc2NhcGVzKTtmdW5jdGlvbiB1bmljb2RlU2l6ZShzdHJpbmcpe3ZhciByZXN1bHQ9cmVVbmljb2RlLmxhc3RJbmRleD0wO3doaWxlKHJlVW5pY29kZS50ZXN0KHN0cmluZykpKytyZXN1bHQ7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiB1bmljb2RlVG9BcnJheShzdHJpbmcpe3JldHVybiBzdHJpbmcubWF0Y2gocmVVbmljb2RlKXx8W119ZnVuY3Rpb24gdW5pY29kZVdvcmRzKHN0cmluZyl7cmV0dXJuIHN0cmluZy5tYXRjaChyZVVuaWNvZGVXb3JkKXx8W119dmFyIHJ1bkluQ29udGV4dD1mdW5jdGlvbiBydW5JbkNvbnRleHQoY29udGV4dCl7Y29udGV4dD1jb250ZXh0PT1udWxsP3Jvb3Q6Xy5kZWZhdWx0cyhyb290Lk9iamVjdCgpLApjb250ZXh0LF8ucGljayhyb290LGNvbnRleHRQcm9wcykpO3ZhciBBcnJheT1jb250ZXh0LkFycmF5LERhdGU9Y29udGV4dC5EYXRlLEVycm9yPWNvbnRleHQuRXJyb3IsRnVuY3Rpb249Y29udGV4dC5GdW5jdGlvbixNYXRoPWNvbnRleHQuTWF0aCxPYmplY3Q9Y29udGV4dC5PYmplY3QsUmVnRXhwPWNvbnRleHQuUmVnRXhwLFN0cmluZz1jb250ZXh0LlN0cmluZyxUeXBlRXJyb3I9Y29udGV4dC5UeXBlRXJyb3I7dmFyIGFycmF5UHJvdG89QXJyYXkucHJvdG90eXBlLGZ1bmNQcm90bz1GdW5jdGlvbi5wcm90b3R5cGUsb2JqZWN0UHJvdG89T2JqZWN0LnByb3RvdHlwZTt2YXIgY29yZUpzRGF0YT1jb250ZXh0WyJfX2NvcmUtanNfc2hhcmVkX18iXTt2YXIgZnVuY1RvU3RyaW5nPWZ1bmNQcm90by50b1N0cmluZzt2YXIgaGFzT3duUHJvcGVydHk9b2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7dmFyIGlkQ291bnRlcj0wO3ZhciBtYXNrU3JjS2V5PWZ1bmN0aW9uKCl7dmFyIHVpZD0KL1teLl0rJC8uZXhlYyhjb3JlSnNEYXRhJiZjb3JlSnNEYXRhLmtleXMmJmNvcmVKc0RhdGEua2V5cy5JRV9QUk9UT3x8IiIpO3JldHVybiB1aWQ/IlN5bWJvbChzcmMpXzEuIit1aWQ6IiJ9KCk7dmFyIG5hdGl2ZU9iamVjdFRvU3RyaW5nPW9iamVjdFByb3RvLnRvU3RyaW5nO3ZhciBvYmplY3RDdG9yU3RyaW5nPWZ1bmNUb1N0cmluZy5jYWxsKE9iamVjdCk7dmFyIG9sZERhc2g9cm9vdC5fO3ZhciByZUlzTmF0aXZlPVJlZ0V4cCgiXiIrZnVuY1RvU3RyaW5nLmNhbGwoaGFzT3duUHJvcGVydHkpLnJlcGxhY2UocmVSZWdFeHBDaGFyLCJcXCRceDI2IikucmVwbGFjZSgvaGFzT3duUHJvcGVydHl8KGZ1bmN0aW9uKS4qPyg/PVxcXCgpfCBmb3IgLis/KD89XFxcXSkvZywiJDEuKj8iKSsiJCIpO3ZhciBCdWZmZXI9bW9kdWxlRXhwb3J0cz9jb250ZXh0LkJ1ZmZlcjp1bmRlZmluZWQsU3ltYm9sPWNvbnRleHQuU3ltYm9sLFVpbnQ4QXJyYXk9Y29udGV4dC5VaW50OEFycmF5LGFsbG9jVW5zYWZlPQpCdWZmZXI/QnVmZmVyLmFsbG9jVW5zYWZlOnVuZGVmaW5lZCxnZXRQcm90b3R5cGU9b3ZlckFyZyhPYmplY3QuZ2V0UHJvdG90eXBlT2YsT2JqZWN0KSxvYmplY3RDcmVhdGU9T2JqZWN0LmNyZWF0ZSxwcm9wZXJ0eUlzRW51bWVyYWJsZT1vYmplY3RQcm90by5wcm9wZXJ0eUlzRW51bWVyYWJsZSxzcGxpY2U9YXJyYXlQcm90by5zcGxpY2Usc3ByZWFkYWJsZVN5bWJvbD1TeW1ib2w/U3ltYm9sLmlzQ29uY2F0U3ByZWFkYWJsZTp1bmRlZmluZWQsc3ltSXRlcmF0b3I9U3ltYm9sP1N5bWJvbC5pdGVyYXRvcjp1bmRlZmluZWQsc3ltVG9TdHJpbmdUYWc9U3ltYm9sP1N5bWJvbC50b1N0cmluZ1RhZzp1bmRlZmluZWQ7dmFyIGRlZmluZVByb3BlcnR5PWZ1bmN0aW9uKCl7dHJ5e3ZhciBmdW5jPWdldE5hdGl2ZShPYmplY3QsImRlZmluZVByb3BlcnR5Iik7ZnVuYyh7fSwiIix7fSk7cmV0dXJuIGZ1bmN9Y2F0Y2goZSl7fX0oKTt2YXIgY3R4Q2xlYXJUaW1lb3V0PWNvbnRleHQuY2xlYXJUaW1lb3V0IT09CnJvb3QuY2xlYXJUaW1lb3V0JiZjb250ZXh0LmNsZWFyVGltZW91dCxjdHhOb3c9RGF0ZSYmRGF0ZS5ub3chPT1yb290LkRhdGUubm93JiZEYXRlLm5vdyxjdHhTZXRUaW1lb3V0PWNvbnRleHQuc2V0VGltZW91dCE9PXJvb3Quc2V0VGltZW91dCYmY29udGV4dC5zZXRUaW1lb3V0O3ZhciBuYXRpdmVDZWlsPU1hdGguY2VpbCxuYXRpdmVGbG9vcj1NYXRoLmZsb29yLG5hdGl2ZUdldFN5bWJvbHM9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyxuYXRpdmVJc0J1ZmZlcj1CdWZmZXI/QnVmZmVyLmlzQnVmZmVyOnVuZGVmaW5lZCxuYXRpdmVJc0Zpbml0ZT1jb250ZXh0LmlzRmluaXRlLG5hdGl2ZUpvaW49YXJyYXlQcm90by5qb2luLG5hdGl2ZUtleXM9b3ZlckFyZyhPYmplY3Qua2V5cyxPYmplY3QpLG5hdGl2ZU1heD1NYXRoLm1heCxuYXRpdmVNaW49TWF0aC5taW4sbmF0aXZlTm93PURhdGUubm93LG5hdGl2ZVBhcnNlSW50PWNvbnRleHQucGFyc2VJbnQsbmF0aXZlUmFuZG9tPQpNYXRoLnJhbmRvbSxuYXRpdmVSZXZlcnNlPWFycmF5UHJvdG8ucmV2ZXJzZTt2YXIgRGF0YVZpZXc9Z2V0TmF0aXZlKGNvbnRleHQsIkRhdGFWaWV3IiksTWFwPWdldE5hdGl2ZShjb250ZXh0LCJNYXAiKSxQcm9taXNlPWdldE5hdGl2ZShjb250ZXh0LCJQcm9taXNlIiksU2V0PWdldE5hdGl2ZShjb250ZXh0LCJTZXQiKSxXZWFrTWFwPWdldE5hdGl2ZShjb250ZXh0LCJXZWFrTWFwIiksbmF0aXZlQ3JlYXRlPWdldE5hdGl2ZShPYmplY3QsImNyZWF0ZSIpO3ZhciBtZXRhTWFwPVdlYWtNYXAmJm5ldyBXZWFrTWFwO3ZhciByZWFsTmFtZXM9e307dmFyIGRhdGFWaWV3Q3RvclN0cmluZz10b1NvdXJjZShEYXRhVmlldyksbWFwQ3RvclN0cmluZz10b1NvdXJjZShNYXApLHByb21pc2VDdG9yU3RyaW5nPXRvU291cmNlKFByb21pc2UpLHNldEN0b3JTdHJpbmc9dG9Tb3VyY2UoU2V0KSx3ZWFrTWFwQ3RvclN0cmluZz10b1NvdXJjZShXZWFrTWFwKTt2YXIgc3ltYm9sUHJvdG89U3ltYm9sPwpTeW1ib2wucHJvdG90eXBlOnVuZGVmaW5lZCxzeW1ib2xWYWx1ZU9mPXN5bWJvbFByb3RvP3N5bWJvbFByb3RvLnZhbHVlT2Y6dW5kZWZpbmVkLHN5bWJvbFRvU3RyaW5nPXN5bWJvbFByb3RvP3N5bWJvbFByb3RvLnRvU3RyaW5nOnVuZGVmaW5lZDtmdW5jdGlvbiBsb2Rhc2godmFsdWUpe2lmKGlzT2JqZWN0TGlrZSh2YWx1ZSkmJiFpc0FycmF5KHZhbHVlKSYmISh2YWx1ZSBpbnN0YW5jZW9mIExhenlXcmFwcGVyKSl7aWYodmFsdWUgaW5zdGFuY2VvZiBMb2Rhc2hXcmFwcGVyKXJldHVybiB2YWx1ZTtpZihoYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLCJfX3dyYXBwZWRfXyIpKXJldHVybiB3cmFwcGVyQ2xvbmUodmFsdWUpfXJldHVybiBuZXcgTG9kYXNoV3JhcHBlcih2YWx1ZSl9dmFyIGJhc2VDcmVhdGU9ZnVuY3Rpb24oKXtmdW5jdGlvbiBvYmplY3QoKXt9cmV0dXJuIGZ1bmN0aW9uKHByb3RvKXtpZighaXNPYmplY3QocHJvdG8pKXJldHVybnt9O2lmKG9iamVjdENyZWF0ZSlyZXR1cm4gb2JqZWN0Q3JlYXRlKHByb3RvKTsKb2JqZWN0LnByb3RvdHlwZT1wcm90bzt2YXIgcmVzdWx0PW5ldyBvYmplY3Q7b2JqZWN0LnByb3RvdHlwZT11bmRlZmluZWQ7cmV0dXJuIHJlc3VsdH19KCk7ZnVuY3Rpb24gYmFzZUxvZGFzaCgpe31mdW5jdGlvbiBMb2Rhc2hXcmFwcGVyKHZhbHVlLGNoYWluQWxsKXt0aGlzLl9fd3JhcHBlZF9fPXZhbHVlO3RoaXMuX19hY3Rpb25zX189W107dGhpcy5fX2NoYWluX189ISFjaGFpbkFsbDt0aGlzLl9faW5kZXhfXz0wO3RoaXMuX192YWx1ZXNfXz11bmRlZmluZWR9bG9kYXNoLnRlbXBsYXRlU2V0dGluZ3M9eyJlc2NhcGUiOnJlRXNjYXBlLCJldmFsdWF0ZSI6cmVFdmFsdWF0ZSwiaW50ZXJwb2xhdGUiOnJlSW50ZXJwb2xhdGUsInZhcmlhYmxlIjoiIiwiaW1wb3J0cyI6eyJfIjpsb2Rhc2h9fTtsb2Rhc2gucHJvdG90eXBlPWJhc2VMb2Rhc2gucHJvdG90eXBlO2xvZGFzaC5wcm90b3R5cGUuY29uc3RydWN0b3I9bG9kYXNoO0xvZGFzaFdyYXBwZXIucHJvdG90eXBlPWJhc2VDcmVhdGUoYmFzZUxvZGFzaC5wcm90b3R5cGUpOwpMb2Rhc2hXcmFwcGVyLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1Mb2Rhc2hXcmFwcGVyO2Z1bmN0aW9uIExhenlXcmFwcGVyKHZhbHVlKXt0aGlzLl9fd3JhcHBlZF9fPXZhbHVlO3RoaXMuX19hY3Rpb25zX189W107dGhpcy5fX2Rpcl9fPTE7dGhpcy5fX2ZpbHRlcmVkX189ZmFsc2U7dGhpcy5fX2l0ZXJhdGVlc19fPVtdO3RoaXMuX190YWtlQ291bnRfXz1NQVhfQVJSQVlfTEVOR1RIO3RoaXMuX192aWV3c19fPVtdfWZ1bmN0aW9uIGxhenlDbG9uZSgpe3ZhciByZXN1bHQ9bmV3IExhenlXcmFwcGVyKHRoaXMuX193cmFwcGVkX18pO3Jlc3VsdC5fX2FjdGlvbnNfXz1jb3B5QXJyYXkodGhpcy5fX2FjdGlvbnNfXyk7cmVzdWx0Ll9fZGlyX189dGhpcy5fX2Rpcl9fO3Jlc3VsdC5fX2ZpbHRlcmVkX189dGhpcy5fX2ZpbHRlcmVkX187cmVzdWx0Ll9faXRlcmF0ZWVzX189Y29weUFycmF5KHRoaXMuX19pdGVyYXRlZXNfXyk7cmVzdWx0Ll9fdGFrZUNvdW50X189dGhpcy5fX3Rha2VDb3VudF9fOwpyZXN1bHQuX192aWV3c19fPWNvcHlBcnJheSh0aGlzLl9fdmlld3NfXyk7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBsYXp5UmV2ZXJzZSgpe2lmKHRoaXMuX19maWx0ZXJlZF9fKXt2YXIgcmVzdWx0PW5ldyBMYXp5V3JhcHBlcih0aGlzKTtyZXN1bHQuX19kaXJfXz0tMTtyZXN1bHQuX19maWx0ZXJlZF9fPXRydWV9ZWxzZXtyZXN1bHQ9dGhpcy5jbG9uZSgpO3Jlc3VsdC5fX2Rpcl9fKj0tMX1yZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGxhenlWYWx1ZSgpe3ZhciBhcnJheT10aGlzLl9fd3JhcHBlZF9fLnZhbHVlKCksZGlyPXRoaXMuX19kaXJfXyxpc0Fycj1pc0FycmF5KGFycmF5KSxpc1JpZ2h0PWRpcjwwLGFyckxlbmd0aD1pc0Fycj9hcnJheS5sZW5ndGg6MCx2aWV3PWdldFZpZXcoMCxhcnJMZW5ndGgsdGhpcy5fX3ZpZXdzX18pLHN0YXJ0PXZpZXcuc3RhcnQsZW5kPXZpZXcuZW5kLGxlbmd0aD1lbmQtc3RhcnQsaW5kZXg9aXNSaWdodD9lbmQ6c3RhcnQtMSxpdGVyYXRlZXM9dGhpcy5fX2l0ZXJhdGVlc19fLAppdGVyTGVuZ3RoPWl0ZXJhdGVlcy5sZW5ndGgscmVzSW5kZXg9MCx0YWtlQ291bnQ9bmF0aXZlTWluKGxlbmd0aCx0aGlzLl9fdGFrZUNvdW50X18pO2lmKCFpc0Fycnx8IWlzUmlnaHQmJmFyckxlbmd0aD09bGVuZ3RoJiZ0YWtlQ291bnQ9PWxlbmd0aClyZXR1cm4gYmFzZVdyYXBwZXJWYWx1ZShhcnJheSx0aGlzLl9fYWN0aW9uc19fKTt2YXIgcmVzdWx0PVtdO291dGVyOndoaWxlKGxlbmd0aC0tJiZyZXNJbmRleDx0YWtlQ291bnQpe2luZGV4Kz1kaXI7dmFyIGl0ZXJJbmRleD0tMSx2YWx1ZT1hcnJheVtpbmRleF07d2hpbGUoKytpdGVySW5kZXg8aXRlckxlbmd0aCl7dmFyIGRhdGE9aXRlcmF0ZWVzW2l0ZXJJbmRleF0saXRlcmF0ZWU9ZGF0YS5pdGVyYXRlZSx0eXBlPWRhdGEudHlwZSxjb21wdXRlZD1pdGVyYXRlZSh2YWx1ZSk7aWYodHlwZT09TEFaWV9NQVBfRkxBRyl2YWx1ZT1jb21wdXRlZDtlbHNlIGlmKCFjb21wdXRlZClpZih0eXBlPT1MQVpZX0ZJTFRFUl9GTEFHKWNvbnRpbnVlIG91dGVyOwplbHNlIGJyZWFrIG91dGVyfXJlc3VsdFtyZXNJbmRleCsrXT12YWx1ZX1yZXR1cm4gcmVzdWx0fUxhenlXcmFwcGVyLnByb3RvdHlwZT1iYXNlQ3JlYXRlKGJhc2VMb2Rhc2gucHJvdG90eXBlKTtMYXp5V3JhcHBlci5wcm90b3R5cGUuY29uc3RydWN0b3I9TGF6eVdyYXBwZXI7ZnVuY3Rpb24gSGFzaChlbnRyaWVzKXt2YXIgaW5kZXg9LTEsbGVuZ3RoPWVudHJpZXM9PW51bGw/MDplbnRyaWVzLmxlbmd0aDt0aGlzLmNsZWFyKCk7d2hpbGUoKytpbmRleDxsZW5ndGgpe3ZhciBlbnRyeT1lbnRyaWVzW2luZGV4XTt0aGlzLnNldChlbnRyeVswXSxlbnRyeVsxXSl9fWZ1bmN0aW9uIGhhc2hDbGVhcigpe3RoaXMuX19kYXRhX189bmF0aXZlQ3JlYXRlP25hdGl2ZUNyZWF0ZShudWxsKTp7fTt0aGlzLnNpemU9MH1mdW5jdGlvbiBoYXNoRGVsZXRlKGtleSl7dmFyIHJlc3VsdD10aGlzLmhhcyhrZXkpJiZkZWxldGUgdGhpcy5fX2RhdGFfX1trZXldO3RoaXMuc2l6ZS09cmVzdWx0PzE6MDsKcmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBoYXNoR2V0KGtleSl7dmFyIGRhdGE9dGhpcy5fX2RhdGFfXztpZihuYXRpdmVDcmVhdGUpe3ZhciByZXN1bHQ9ZGF0YVtrZXldO3JldHVybiByZXN1bHQ9PT1IQVNIX1VOREVGSU5FRD91bmRlZmluZWQ6cmVzdWx0fXJldHVybiBoYXNPd25Qcm9wZXJ0eS5jYWxsKGRhdGEsa2V5KT9kYXRhW2tleV06dW5kZWZpbmVkfWZ1bmN0aW9uIGhhc2hIYXMoa2V5KXt2YXIgZGF0YT10aGlzLl9fZGF0YV9fO3JldHVybiBuYXRpdmVDcmVhdGU/ZGF0YVtrZXldIT09dW5kZWZpbmVkOmhhc093blByb3BlcnR5LmNhbGwoZGF0YSxrZXkpfWZ1bmN0aW9uIGhhc2hTZXQoa2V5LHZhbHVlKXt2YXIgZGF0YT10aGlzLl9fZGF0YV9fO3RoaXMuc2l6ZSs9dGhpcy5oYXMoa2V5KT8wOjE7ZGF0YVtrZXldPW5hdGl2ZUNyZWF0ZSYmdmFsdWU9PT11bmRlZmluZWQ/SEFTSF9VTkRFRklORUQ6dmFsdWU7cmV0dXJuIHRoaXN9SGFzaC5wcm90b3R5cGUuY2xlYXI9aGFzaENsZWFyOwpIYXNoLnByb3RvdHlwZVsiZGVsZXRlIl09aGFzaERlbGV0ZTtIYXNoLnByb3RvdHlwZS5nZXQ9aGFzaEdldDtIYXNoLnByb3RvdHlwZS5oYXM9aGFzaEhhcztIYXNoLnByb3RvdHlwZS5zZXQ9aGFzaFNldDtmdW5jdGlvbiBMaXN0Q2FjaGUoZW50cmllcyl7dmFyIGluZGV4PS0xLGxlbmd0aD1lbnRyaWVzPT1udWxsPzA6ZW50cmllcy5sZW5ndGg7dGhpcy5jbGVhcigpO3doaWxlKCsraW5kZXg8bGVuZ3RoKXt2YXIgZW50cnk9ZW50cmllc1tpbmRleF07dGhpcy5zZXQoZW50cnlbMF0sZW50cnlbMV0pfX1mdW5jdGlvbiBsaXN0Q2FjaGVDbGVhcigpe3RoaXMuX19kYXRhX189W107dGhpcy5zaXplPTB9ZnVuY3Rpb24gbGlzdENhY2hlRGVsZXRlKGtleSl7dmFyIGRhdGE9dGhpcy5fX2RhdGFfXyxpbmRleD1hc3NvY0luZGV4T2YoZGF0YSxrZXkpO2lmKGluZGV4PDApcmV0dXJuIGZhbHNlO3ZhciBsYXN0SW5kZXg9ZGF0YS5sZW5ndGgtMTtpZihpbmRleD09bGFzdEluZGV4KWRhdGEucG9wKCk7CmVsc2Ugc3BsaWNlLmNhbGwoZGF0YSxpbmRleCwxKTstLXRoaXMuc2l6ZTtyZXR1cm4gdHJ1ZX1mdW5jdGlvbiBsaXN0Q2FjaGVHZXQoa2V5KXt2YXIgZGF0YT10aGlzLl9fZGF0YV9fLGluZGV4PWFzc29jSW5kZXhPZihkYXRhLGtleSk7cmV0dXJuIGluZGV4PDA/dW5kZWZpbmVkOmRhdGFbaW5kZXhdWzFdfWZ1bmN0aW9uIGxpc3RDYWNoZUhhcyhrZXkpe3JldHVybiBhc3NvY0luZGV4T2YodGhpcy5fX2RhdGFfXyxrZXkpPi0xfWZ1bmN0aW9uIGxpc3RDYWNoZVNldChrZXksdmFsdWUpe3ZhciBkYXRhPXRoaXMuX19kYXRhX18saW5kZXg9YXNzb2NJbmRleE9mKGRhdGEsa2V5KTtpZihpbmRleDwwKXsrK3RoaXMuc2l6ZTtkYXRhLnB1c2goW2tleSx2YWx1ZV0pfWVsc2UgZGF0YVtpbmRleF1bMV09dmFsdWU7cmV0dXJuIHRoaXN9TGlzdENhY2hlLnByb3RvdHlwZS5jbGVhcj1saXN0Q2FjaGVDbGVhcjtMaXN0Q2FjaGUucHJvdG90eXBlWyJkZWxldGUiXT1saXN0Q2FjaGVEZWxldGU7TGlzdENhY2hlLnByb3RvdHlwZS5nZXQ9Cmxpc3RDYWNoZUdldDtMaXN0Q2FjaGUucHJvdG90eXBlLmhhcz1saXN0Q2FjaGVIYXM7TGlzdENhY2hlLnByb3RvdHlwZS5zZXQ9bGlzdENhY2hlU2V0O2Z1bmN0aW9uIE1hcENhY2hlKGVudHJpZXMpe3ZhciBpbmRleD0tMSxsZW5ndGg9ZW50cmllcz09bnVsbD8wOmVudHJpZXMubGVuZ3RoO3RoaXMuY2xlYXIoKTt3aGlsZSgrK2luZGV4PGxlbmd0aCl7dmFyIGVudHJ5PWVudHJpZXNbaW5kZXhdO3RoaXMuc2V0KGVudHJ5WzBdLGVudHJ5WzFdKX19ZnVuY3Rpb24gbWFwQ2FjaGVDbGVhcigpe3RoaXMuc2l6ZT0wO3RoaXMuX19kYXRhX189eyJoYXNoIjpuZXcgSGFzaCwibWFwIjpuZXcgKE1hcHx8TGlzdENhY2hlKSwic3RyaW5nIjpuZXcgSGFzaH19ZnVuY3Rpb24gbWFwQ2FjaGVEZWxldGUoa2V5KXt2YXIgcmVzdWx0PWdldE1hcERhdGEodGhpcyxrZXkpWyJkZWxldGUiXShrZXkpO3RoaXMuc2l6ZS09cmVzdWx0PzE6MDtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIG1hcENhY2hlR2V0KGtleSl7cmV0dXJuIGdldE1hcERhdGEodGhpcywKa2V5KS5nZXQoa2V5KX1mdW5jdGlvbiBtYXBDYWNoZUhhcyhrZXkpe3JldHVybiBnZXRNYXBEYXRhKHRoaXMsa2V5KS5oYXMoa2V5KX1mdW5jdGlvbiBtYXBDYWNoZVNldChrZXksdmFsdWUpe3ZhciBkYXRhPWdldE1hcERhdGEodGhpcyxrZXkpLHNpemU9ZGF0YS5zaXplO2RhdGEuc2V0KGtleSx2YWx1ZSk7dGhpcy5zaXplKz1kYXRhLnNpemU9PXNpemU/MDoxO3JldHVybiB0aGlzfU1hcENhY2hlLnByb3RvdHlwZS5jbGVhcj1tYXBDYWNoZUNsZWFyO01hcENhY2hlLnByb3RvdHlwZVsiZGVsZXRlIl09bWFwQ2FjaGVEZWxldGU7TWFwQ2FjaGUucHJvdG90eXBlLmdldD1tYXBDYWNoZUdldDtNYXBDYWNoZS5wcm90b3R5cGUuaGFzPW1hcENhY2hlSGFzO01hcENhY2hlLnByb3RvdHlwZS5zZXQ9bWFwQ2FjaGVTZXQ7ZnVuY3Rpb24gU2V0Q2FjaGUodmFsdWVzKXt2YXIgaW5kZXg9LTEsbGVuZ3RoPXZhbHVlcz09bnVsbD8wOnZhbHVlcy5sZW5ndGg7dGhpcy5fX2RhdGFfXz1uZXcgTWFwQ2FjaGU7CndoaWxlKCsraW5kZXg8bGVuZ3RoKXRoaXMuYWRkKHZhbHVlc1tpbmRleF0pfWZ1bmN0aW9uIHNldENhY2hlQWRkKHZhbHVlKXt0aGlzLl9fZGF0YV9fLnNldCh2YWx1ZSxIQVNIX1VOREVGSU5FRCk7cmV0dXJuIHRoaXN9ZnVuY3Rpb24gc2V0Q2FjaGVIYXModmFsdWUpe3JldHVybiB0aGlzLl9fZGF0YV9fLmhhcyh2YWx1ZSl9U2V0Q2FjaGUucHJvdG90eXBlLmFkZD1TZXRDYWNoZS5wcm90b3R5cGUucHVzaD1zZXRDYWNoZUFkZDtTZXRDYWNoZS5wcm90b3R5cGUuaGFzPXNldENhY2hlSGFzO2Z1bmN0aW9uIFN0YWNrKGVudHJpZXMpe3ZhciBkYXRhPXRoaXMuX19kYXRhX189bmV3IExpc3RDYWNoZShlbnRyaWVzKTt0aGlzLnNpemU9ZGF0YS5zaXplfWZ1bmN0aW9uIHN0YWNrQ2xlYXIoKXt0aGlzLl9fZGF0YV9fPW5ldyBMaXN0Q2FjaGU7dGhpcy5zaXplPTB9ZnVuY3Rpb24gc3RhY2tEZWxldGUoa2V5KXt2YXIgZGF0YT10aGlzLl9fZGF0YV9fLHJlc3VsdD1kYXRhWyJkZWxldGUiXShrZXkpOwp0aGlzLnNpemU9ZGF0YS5zaXplO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gc3RhY2tHZXQoa2V5KXtyZXR1cm4gdGhpcy5fX2RhdGFfXy5nZXQoa2V5KX1mdW5jdGlvbiBzdGFja0hhcyhrZXkpe3JldHVybiB0aGlzLl9fZGF0YV9fLmhhcyhrZXkpfWZ1bmN0aW9uIHN0YWNrU2V0KGtleSx2YWx1ZSl7dmFyIGRhdGE9dGhpcy5fX2RhdGFfXztpZihkYXRhIGluc3RhbmNlb2YgTGlzdENhY2hlKXt2YXIgcGFpcnM9ZGF0YS5fX2RhdGFfXztpZighTWFwfHxwYWlycy5sZW5ndGg8TEFSR0VfQVJSQVlfU0laRS0xKXtwYWlycy5wdXNoKFtrZXksdmFsdWVdKTt0aGlzLnNpemU9KytkYXRhLnNpemU7cmV0dXJuIHRoaXN9ZGF0YT10aGlzLl9fZGF0YV9fPW5ldyBNYXBDYWNoZShwYWlycyl9ZGF0YS5zZXQoa2V5LHZhbHVlKTt0aGlzLnNpemU9ZGF0YS5zaXplO3JldHVybiB0aGlzfVN0YWNrLnByb3RvdHlwZS5jbGVhcj1zdGFja0NsZWFyO1N0YWNrLnByb3RvdHlwZVsiZGVsZXRlIl09c3RhY2tEZWxldGU7ClN0YWNrLnByb3RvdHlwZS5nZXQ9c3RhY2tHZXQ7U3RhY2sucHJvdG90eXBlLmhhcz1zdGFja0hhcztTdGFjay5wcm90b3R5cGUuc2V0PXN0YWNrU2V0O2Z1bmN0aW9uIGFycmF5TGlrZUtleXModmFsdWUsaW5oZXJpdGVkKXt2YXIgaXNBcnI9aXNBcnJheSh2YWx1ZSksaXNBcmc9IWlzQXJyJiZpc0FyZ3VtZW50cyh2YWx1ZSksaXNCdWZmPSFpc0FyciYmIWlzQXJnJiZpc0J1ZmZlcih2YWx1ZSksaXNUeXBlPSFpc0FyciYmIWlzQXJnJiYhaXNCdWZmJiZpc1R5cGVkQXJyYXkodmFsdWUpLHNraXBJbmRleGVzPWlzQXJyfHxpc0FyZ3x8aXNCdWZmfHxpc1R5cGUscmVzdWx0PXNraXBJbmRleGVzP2Jhc2VUaW1lcyh2YWx1ZS5sZW5ndGgsU3RyaW5nKTpbXSxsZW5ndGg9cmVzdWx0Lmxlbmd0aDtmb3IodmFyIGtleSBpbiB2YWx1ZSlpZigoaW5oZXJpdGVkfHxoYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLGtleSkpJiYhKHNraXBJbmRleGVzJiYoa2V5PT0ibGVuZ3RoInx8aXNCdWZmJiYoa2V5PT0KIm9mZnNldCJ8fGtleT09InBhcmVudCIpfHxpc1R5cGUmJihrZXk9PSJidWZmZXIifHxrZXk9PSJieXRlTGVuZ3RoInx8a2V5PT0iYnl0ZU9mZnNldCIpfHxpc0luZGV4KGtleSxsZW5ndGgpKSkpcmVzdWx0LnB1c2goa2V5KTtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGFycmF5U2FtcGxlKGFycmF5KXt2YXIgbGVuZ3RoPWFycmF5Lmxlbmd0aDtyZXR1cm4gbGVuZ3RoP2FycmF5W2Jhc2VSYW5kb20oMCxsZW5ndGgtMSldOnVuZGVmaW5lZH1mdW5jdGlvbiBhcnJheVNhbXBsZVNpemUoYXJyYXksbil7cmV0dXJuIHNodWZmbGVTZWxmKGNvcHlBcnJheShhcnJheSksYmFzZUNsYW1wKG4sMCxhcnJheS5sZW5ndGgpKX1mdW5jdGlvbiBhcnJheVNodWZmbGUoYXJyYXkpe3JldHVybiBzaHVmZmxlU2VsZihjb3B5QXJyYXkoYXJyYXkpKX1mdW5jdGlvbiBhc3NpZ25NZXJnZVZhbHVlKG9iamVjdCxrZXksdmFsdWUpe2lmKHZhbHVlIT09dW5kZWZpbmVkJiYhZXEob2JqZWN0W2tleV0sdmFsdWUpfHwKdmFsdWU9PT11bmRlZmluZWQmJiEoa2V5IGluIG9iamVjdCkpYmFzZUFzc2lnblZhbHVlKG9iamVjdCxrZXksdmFsdWUpfWZ1bmN0aW9uIGFzc2lnblZhbHVlKG9iamVjdCxrZXksdmFsdWUpe3ZhciBvYmpWYWx1ZT1vYmplY3Rba2V5XTtpZighKGhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LGtleSkmJmVxKG9ialZhbHVlLHZhbHVlKSl8fHZhbHVlPT09dW5kZWZpbmVkJiYhKGtleSBpbiBvYmplY3QpKWJhc2VBc3NpZ25WYWx1ZShvYmplY3Qsa2V5LHZhbHVlKX1mdW5jdGlvbiBhc3NvY0luZGV4T2YoYXJyYXksa2V5KXt2YXIgbGVuZ3RoPWFycmF5Lmxlbmd0aDt3aGlsZShsZW5ndGgtLSlpZihlcShhcnJheVtsZW5ndGhdWzBdLGtleSkpcmV0dXJuIGxlbmd0aDtyZXR1cm4tMX1mdW5jdGlvbiBiYXNlQWdncmVnYXRvcihjb2xsZWN0aW9uLHNldHRlcixpdGVyYXRlZSxhY2N1bXVsYXRvcil7YmFzZUVhY2goY29sbGVjdGlvbixmdW5jdGlvbih2YWx1ZSxrZXksY29sbGVjdGlvbil7c2V0dGVyKGFjY3VtdWxhdG9yLAp2YWx1ZSxpdGVyYXRlZSh2YWx1ZSksY29sbGVjdGlvbil9KTtyZXR1cm4gYWNjdW11bGF0b3J9ZnVuY3Rpb24gYmFzZUFzc2lnbihvYmplY3Qsc291cmNlKXtyZXR1cm4gb2JqZWN0JiZjb3B5T2JqZWN0KHNvdXJjZSxrZXlzKHNvdXJjZSksb2JqZWN0KX1mdW5jdGlvbiBiYXNlQXNzaWduSW4ob2JqZWN0LHNvdXJjZSl7cmV0dXJuIG9iamVjdCYmY29weU9iamVjdChzb3VyY2Usa2V5c0luKHNvdXJjZSksb2JqZWN0KX1mdW5jdGlvbiBiYXNlQXNzaWduVmFsdWUob2JqZWN0LGtleSx2YWx1ZSl7aWYoa2V5PT0iX19wcm90b19fIiYmZGVmaW5lUHJvcGVydHkpZGVmaW5lUHJvcGVydHkob2JqZWN0LGtleSx7ImNvbmZpZ3VyYWJsZSI6dHJ1ZSwiZW51bWVyYWJsZSI6dHJ1ZSwidmFsdWUiOnZhbHVlLCJ3cml0YWJsZSI6dHJ1ZX0pO2Vsc2Ugb2JqZWN0W2tleV09dmFsdWV9ZnVuY3Rpb24gYmFzZUF0KG9iamVjdCxwYXRocyl7dmFyIGluZGV4PS0xLGxlbmd0aD1wYXRocy5sZW5ndGgscmVzdWx0PQpBcnJheShsZW5ndGgpLHNraXA9b2JqZWN0PT1udWxsO3doaWxlKCsraW5kZXg8bGVuZ3RoKXJlc3VsdFtpbmRleF09c2tpcD91bmRlZmluZWQ6Z2V0KG9iamVjdCxwYXRoc1tpbmRleF0pO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gYmFzZUNsYW1wKG51bWJlcixsb3dlcix1cHBlcil7aWYobnVtYmVyPT09bnVtYmVyKXtpZih1cHBlciE9PXVuZGVmaW5lZCludW1iZXI9bnVtYmVyPD11cHBlcj9udW1iZXI6dXBwZXI7aWYobG93ZXIhPT11bmRlZmluZWQpbnVtYmVyPW51bWJlcj49bG93ZXI/bnVtYmVyOmxvd2VyfXJldHVybiBudW1iZXJ9ZnVuY3Rpb24gYmFzZUNsb25lKHZhbHVlLGJpdG1hc2ssY3VzdG9taXplcixrZXksb2JqZWN0LHN0YWNrKXt2YXIgcmVzdWx0LGlzRGVlcD1iaXRtYXNrJkNMT05FX0RFRVBfRkxBRyxpc0ZsYXQ9Yml0bWFzayZDTE9ORV9GTEFUX0ZMQUcsaXNGdWxsPWJpdG1hc2smQ0xPTkVfU1lNQk9MU19GTEFHO2lmKGN1c3RvbWl6ZXIpcmVzdWx0PW9iamVjdD8KY3VzdG9taXplcih2YWx1ZSxrZXksb2JqZWN0LHN0YWNrKTpjdXN0b21pemVyKHZhbHVlKTtpZihyZXN1bHQhPT11bmRlZmluZWQpcmV0dXJuIHJlc3VsdDtpZighaXNPYmplY3QodmFsdWUpKXJldHVybiB2YWx1ZTt2YXIgaXNBcnI9aXNBcnJheSh2YWx1ZSk7aWYoaXNBcnIpe3Jlc3VsdD1pbml0Q2xvbmVBcnJheSh2YWx1ZSk7aWYoIWlzRGVlcClyZXR1cm4gY29weUFycmF5KHZhbHVlLHJlc3VsdCl9ZWxzZXt2YXIgdGFnPWdldFRhZyh2YWx1ZSksaXNGdW5jPXRhZz09ZnVuY1RhZ3x8dGFnPT1nZW5UYWc7aWYoaXNCdWZmZXIodmFsdWUpKXJldHVybiBjbG9uZUJ1ZmZlcih2YWx1ZSxpc0RlZXApO2lmKHRhZz09b2JqZWN0VGFnfHx0YWc9PWFyZ3NUYWd8fGlzRnVuYyYmIW9iamVjdCl7cmVzdWx0PWlzRmxhdHx8aXNGdW5jP3t9OmluaXRDbG9uZU9iamVjdCh2YWx1ZSk7aWYoIWlzRGVlcClyZXR1cm4gaXNGbGF0P2NvcHlTeW1ib2xzSW4odmFsdWUsYmFzZUFzc2lnbkluKHJlc3VsdCwKdmFsdWUpKTpjb3B5U3ltYm9scyh2YWx1ZSxiYXNlQXNzaWduKHJlc3VsdCx2YWx1ZSkpfWVsc2V7aWYoIWNsb25lYWJsZVRhZ3NbdGFnXSlyZXR1cm4gb2JqZWN0P3ZhbHVlOnt9O3Jlc3VsdD1pbml0Q2xvbmVCeVRhZyh2YWx1ZSx0YWcsaXNEZWVwKX19c3RhY2t8fChzdGFjaz1uZXcgU3RhY2spO3ZhciBzdGFja2VkPXN0YWNrLmdldCh2YWx1ZSk7aWYoc3RhY2tlZClyZXR1cm4gc3RhY2tlZDtzdGFjay5zZXQodmFsdWUscmVzdWx0KTtpZihpc1NldCh2YWx1ZSkpe3ZhbHVlLmZvckVhY2goZnVuY3Rpb24oc3ViVmFsdWUpe3Jlc3VsdC5hZGQoYmFzZUNsb25lKHN1YlZhbHVlLGJpdG1hc2ssY3VzdG9taXplcixzdWJWYWx1ZSx2YWx1ZSxzdGFjaykpfSk7cmV0dXJuIHJlc3VsdH1pZihpc01hcCh2YWx1ZSkpe3ZhbHVlLmZvckVhY2goZnVuY3Rpb24oc3ViVmFsdWUsa2V5KXtyZXN1bHQuc2V0KGtleSxiYXNlQ2xvbmUoc3ViVmFsdWUsYml0bWFzayxjdXN0b21pemVyLGtleSx2YWx1ZSwKc3RhY2spKX0pO3JldHVybiByZXN1bHR9dmFyIGtleXNGdW5jPWlzRnVsbD9pc0ZsYXQ/Z2V0QWxsS2V5c0luOmdldEFsbEtleXM6aXNGbGF0P2tleXNJbjprZXlzO3ZhciBwcm9wcz1pc0Fycj91bmRlZmluZWQ6a2V5c0Z1bmModmFsdWUpO2FycmF5RWFjaChwcm9wc3x8dmFsdWUsZnVuY3Rpb24oc3ViVmFsdWUsa2V5KXtpZihwcm9wcyl7a2V5PXN1YlZhbHVlO3N1YlZhbHVlPXZhbHVlW2tleV19YXNzaWduVmFsdWUocmVzdWx0LGtleSxiYXNlQ2xvbmUoc3ViVmFsdWUsYml0bWFzayxjdXN0b21pemVyLGtleSx2YWx1ZSxzdGFjaykpfSk7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBiYXNlQ29uZm9ybXMoc291cmNlKXt2YXIgcHJvcHM9a2V5cyhzb3VyY2UpO3JldHVybiBmdW5jdGlvbihvYmplY3Qpe3JldHVybiBiYXNlQ29uZm9ybXNUbyhvYmplY3Qsc291cmNlLHByb3BzKX19ZnVuY3Rpb24gYmFzZUNvbmZvcm1zVG8ob2JqZWN0LHNvdXJjZSxwcm9wcyl7dmFyIGxlbmd0aD1wcm9wcy5sZW5ndGg7CmlmKG9iamVjdD09bnVsbClyZXR1cm4hbGVuZ3RoO29iamVjdD1PYmplY3Qob2JqZWN0KTt3aGlsZShsZW5ndGgtLSl7dmFyIGtleT1wcm9wc1tsZW5ndGhdLHByZWRpY2F0ZT1zb3VyY2Vba2V5XSx2YWx1ZT1vYmplY3Rba2V5XTtpZih2YWx1ZT09PXVuZGVmaW5lZCYmIShrZXkgaW4gb2JqZWN0KXx8IXByZWRpY2F0ZSh2YWx1ZSkpcmV0dXJuIGZhbHNlfXJldHVybiB0cnVlfWZ1bmN0aW9uIGJhc2VEZWxheShmdW5jLHdhaXQsYXJncyl7aWYodHlwZW9mIGZ1bmMhPSJmdW5jdGlvbiIpdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO3JldHVybiBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZnVuYy5hcHBseSh1bmRlZmluZWQsYXJncyl9LHdhaXQpfWZ1bmN0aW9uIGJhc2VEaWZmZXJlbmNlKGFycmF5LHZhbHVlcyxpdGVyYXRlZSxjb21wYXJhdG9yKXt2YXIgaW5kZXg9LTEsaW5jbHVkZXM9YXJyYXlJbmNsdWRlcyxpc0NvbW1vbj10cnVlLGxlbmd0aD1hcnJheS5sZW5ndGgsCnJlc3VsdD1bXSx2YWx1ZXNMZW5ndGg9dmFsdWVzLmxlbmd0aDtpZighbGVuZ3RoKXJldHVybiByZXN1bHQ7aWYoaXRlcmF0ZWUpdmFsdWVzPWFycmF5TWFwKHZhbHVlcyxiYXNlVW5hcnkoaXRlcmF0ZWUpKTtpZihjb21wYXJhdG9yKXtpbmNsdWRlcz1hcnJheUluY2x1ZGVzV2l0aDtpc0NvbW1vbj1mYWxzZX1lbHNlIGlmKHZhbHVlcy5sZW5ndGg+PUxBUkdFX0FSUkFZX1NJWkUpe2luY2x1ZGVzPWNhY2hlSGFzO2lzQ29tbW9uPWZhbHNlO3ZhbHVlcz1uZXcgU2V0Q2FjaGUodmFsdWVzKX1vdXRlcjp3aGlsZSgrK2luZGV4PGxlbmd0aCl7dmFyIHZhbHVlPWFycmF5W2luZGV4XSxjb21wdXRlZD1pdGVyYXRlZT09bnVsbD92YWx1ZTppdGVyYXRlZSh2YWx1ZSk7dmFsdWU9Y29tcGFyYXRvcnx8dmFsdWUhPT0wP3ZhbHVlOjA7aWYoaXNDb21tb24mJmNvbXB1dGVkPT09Y29tcHV0ZWQpe3ZhciB2YWx1ZXNJbmRleD12YWx1ZXNMZW5ndGg7d2hpbGUodmFsdWVzSW5kZXgtLSlpZih2YWx1ZXNbdmFsdWVzSW5kZXhdPT09CmNvbXB1dGVkKWNvbnRpbnVlIG91dGVyO3Jlc3VsdC5wdXNoKHZhbHVlKX1lbHNlIGlmKCFpbmNsdWRlcyh2YWx1ZXMsY29tcHV0ZWQsY29tcGFyYXRvcikpcmVzdWx0LnB1c2godmFsdWUpfXJldHVybiByZXN1bHR9dmFyIGJhc2VFYWNoPWNyZWF0ZUJhc2VFYWNoKGJhc2VGb3JPd24pO3ZhciBiYXNlRWFjaFJpZ2h0PWNyZWF0ZUJhc2VFYWNoKGJhc2VGb3JPd25SaWdodCx0cnVlKTtmdW5jdGlvbiBiYXNlRXZlcnkoY29sbGVjdGlvbixwcmVkaWNhdGUpe3ZhciByZXN1bHQ9dHJ1ZTtiYXNlRWFjaChjb2xsZWN0aW9uLGZ1bmN0aW9uKHZhbHVlLGluZGV4LGNvbGxlY3Rpb24pe3Jlc3VsdD0hIXByZWRpY2F0ZSh2YWx1ZSxpbmRleCxjb2xsZWN0aW9uKTtyZXR1cm4gcmVzdWx0fSk7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBiYXNlRXh0cmVtdW0oYXJyYXksaXRlcmF0ZWUsY29tcGFyYXRvcil7dmFyIGluZGV4PS0xLGxlbmd0aD1hcnJheS5sZW5ndGg7d2hpbGUoKytpbmRleDxsZW5ndGgpe3ZhciB2YWx1ZT0KYXJyYXlbaW5kZXhdLGN1cnJlbnQ9aXRlcmF0ZWUodmFsdWUpO2lmKGN1cnJlbnQhPW51bGwmJihjb21wdXRlZD09PXVuZGVmaW5lZD9jdXJyZW50PT09Y3VycmVudCYmIWlzU3ltYm9sKGN1cnJlbnQpOmNvbXBhcmF0b3IoY3VycmVudCxjb21wdXRlZCkpKXZhciBjb21wdXRlZD1jdXJyZW50LHJlc3VsdD12YWx1ZX1yZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGJhc2VGaWxsKGFycmF5LHZhbHVlLHN0YXJ0LGVuZCl7dmFyIGxlbmd0aD1hcnJheS5sZW5ndGg7c3RhcnQ9dG9JbnRlZ2VyKHN0YXJ0KTtpZihzdGFydDwwKXN0YXJ0PS1zdGFydD5sZW5ndGg/MDpsZW5ndGgrc3RhcnQ7ZW5kPWVuZD09PXVuZGVmaW5lZHx8ZW5kPmxlbmd0aD9sZW5ndGg6dG9JbnRlZ2VyKGVuZCk7aWYoZW5kPDApZW5kKz1sZW5ndGg7ZW5kPXN0YXJ0PmVuZD8wOnRvTGVuZ3RoKGVuZCk7d2hpbGUoc3RhcnQ8ZW5kKWFycmF5W3N0YXJ0KytdPXZhbHVlO3JldHVybiBhcnJheX1mdW5jdGlvbiBiYXNlRmlsdGVyKGNvbGxlY3Rpb24sCnByZWRpY2F0ZSl7dmFyIHJlc3VsdD1bXTtiYXNlRWFjaChjb2xsZWN0aW9uLGZ1bmN0aW9uKHZhbHVlLGluZGV4LGNvbGxlY3Rpb24pe2lmKHByZWRpY2F0ZSh2YWx1ZSxpbmRleCxjb2xsZWN0aW9uKSlyZXN1bHQucHVzaCh2YWx1ZSl9KTtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGJhc2VGbGF0dGVuKGFycmF5LGRlcHRoLHByZWRpY2F0ZSxpc1N0cmljdCxyZXN1bHQpe3ZhciBpbmRleD0tMSxsZW5ndGg9YXJyYXkubGVuZ3RoO3ByZWRpY2F0ZXx8KHByZWRpY2F0ZT1pc0ZsYXR0ZW5hYmxlKTtyZXN1bHR8fChyZXN1bHQ9W10pO3doaWxlKCsraW5kZXg8bGVuZ3RoKXt2YXIgdmFsdWU9YXJyYXlbaW5kZXhdO2lmKGRlcHRoPjAmJnByZWRpY2F0ZSh2YWx1ZSkpaWYoZGVwdGg+MSliYXNlRmxhdHRlbih2YWx1ZSxkZXB0aC0xLHByZWRpY2F0ZSxpc1N0cmljdCxyZXN1bHQpO2Vsc2UgYXJyYXlQdXNoKHJlc3VsdCx2YWx1ZSk7ZWxzZSBpZighaXNTdHJpY3QpcmVzdWx0W3Jlc3VsdC5sZW5ndGhdPQp2YWx1ZX1yZXR1cm4gcmVzdWx0fXZhciBiYXNlRm9yPWNyZWF0ZUJhc2VGb3IoKTt2YXIgYmFzZUZvclJpZ2h0PWNyZWF0ZUJhc2VGb3IodHJ1ZSk7ZnVuY3Rpb24gYmFzZUZvck93bihvYmplY3QsaXRlcmF0ZWUpe3JldHVybiBvYmplY3QmJmJhc2VGb3Iob2JqZWN0LGl0ZXJhdGVlLGtleXMpfWZ1bmN0aW9uIGJhc2VGb3JPd25SaWdodChvYmplY3QsaXRlcmF0ZWUpe3JldHVybiBvYmplY3QmJmJhc2VGb3JSaWdodChvYmplY3QsaXRlcmF0ZWUsa2V5cyl9ZnVuY3Rpb24gYmFzZUZ1bmN0aW9ucyhvYmplY3QscHJvcHMpe3JldHVybiBhcnJheUZpbHRlcihwcm9wcyxmdW5jdGlvbihrZXkpe3JldHVybiBpc0Z1bmN0aW9uKG9iamVjdFtrZXldKX0pfWZ1bmN0aW9uIGJhc2VHZXQob2JqZWN0LHBhdGgpe3BhdGg9Y2FzdFBhdGgocGF0aCxvYmplY3QpO3ZhciBpbmRleD0wLGxlbmd0aD1wYXRoLmxlbmd0aDt3aGlsZShvYmplY3QhPW51bGwmJmluZGV4PGxlbmd0aClvYmplY3Q9b2JqZWN0W3RvS2V5KHBhdGhbaW5kZXgrK10pXTsKcmV0dXJuIGluZGV4JiZpbmRleD09bGVuZ3RoP29iamVjdDp1bmRlZmluZWR9ZnVuY3Rpb24gYmFzZUdldEFsbEtleXMob2JqZWN0LGtleXNGdW5jLHN5bWJvbHNGdW5jKXt2YXIgcmVzdWx0PWtleXNGdW5jKG9iamVjdCk7cmV0dXJuIGlzQXJyYXkob2JqZWN0KT9yZXN1bHQ6YXJyYXlQdXNoKHJlc3VsdCxzeW1ib2xzRnVuYyhvYmplY3QpKX1mdW5jdGlvbiBiYXNlR2V0VGFnKHZhbHVlKXtpZih2YWx1ZT09bnVsbClyZXR1cm4gdmFsdWU9PT11bmRlZmluZWQ/dW5kZWZpbmVkVGFnOm51bGxUYWc7cmV0dXJuIHN5bVRvU3RyaW5nVGFnJiZzeW1Ub1N0cmluZ1RhZyBpbiBPYmplY3QodmFsdWUpP2dldFJhd1RhZyh2YWx1ZSk6b2JqZWN0VG9TdHJpbmcodmFsdWUpfWZ1bmN0aW9uIGJhc2VHdCh2YWx1ZSxvdGhlcil7cmV0dXJuIHZhbHVlPm90aGVyfWZ1bmN0aW9uIGJhc2VIYXMob2JqZWN0LGtleSl7cmV0dXJuIG9iamVjdCE9bnVsbCYmaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsCmtleSl9ZnVuY3Rpb24gYmFzZUhhc0luKG9iamVjdCxrZXkpe3JldHVybiBvYmplY3QhPW51bGwmJmtleSBpbiBPYmplY3Qob2JqZWN0KX1mdW5jdGlvbiBiYXNlSW5SYW5nZShudW1iZXIsc3RhcnQsZW5kKXtyZXR1cm4gbnVtYmVyPj1uYXRpdmVNaW4oc3RhcnQsZW5kKSYmbnVtYmVyPG5hdGl2ZU1heChzdGFydCxlbmQpfWZ1bmN0aW9uIGJhc2VJbnRlcnNlY3Rpb24oYXJyYXlzLGl0ZXJhdGVlLGNvbXBhcmF0b3Ipe3ZhciBpbmNsdWRlcz1jb21wYXJhdG9yP2FycmF5SW5jbHVkZXNXaXRoOmFycmF5SW5jbHVkZXMsbGVuZ3RoPWFycmF5c1swXS5sZW5ndGgsb3RoTGVuZ3RoPWFycmF5cy5sZW5ndGgsb3RoSW5kZXg9b3RoTGVuZ3RoLGNhY2hlcz1BcnJheShvdGhMZW5ndGgpLG1heExlbmd0aD1JbmZpbml0eSxyZXN1bHQ9W107d2hpbGUob3RoSW5kZXgtLSl7dmFyIGFycmF5PWFycmF5c1tvdGhJbmRleF07aWYob3RoSW5kZXgmJml0ZXJhdGVlKWFycmF5PWFycmF5TWFwKGFycmF5LApiYXNlVW5hcnkoaXRlcmF0ZWUpKTttYXhMZW5ndGg9bmF0aXZlTWluKGFycmF5Lmxlbmd0aCxtYXhMZW5ndGgpO2NhY2hlc1tvdGhJbmRleF09IWNvbXBhcmF0b3ImJihpdGVyYXRlZXx8bGVuZ3RoPj0xMjAmJmFycmF5Lmxlbmd0aD49MTIwKT9uZXcgU2V0Q2FjaGUob3RoSW5kZXgmJmFycmF5KTp1bmRlZmluZWR9YXJyYXk9YXJyYXlzWzBdO3ZhciBpbmRleD0tMSxzZWVuPWNhY2hlc1swXTtvdXRlcjp3aGlsZSgrK2luZGV4PGxlbmd0aCYmcmVzdWx0Lmxlbmd0aDxtYXhMZW5ndGgpe3ZhciB2YWx1ZT1hcnJheVtpbmRleF0sY29tcHV0ZWQ9aXRlcmF0ZWU/aXRlcmF0ZWUodmFsdWUpOnZhbHVlO3ZhbHVlPWNvbXBhcmF0b3J8fHZhbHVlIT09MD92YWx1ZTowO2lmKCEoc2Vlbj9jYWNoZUhhcyhzZWVuLGNvbXB1dGVkKTppbmNsdWRlcyhyZXN1bHQsY29tcHV0ZWQsY29tcGFyYXRvcikpKXtvdGhJbmRleD1vdGhMZW5ndGg7d2hpbGUoLS1vdGhJbmRleCl7dmFyIGNhY2hlPWNhY2hlc1tvdGhJbmRleF07CmlmKCEoY2FjaGU/Y2FjaGVIYXMoY2FjaGUsY29tcHV0ZWQpOmluY2x1ZGVzKGFycmF5c1tvdGhJbmRleF0sY29tcHV0ZWQsY29tcGFyYXRvcikpKWNvbnRpbnVlIG91dGVyfWlmKHNlZW4pc2Vlbi5wdXNoKGNvbXB1dGVkKTtyZXN1bHQucHVzaCh2YWx1ZSl9fXJldHVybiByZXN1bHR9ZnVuY3Rpb24gYmFzZUludmVydGVyKG9iamVjdCxzZXR0ZXIsaXRlcmF0ZWUsYWNjdW11bGF0b3Ipe2Jhc2VGb3JPd24ob2JqZWN0LGZ1bmN0aW9uKHZhbHVlLGtleSxvYmplY3Qpe3NldHRlcihhY2N1bXVsYXRvcixpdGVyYXRlZSh2YWx1ZSksa2V5LG9iamVjdCl9KTtyZXR1cm4gYWNjdW11bGF0b3J9ZnVuY3Rpb24gYmFzZUludm9rZShvYmplY3QscGF0aCxhcmdzKXtwYXRoPWNhc3RQYXRoKHBhdGgsb2JqZWN0KTtvYmplY3Q9cGFyZW50KG9iamVjdCxwYXRoKTt2YXIgZnVuYz1vYmplY3Q9PW51bGw/b2JqZWN0Om9iamVjdFt0b0tleShsYXN0KHBhdGgpKV07cmV0dXJuIGZ1bmM9PW51bGw/dW5kZWZpbmVkOgphcHBseShmdW5jLG9iamVjdCxhcmdzKX1mdW5jdGlvbiBiYXNlSXNBcmd1bWVudHModmFsdWUpe3JldHVybiBpc09iamVjdExpa2UodmFsdWUpJiZiYXNlR2V0VGFnKHZhbHVlKT09YXJnc1RhZ31mdW5jdGlvbiBiYXNlSXNBcnJheUJ1ZmZlcih2YWx1ZSl7cmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkmJmJhc2VHZXRUYWcodmFsdWUpPT1hcnJheUJ1ZmZlclRhZ31mdW5jdGlvbiBiYXNlSXNEYXRlKHZhbHVlKXtyZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSYmYmFzZUdldFRhZyh2YWx1ZSk9PWRhdGVUYWd9ZnVuY3Rpb24gYmFzZUlzRXF1YWwodmFsdWUsb3RoZXIsYml0bWFzayxjdXN0b21pemVyLHN0YWNrKXtpZih2YWx1ZT09PW90aGVyKXJldHVybiB0cnVlO2lmKHZhbHVlPT1udWxsfHxvdGhlcj09bnVsbHx8IWlzT2JqZWN0TGlrZSh2YWx1ZSkmJiFpc09iamVjdExpa2Uob3RoZXIpKXJldHVybiB2YWx1ZSE9PXZhbHVlJiZvdGhlciE9PW90aGVyO3JldHVybiBiYXNlSXNFcXVhbERlZXAodmFsdWUsCm90aGVyLGJpdG1hc2ssY3VzdG9taXplcixiYXNlSXNFcXVhbCxzdGFjayl9ZnVuY3Rpb24gYmFzZUlzRXF1YWxEZWVwKG9iamVjdCxvdGhlcixiaXRtYXNrLGN1c3RvbWl6ZXIsZXF1YWxGdW5jLHN0YWNrKXt2YXIgb2JqSXNBcnI9aXNBcnJheShvYmplY3QpLG90aElzQXJyPWlzQXJyYXkob3RoZXIpLG9ialRhZz1vYmpJc0Fycj9hcnJheVRhZzpnZXRUYWcob2JqZWN0KSxvdGhUYWc9b3RoSXNBcnI/YXJyYXlUYWc6Z2V0VGFnKG90aGVyKTtvYmpUYWc9b2JqVGFnPT1hcmdzVGFnP29iamVjdFRhZzpvYmpUYWc7b3RoVGFnPW90aFRhZz09YXJnc1RhZz9vYmplY3RUYWc6b3RoVGFnO3ZhciBvYmpJc09iaj1vYmpUYWc9PW9iamVjdFRhZyxvdGhJc09iaj1vdGhUYWc9PW9iamVjdFRhZyxpc1NhbWVUYWc9b2JqVGFnPT1vdGhUYWc7aWYoaXNTYW1lVGFnJiZpc0J1ZmZlcihvYmplY3QpKXtpZighaXNCdWZmZXIob3RoZXIpKXJldHVybiBmYWxzZTtvYmpJc0Fycj10cnVlO29iaklzT2JqPQpmYWxzZX1pZihpc1NhbWVUYWcmJiFvYmpJc09iail7c3RhY2t8fChzdGFjaz1uZXcgU3RhY2spO3JldHVybiBvYmpJc0Fycnx8aXNUeXBlZEFycmF5KG9iamVjdCk/ZXF1YWxBcnJheXMob2JqZWN0LG90aGVyLGJpdG1hc2ssY3VzdG9taXplcixlcXVhbEZ1bmMsc3RhY2spOmVxdWFsQnlUYWcob2JqZWN0LG90aGVyLG9ialRhZyxiaXRtYXNrLGN1c3RvbWl6ZXIsZXF1YWxGdW5jLHN0YWNrKX1pZighKGJpdG1hc2smQ09NUEFSRV9QQVJUSUFMX0ZMQUcpKXt2YXIgb2JqSXNXcmFwcGVkPW9iaklzT2JqJiZoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwiX193cmFwcGVkX18iKSxvdGhJc1dyYXBwZWQ9b3RoSXNPYmomJmhhc093blByb3BlcnR5LmNhbGwob3RoZXIsIl9fd3JhcHBlZF9fIik7aWYob2JqSXNXcmFwcGVkfHxvdGhJc1dyYXBwZWQpe3ZhciBvYmpVbndyYXBwZWQ9b2JqSXNXcmFwcGVkP29iamVjdC52YWx1ZSgpOm9iamVjdCxvdGhVbndyYXBwZWQ9b3RoSXNXcmFwcGVkP290aGVyLnZhbHVlKCk6Cm90aGVyO3N0YWNrfHwoc3RhY2s9bmV3IFN0YWNrKTtyZXR1cm4gZXF1YWxGdW5jKG9ialVud3JhcHBlZCxvdGhVbndyYXBwZWQsYml0bWFzayxjdXN0b21pemVyLHN0YWNrKX19aWYoIWlzU2FtZVRhZylyZXR1cm4gZmFsc2U7c3RhY2t8fChzdGFjaz1uZXcgU3RhY2spO3JldHVybiBlcXVhbE9iamVjdHMob2JqZWN0LG90aGVyLGJpdG1hc2ssY3VzdG9taXplcixlcXVhbEZ1bmMsc3RhY2spfWZ1bmN0aW9uIGJhc2VJc01hcCh2YWx1ZSl7cmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkmJmdldFRhZyh2YWx1ZSk9PW1hcFRhZ31mdW5jdGlvbiBiYXNlSXNNYXRjaChvYmplY3Qsc291cmNlLG1hdGNoRGF0YSxjdXN0b21pemVyKXt2YXIgaW5kZXg9bWF0Y2hEYXRhLmxlbmd0aCxsZW5ndGg9aW5kZXgsbm9DdXN0b21pemVyPSFjdXN0b21pemVyO2lmKG9iamVjdD09bnVsbClyZXR1cm4hbGVuZ3RoO29iamVjdD1PYmplY3Qob2JqZWN0KTt3aGlsZShpbmRleC0tKXt2YXIgZGF0YT1tYXRjaERhdGFbaW5kZXhdOwppZihub0N1c3RvbWl6ZXImJmRhdGFbMl0/ZGF0YVsxXSE9PW9iamVjdFtkYXRhWzBdXTohKGRhdGFbMF1pbiBvYmplY3QpKXJldHVybiBmYWxzZX13aGlsZSgrK2luZGV4PGxlbmd0aCl7ZGF0YT1tYXRjaERhdGFbaW5kZXhdO3ZhciBrZXk9ZGF0YVswXSxvYmpWYWx1ZT1vYmplY3Rba2V5XSxzcmNWYWx1ZT1kYXRhWzFdO2lmKG5vQ3VzdG9taXplciYmZGF0YVsyXSl7aWYob2JqVmFsdWU9PT11bmRlZmluZWQmJiEoa2V5IGluIG9iamVjdCkpcmV0dXJuIGZhbHNlfWVsc2V7dmFyIHN0YWNrPW5ldyBTdGFjaztpZihjdXN0b21pemVyKXZhciByZXN1bHQ9Y3VzdG9taXplcihvYmpWYWx1ZSxzcmNWYWx1ZSxrZXksb2JqZWN0LHNvdXJjZSxzdGFjayk7aWYoIShyZXN1bHQ9PT11bmRlZmluZWQ/YmFzZUlzRXF1YWwoc3JjVmFsdWUsb2JqVmFsdWUsQ09NUEFSRV9QQVJUSUFMX0ZMQUd8Q09NUEFSRV9VTk9SREVSRURfRkxBRyxjdXN0b21pemVyLHN0YWNrKTpyZXN1bHQpKXJldHVybiBmYWxzZX19cmV0dXJuIHRydWV9CmZ1bmN0aW9uIGJhc2VJc05hdGl2ZSh2YWx1ZSl7aWYoIWlzT2JqZWN0KHZhbHVlKXx8aXNNYXNrZWQodmFsdWUpKXJldHVybiBmYWxzZTt2YXIgcGF0dGVybj1pc0Z1bmN0aW9uKHZhbHVlKT9yZUlzTmF0aXZlOnJlSXNIb3N0Q3RvcjtyZXR1cm4gcGF0dGVybi50ZXN0KHRvU291cmNlKHZhbHVlKSl9ZnVuY3Rpb24gYmFzZUlzUmVnRXhwKHZhbHVlKXtyZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSYmYmFzZUdldFRhZyh2YWx1ZSk9PXJlZ2V4cFRhZ31mdW5jdGlvbiBiYXNlSXNTZXQodmFsdWUpe3JldHVybiBpc09iamVjdExpa2UodmFsdWUpJiZnZXRUYWcodmFsdWUpPT1zZXRUYWd9ZnVuY3Rpb24gYmFzZUlzVHlwZWRBcnJheSh2YWx1ZSl7cmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkmJmlzTGVuZ3RoKHZhbHVlLmxlbmd0aCkmJiEhdHlwZWRBcnJheVRhZ3NbYmFzZUdldFRhZyh2YWx1ZSldfWZ1bmN0aW9uIGJhc2VJdGVyYXRlZSh2YWx1ZSl7aWYodHlwZW9mIHZhbHVlPT0iZnVuY3Rpb24iKXJldHVybiB2YWx1ZTsKaWYodmFsdWU9PW51bGwpcmV0dXJuIGlkZW50aXR5O2lmKHR5cGVvZiB2YWx1ZT09Im9iamVjdCIpcmV0dXJuIGlzQXJyYXkodmFsdWUpP2Jhc2VNYXRjaGVzUHJvcGVydHkodmFsdWVbMF0sdmFsdWVbMV0pOmJhc2VNYXRjaGVzKHZhbHVlKTtyZXR1cm4gcHJvcGVydHkodmFsdWUpfWZ1bmN0aW9uIGJhc2VLZXlzKG9iamVjdCl7aWYoIWlzUHJvdG90eXBlKG9iamVjdCkpcmV0dXJuIG5hdGl2ZUtleXMob2JqZWN0KTt2YXIgcmVzdWx0PVtdO2Zvcih2YXIga2V5IGluIE9iamVjdChvYmplY3QpKWlmKGhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LGtleSkmJmtleSE9ImNvbnN0cnVjdG9yIilyZXN1bHQucHVzaChrZXkpO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gYmFzZUtleXNJbihvYmplY3Qpe2lmKCFpc09iamVjdChvYmplY3QpKXJldHVybiBuYXRpdmVLZXlzSW4ob2JqZWN0KTt2YXIgaXNQcm90bz1pc1Byb3RvdHlwZShvYmplY3QpLHJlc3VsdD1bXTtmb3IodmFyIGtleSBpbiBvYmplY3QpaWYoIShrZXk9PQoiY29uc3RydWN0b3IiJiYoaXNQcm90b3x8IWhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LGtleSkpKSlyZXN1bHQucHVzaChrZXkpO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gYmFzZUx0KHZhbHVlLG90aGVyKXtyZXR1cm4gdmFsdWU8b3RoZXJ9ZnVuY3Rpb24gYmFzZU1hcChjb2xsZWN0aW9uLGl0ZXJhdGVlKXt2YXIgaW5kZXg9LTEscmVzdWx0PWlzQXJyYXlMaWtlKGNvbGxlY3Rpb24pP0FycmF5KGNvbGxlY3Rpb24ubGVuZ3RoKTpbXTtiYXNlRWFjaChjb2xsZWN0aW9uLGZ1bmN0aW9uKHZhbHVlLGtleSxjb2xsZWN0aW9uKXtyZXN1bHRbKytpbmRleF09aXRlcmF0ZWUodmFsdWUsa2V5LGNvbGxlY3Rpb24pfSk7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBiYXNlTWF0Y2hlcyhzb3VyY2Upe3ZhciBtYXRjaERhdGE9Z2V0TWF0Y2hEYXRhKHNvdXJjZSk7aWYobWF0Y2hEYXRhLmxlbmd0aD09MSYmbWF0Y2hEYXRhWzBdWzJdKXJldHVybiBtYXRjaGVzU3RyaWN0Q29tcGFyYWJsZShtYXRjaERhdGFbMF1bMF0sCm1hdGNoRGF0YVswXVsxXSk7cmV0dXJuIGZ1bmN0aW9uKG9iamVjdCl7cmV0dXJuIG9iamVjdD09PXNvdXJjZXx8YmFzZUlzTWF0Y2gob2JqZWN0LHNvdXJjZSxtYXRjaERhdGEpfX1mdW5jdGlvbiBiYXNlTWF0Y2hlc1Byb3BlcnR5KHBhdGgsc3JjVmFsdWUpe2lmKGlzS2V5KHBhdGgpJiZpc1N0cmljdENvbXBhcmFibGUoc3JjVmFsdWUpKXJldHVybiBtYXRjaGVzU3RyaWN0Q29tcGFyYWJsZSh0b0tleShwYXRoKSxzcmNWYWx1ZSk7cmV0dXJuIGZ1bmN0aW9uKG9iamVjdCl7dmFyIG9ialZhbHVlPWdldChvYmplY3QscGF0aCk7cmV0dXJuIG9ialZhbHVlPT09dW5kZWZpbmVkJiZvYmpWYWx1ZT09PXNyY1ZhbHVlP2hhc0luKG9iamVjdCxwYXRoKTpiYXNlSXNFcXVhbChzcmNWYWx1ZSxvYmpWYWx1ZSxDT01QQVJFX1BBUlRJQUxfRkxBR3xDT01QQVJFX1VOT1JERVJFRF9GTEFHKX19ZnVuY3Rpb24gYmFzZU1lcmdlKG9iamVjdCxzb3VyY2Usc3JjSW5kZXgsY3VzdG9taXplcixzdGFjayl7aWYob2JqZWN0PT09CnNvdXJjZSlyZXR1cm47YmFzZUZvcihzb3VyY2UsZnVuY3Rpb24oc3JjVmFsdWUsa2V5KXtpZihpc09iamVjdChzcmNWYWx1ZSkpe3N0YWNrfHwoc3RhY2s9bmV3IFN0YWNrKTtiYXNlTWVyZ2VEZWVwKG9iamVjdCxzb3VyY2Usa2V5LHNyY0luZGV4LGJhc2VNZXJnZSxjdXN0b21pemVyLHN0YWNrKX1lbHNle3ZhciBuZXdWYWx1ZT1jdXN0b21pemVyP2N1c3RvbWl6ZXIoc2FmZUdldChvYmplY3Qsa2V5KSxzcmNWYWx1ZSxrZXkrIiIsb2JqZWN0LHNvdXJjZSxzdGFjayk6dW5kZWZpbmVkO2lmKG5ld1ZhbHVlPT09dW5kZWZpbmVkKW5ld1ZhbHVlPXNyY1ZhbHVlO2Fzc2lnbk1lcmdlVmFsdWUob2JqZWN0LGtleSxuZXdWYWx1ZSl9fSxrZXlzSW4pfWZ1bmN0aW9uIGJhc2VNZXJnZURlZXAob2JqZWN0LHNvdXJjZSxrZXksc3JjSW5kZXgsbWVyZ2VGdW5jLGN1c3RvbWl6ZXIsc3RhY2spe3ZhciBvYmpWYWx1ZT1zYWZlR2V0KG9iamVjdCxrZXkpLHNyY1ZhbHVlPXNhZmVHZXQoc291cmNlLAprZXkpLHN0YWNrZWQ9c3RhY2suZ2V0KHNyY1ZhbHVlKTtpZihzdGFja2VkKXthc3NpZ25NZXJnZVZhbHVlKG9iamVjdCxrZXksc3RhY2tlZCk7cmV0dXJufXZhciBuZXdWYWx1ZT1jdXN0b21pemVyP2N1c3RvbWl6ZXIob2JqVmFsdWUsc3JjVmFsdWUsa2V5KyIiLG9iamVjdCxzb3VyY2Usc3RhY2spOnVuZGVmaW5lZDt2YXIgaXNDb21tb249bmV3VmFsdWU9PT11bmRlZmluZWQ7aWYoaXNDb21tb24pe3ZhciBpc0Fycj1pc0FycmF5KHNyY1ZhbHVlKSxpc0J1ZmY9IWlzQXJyJiZpc0J1ZmZlcihzcmNWYWx1ZSksaXNUeXBlZD0haXNBcnImJiFpc0J1ZmYmJmlzVHlwZWRBcnJheShzcmNWYWx1ZSk7bmV3VmFsdWU9c3JjVmFsdWU7aWYoaXNBcnJ8fGlzQnVmZnx8aXNUeXBlZClpZihpc0FycmF5KG9ialZhbHVlKSluZXdWYWx1ZT1vYmpWYWx1ZTtlbHNlIGlmKGlzQXJyYXlMaWtlT2JqZWN0KG9ialZhbHVlKSluZXdWYWx1ZT1jb3B5QXJyYXkob2JqVmFsdWUpO2Vsc2UgaWYoaXNCdWZmKXtpc0NvbW1vbj0KZmFsc2U7bmV3VmFsdWU9Y2xvbmVCdWZmZXIoc3JjVmFsdWUsdHJ1ZSl9ZWxzZSBpZihpc1R5cGVkKXtpc0NvbW1vbj1mYWxzZTtuZXdWYWx1ZT1jbG9uZVR5cGVkQXJyYXkoc3JjVmFsdWUsdHJ1ZSl9ZWxzZSBuZXdWYWx1ZT1bXTtlbHNlIGlmKGlzUGxhaW5PYmplY3Qoc3JjVmFsdWUpfHxpc0FyZ3VtZW50cyhzcmNWYWx1ZSkpe25ld1ZhbHVlPW9ialZhbHVlO2lmKGlzQXJndW1lbnRzKG9ialZhbHVlKSluZXdWYWx1ZT10b1BsYWluT2JqZWN0KG9ialZhbHVlKTtlbHNlIGlmKCFpc09iamVjdChvYmpWYWx1ZSl8fHNyY0luZGV4JiZpc0Z1bmN0aW9uKG9ialZhbHVlKSluZXdWYWx1ZT1pbml0Q2xvbmVPYmplY3Qoc3JjVmFsdWUpfWVsc2UgaXNDb21tb249ZmFsc2V9aWYoaXNDb21tb24pe3N0YWNrLnNldChzcmNWYWx1ZSxuZXdWYWx1ZSk7bWVyZ2VGdW5jKG5ld1ZhbHVlLHNyY1ZhbHVlLHNyY0luZGV4LGN1c3RvbWl6ZXIsc3RhY2spO3N0YWNrWyJkZWxldGUiXShzcmNWYWx1ZSl9YXNzaWduTWVyZ2VWYWx1ZShvYmplY3QsCmtleSxuZXdWYWx1ZSl9ZnVuY3Rpb24gYmFzZU50aChhcnJheSxuKXt2YXIgbGVuZ3RoPWFycmF5Lmxlbmd0aDtpZighbGVuZ3RoKXJldHVybjtuKz1uPDA/bGVuZ3RoOjA7cmV0dXJuIGlzSW5kZXgobixsZW5ndGgpP2FycmF5W25dOnVuZGVmaW5lZH1mdW5jdGlvbiBiYXNlT3JkZXJCeShjb2xsZWN0aW9uLGl0ZXJhdGVlcyxvcmRlcnMpe3ZhciBpbmRleD0tMTtpdGVyYXRlZXM9YXJyYXlNYXAoaXRlcmF0ZWVzLmxlbmd0aD9pdGVyYXRlZXM6W2lkZW50aXR5XSxiYXNlVW5hcnkoZ2V0SXRlcmF0ZWUoKSkpO3ZhciByZXN1bHQ9YmFzZU1hcChjb2xsZWN0aW9uLGZ1bmN0aW9uKHZhbHVlLGtleSxjb2xsZWN0aW9uKXt2YXIgY3JpdGVyaWE9YXJyYXlNYXAoaXRlcmF0ZWVzLGZ1bmN0aW9uKGl0ZXJhdGVlKXtyZXR1cm4gaXRlcmF0ZWUodmFsdWUpfSk7cmV0dXJueyJjcml0ZXJpYSI6Y3JpdGVyaWEsImluZGV4IjorK2luZGV4LCJ2YWx1ZSI6dmFsdWV9fSk7cmV0dXJuIGJhc2VTb3J0QnkocmVzdWx0LApmdW5jdGlvbihvYmplY3Qsb3RoZXIpe3JldHVybiBjb21wYXJlTXVsdGlwbGUob2JqZWN0LG90aGVyLG9yZGVycyl9KX1mdW5jdGlvbiBiYXNlUGljayhvYmplY3QscGF0aHMpe3JldHVybiBiYXNlUGlja0J5KG9iamVjdCxwYXRocyxmdW5jdGlvbih2YWx1ZSxwYXRoKXtyZXR1cm4gaGFzSW4ob2JqZWN0LHBhdGgpfSl9ZnVuY3Rpb24gYmFzZVBpY2tCeShvYmplY3QscGF0aHMscHJlZGljYXRlKXt2YXIgaW5kZXg9LTEsbGVuZ3RoPXBhdGhzLmxlbmd0aCxyZXN1bHQ9e307d2hpbGUoKytpbmRleDxsZW5ndGgpe3ZhciBwYXRoPXBhdGhzW2luZGV4XSx2YWx1ZT1iYXNlR2V0KG9iamVjdCxwYXRoKTtpZihwcmVkaWNhdGUodmFsdWUscGF0aCkpYmFzZVNldChyZXN1bHQsY2FzdFBhdGgocGF0aCxvYmplY3QpLHZhbHVlKX1yZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGJhc2VQcm9wZXJ0eURlZXAocGF0aCl7cmV0dXJuIGZ1bmN0aW9uKG9iamVjdCl7cmV0dXJuIGJhc2VHZXQob2JqZWN0LHBhdGgpfX0KZnVuY3Rpb24gYmFzZVB1bGxBbGwoYXJyYXksdmFsdWVzLGl0ZXJhdGVlLGNvbXBhcmF0b3Ipe3ZhciBpbmRleE9mPWNvbXBhcmF0b3I/YmFzZUluZGV4T2ZXaXRoOmJhc2VJbmRleE9mLGluZGV4PS0xLGxlbmd0aD12YWx1ZXMubGVuZ3RoLHNlZW49YXJyYXk7aWYoYXJyYXk9PT12YWx1ZXMpdmFsdWVzPWNvcHlBcnJheSh2YWx1ZXMpO2lmKGl0ZXJhdGVlKXNlZW49YXJyYXlNYXAoYXJyYXksYmFzZVVuYXJ5KGl0ZXJhdGVlKSk7d2hpbGUoKytpbmRleDxsZW5ndGgpe3ZhciBmcm9tSW5kZXg9MCx2YWx1ZT12YWx1ZXNbaW5kZXhdLGNvbXB1dGVkPWl0ZXJhdGVlP2l0ZXJhdGVlKHZhbHVlKTp2YWx1ZTt3aGlsZSgoZnJvbUluZGV4PWluZGV4T2Yoc2Vlbixjb21wdXRlZCxmcm9tSW5kZXgsY29tcGFyYXRvcikpPi0xKXtpZihzZWVuIT09YXJyYXkpc3BsaWNlLmNhbGwoc2Vlbixmcm9tSW5kZXgsMSk7c3BsaWNlLmNhbGwoYXJyYXksZnJvbUluZGV4LDEpfX1yZXR1cm4gYXJyYXl9ZnVuY3Rpb24gYmFzZVB1bGxBdChhcnJheSwKaW5kZXhlcyl7dmFyIGxlbmd0aD1hcnJheT9pbmRleGVzLmxlbmd0aDowLGxhc3RJbmRleD1sZW5ndGgtMTt3aGlsZShsZW5ndGgtLSl7dmFyIGluZGV4PWluZGV4ZXNbbGVuZ3RoXTtpZihsZW5ndGg9PWxhc3RJbmRleHx8aW5kZXghPT1wcmV2aW91cyl7dmFyIHByZXZpb3VzPWluZGV4O2lmKGlzSW5kZXgoaW5kZXgpKXNwbGljZS5jYWxsKGFycmF5LGluZGV4LDEpO2Vsc2UgYmFzZVVuc2V0KGFycmF5LGluZGV4KX19cmV0dXJuIGFycmF5fWZ1bmN0aW9uIGJhc2VSYW5kb20obG93ZXIsdXBwZXIpe3JldHVybiBsb3dlcituYXRpdmVGbG9vcihuYXRpdmVSYW5kb20oKSoodXBwZXItbG93ZXIrMSkpfWZ1bmN0aW9uIGJhc2VSYW5nZShzdGFydCxlbmQsc3RlcCxmcm9tUmlnaHQpe3ZhciBpbmRleD0tMSxsZW5ndGg9bmF0aXZlTWF4KG5hdGl2ZUNlaWwoKGVuZC1zdGFydCkvKHN0ZXB8fDEpKSwwKSxyZXN1bHQ9QXJyYXkobGVuZ3RoKTt3aGlsZShsZW5ndGgtLSl7cmVzdWx0W2Zyb21SaWdodD8KbGVuZ3RoOisraW5kZXhdPXN0YXJ0O3N0YXJ0Kz1zdGVwfXJldHVybiByZXN1bHR9ZnVuY3Rpb24gYmFzZVJlcGVhdChzdHJpbmcsbil7dmFyIHJlc3VsdD0iIjtpZighc3RyaW5nfHxuPDF8fG4+TUFYX1NBRkVfSU5URUdFUilyZXR1cm4gcmVzdWx0O2Rve2lmKG4lMilyZXN1bHQrPXN0cmluZztuPW5hdGl2ZUZsb29yKG4vMik7aWYobilzdHJpbmcrPXN0cmluZ313aGlsZShuKTtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGJhc2VSZXN0KGZ1bmMsc3RhcnQpe3JldHVybiBzZXRUb1N0cmluZyhvdmVyUmVzdChmdW5jLHN0YXJ0LGlkZW50aXR5KSxmdW5jKyIiKX1mdW5jdGlvbiBiYXNlU2FtcGxlKGNvbGxlY3Rpb24pe3JldHVybiBhcnJheVNhbXBsZSh2YWx1ZXMoY29sbGVjdGlvbikpfWZ1bmN0aW9uIGJhc2VTYW1wbGVTaXplKGNvbGxlY3Rpb24sbil7dmFyIGFycmF5PXZhbHVlcyhjb2xsZWN0aW9uKTtyZXR1cm4gc2h1ZmZsZVNlbGYoYXJyYXksYmFzZUNsYW1wKG4sMCxhcnJheS5sZW5ndGgpKX0KZnVuY3Rpb24gYmFzZVNldChvYmplY3QscGF0aCx2YWx1ZSxjdXN0b21pemVyKXtpZighaXNPYmplY3Qob2JqZWN0KSlyZXR1cm4gb2JqZWN0O3BhdGg9Y2FzdFBhdGgocGF0aCxvYmplY3QpO3ZhciBpbmRleD0tMSxsZW5ndGg9cGF0aC5sZW5ndGgsbGFzdEluZGV4PWxlbmd0aC0xLG5lc3RlZD1vYmplY3Q7d2hpbGUobmVzdGVkIT1udWxsJiYrK2luZGV4PGxlbmd0aCl7dmFyIGtleT10b0tleShwYXRoW2luZGV4XSksbmV3VmFsdWU9dmFsdWU7aWYoaW5kZXghPWxhc3RJbmRleCl7dmFyIG9ialZhbHVlPW5lc3RlZFtrZXldO25ld1ZhbHVlPWN1c3RvbWl6ZXI/Y3VzdG9taXplcihvYmpWYWx1ZSxrZXksbmVzdGVkKTp1bmRlZmluZWQ7aWYobmV3VmFsdWU9PT11bmRlZmluZWQpbmV3VmFsdWU9aXNPYmplY3Qob2JqVmFsdWUpP29ialZhbHVlOmlzSW5kZXgocGF0aFtpbmRleCsxXSk/W106e319YXNzaWduVmFsdWUobmVzdGVkLGtleSxuZXdWYWx1ZSk7bmVzdGVkPW5lc3RlZFtrZXldfXJldHVybiBvYmplY3R9CnZhciBiYXNlU2V0RGF0YT0hbWV0YU1hcD9pZGVudGl0eTpmdW5jdGlvbihmdW5jLGRhdGEpe21ldGFNYXAuc2V0KGZ1bmMsZGF0YSk7cmV0dXJuIGZ1bmN9O3ZhciBiYXNlU2V0VG9TdHJpbmc9IWRlZmluZVByb3BlcnR5P2lkZW50aXR5OmZ1bmN0aW9uKGZ1bmMsc3RyaW5nKXtyZXR1cm4gZGVmaW5lUHJvcGVydHkoZnVuYywidG9TdHJpbmciLHsiY29uZmlndXJhYmxlIjp0cnVlLCJlbnVtZXJhYmxlIjpmYWxzZSwidmFsdWUiOmNvbnN0YW50KHN0cmluZyksIndyaXRhYmxlIjp0cnVlfSl9O2Z1bmN0aW9uIGJhc2VTaHVmZmxlKGNvbGxlY3Rpb24pe3JldHVybiBzaHVmZmxlU2VsZih2YWx1ZXMoY29sbGVjdGlvbikpfWZ1bmN0aW9uIGJhc2VTbGljZShhcnJheSxzdGFydCxlbmQpe3ZhciBpbmRleD0tMSxsZW5ndGg9YXJyYXkubGVuZ3RoO2lmKHN0YXJ0PDApc3RhcnQ9LXN0YXJ0Pmxlbmd0aD8wOmxlbmd0aCtzdGFydDtlbmQ9ZW5kPmxlbmd0aD9sZW5ndGg6ZW5kO2lmKGVuZDwwKWVuZCs9Cmxlbmd0aDtsZW5ndGg9c3RhcnQ+ZW5kPzA6ZW5kLXN0YXJ0Pj4+MDtzdGFydD4+Pj0wO3ZhciByZXN1bHQ9QXJyYXkobGVuZ3RoKTt3aGlsZSgrK2luZGV4PGxlbmd0aClyZXN1bHRbaW5kZXhdPWFycmF5W2luZGV4K3N0YXJ0XTtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGJhc2VTb21lKGNvbGxlY3Rpb24scHJlZGljYXRlKXt2YXIgcmVzdWx0O2Jhc2VFYWNoKGNvbGxlY3Rpb24sZnVuY3Rpb24odmFsdWUsaW5kZXgsY29sbGVjdGlvbil7cmVzdWx0PXByZWRpY2F0ZSh2YWx1ZSxpbmRleCxjb2xsZWN0aW9uKTtyZXR1cm4hcmVzdWx0fSk7cmV0dXJuISFyZXN1bHR9ZnVuY3Rpb24gYmFzZVNvcnRlZEluZGV4KGFycmF5LHZhbHVlLHJldEhpZ2hlc3Qpe3ZhciBsb3c9MCxoaWdoPWFycmF5PT1udWxsP2xvdzphcnJheS5sZW5ndGg7aWYodHlwZW9mIHZhbHVlPT0ibnVtYmVyIiYmdmFsdWU9PT12YWx1ZSYmaGlnaDw9SEFMRl9NQVhfQVJSQVlfTEVOR1RIKXt3aGlsZShsb3c8aGlnaCl7dmFyIG1pZD0KbG93K2hpZ2g+Pj4xLGNvbXB1dGVkPWFycmF5W21pZF07aWYoY29tcHV0ZWQhPT1udWxsJiYhaXNTeW1ib2woY29tcHV0ZWQpJiYocmV0SGlnaGVzdD9jb21wdXRlZDw9dmFsdWU6Y29tcHV0ZWQ8dmFsdWUpKWxvdz1taWQrMTtlbHNlIGhpZ2g9bWlkfXJldHVybiBoaWdofXJldHVybiBiYXNlU29ydGVkSW5kZXhCeShhcnJheSx2YWx1ZSxpZGVudGl0eSxyZXRIaWdoZXN0KX1mdW5jdGlvbiBiYXNlU29ydGVkSW5kZXhCeShhcnJheSx2YWx1ZSxpdGVyYXRlZSxyZXRIaWdoZXN0KXt2YWx1ZT1pdGVyYXRlZSh2YWx1ZSk7dmFyIGxvdz0wLGhpZ2g9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGgsdmFsSXNOYU49dmFsdWUhPT12YWx1ZSx2YWxJc051bGw9dmFsdWU9PT1udWxsLHZhbElzU3ltYm9sPWlzU3ltYm9sKHZhbHVlKSx2YWxJc1VuZGVmaW5lZD12YWx1ZT09PXVuZGVmaW5lZDt3aGlsZShsb3c8aGlnaCl7dmFyIG1pZD1uYXRpdmVGbG9vcigobG93K2hpZ2gpLzIpLGNvbXB1dGVkPQppdGVyYXRlZShhcnJheVttaWRdKSxvdGhJc0RlZmluZWQ9Y29tcHV0ZWQhPT11bmRlZmluZWQsb3RoSXNOdWxsPWNvbXB1dGVkPT09bnVsbCxvdGhJc1JlZmxleGl2ZT1jb21wdXRlZD09PWNvbXB1dGVkLG90aElzU3ltYm9sPWlzU3ltYm9sKGNvbXB1dGVkKTtpZih2YWxJc05hTil2YXIgc2V0TG93PXJldEhpZ2hlc3R8fG90aElzUmVmbGV4aXZlO2Vsc2UgaWYodmFsSXNVbmRlZmluZWQpc2V0TG93PW90aElzUmVmbGV4aXZlJiYocmV0SGlnaGVzdHx8b3RoSXNEZWZpbmVkKTtlbHNlIGlmKHZhbElzTnVsbClzZXRMb3c9b3RoSXNSZWZsZXhpdmUmJm90aElzRGVmaW5lZCYmKHJldEhpZ2hlc3R8fCFvdGhJc051bGwpO2Vsc2UgaWYodmFsSXNTeW1ib2wpc2V0TG93PW90aElzUmVmbGV4aXZlJiZvdGhJc0RlZmluZWQmJiFvdGhJc051bGwmJihyZXRIaWdoZXN0fHwhb3RoSXNTeW1ib2wpO2Vsc2UgaWYob3RoSXNOdWxsfHxvdGhJc1N5bWJvbClzZXRMb3c9ZmFsc2U7ZWxzZSBzZXRMb3c9CnJldEhpZ2hlc3Q/Y29tcHV0ZWQ8PXZhbHVlOmNvbXB1dGVkPHZhbHVlO2lmKHNldExvdylsb3c9bWlkKzE7ZWxzZSBoaWdoPW1pZH1yZXR1cm4gbmF0aXZlTWluKGhpZ2gsTUFYX0FSUkFZX0lOREVYKX1mdW5jdGlvbiBiYXNlU29ydGVkVW5pcShhcnJheSxpdGVyYXRlZSl7dmFyIGluZGV4PS0xLGxlbmd0aD1hcnJheS5sZW5ndGgscmVzSW5kZXg9MCxyZXN1bHQ9W107d2hpbGUoKytpbmRleDxsZW5ndGgpe3ZhciB2YWx1ZT1hcnJheVtpbmRleF0sY29tcHV0ZWQ9aXRlcmF0ZWU/aXRlcmF0ZWUodmFsdWUpOnZhbHVlO2lmKCFpbmRleHx8IWVxKGNvbXB1dGVkLHNlZW4pKXt2YXIgc2Vlbj1jb21wdXRlZDtyZXN1bHRbcmVzSW5kZXgrK109dmFsdWU9PT0wPzA6dmFsdWV9fXJldHVybiByZXN1bHR9ZnVuY3Rpb24gYmFzZVRvTnVtYmVyKHZhbHVlKXtpZih0eXBlb2YgdmFsdWU9PSJudW1iZXIiKXJldHVybiB2YWx1ZTtpZihpc1N5bWJvbCh2YWx1ZSkpcmV0dXJuIE5BTjtyZXR1cm4rdmFsdWV9CmZ1bmN0aW9uIGJhc2VUb1N0cmluZyh2YWx1ZSl7aWYodHlwZW9mIHZhbHVlPT0ic3RyaW5nIilyZXR1cm4gdmFsdWU7aWYoaXNBcnJheSh2YWx1ZSkpcmV0dXJuIGFycmF5TWFwKHZhbHVlLGJhc2VUb1N0cmluZykrIiI7aWYoaXNTeW1ib2wodmFsdWUpKXJldHVybiBzeW1ib2xUb1N0cmluZz9zeW1ib2xUb1N0cmluZy5jYWxsKHZhbHVlKToiIjt2YXIgcmVzdWx0PXZhbHVlKyIiO3JldHVybiByZXN1bHQ9PSIwIiYmMS92YWx1ZT09LUlORklOSVRZPyItMCI6cmVzdWx0fWZ1bmN0aW9uIGJhc2VVbmlxKGFycmF5LGl0ZXJhdGVlLGNvbXBhcmF0b3Ipe3ZhciBpbmRleD0tMSxpbmNsdWRlcz1hcnJheUluY2x1ZGVzLGxlbmd0aD1hcnJheS5sZW5ndGgsaXNDb21tb249dHJ1ZSxyZXN1bHQ9W10sc2Vlbj1yZXN1bHQ7aWYoY29tcGFyYXRvcil7aXNDb21tb249ZmFsc2U7aW5jbHVkZXM9YXJyYXlJbmNsdWRlc1dpdGh9ZWxzZSBpZihsZW5ndGg+PUxBUkdFX0FSUkFZX1NJWkUpe3ZhciBzZXQ9Cml0ZXJhdGVlP251bGw6Y3JlYXRlU2V0KGFycmF5KTtpZihzZXQpcmV0dXJuIHNldFRvQXJyYXkoc2V0KTtpc0NvbW1vbj1mYWxzZTtpbmNsdWRlcz1jYWNoZUhhcztzZWVuPW5ldyBTZXRDYWNoZX1lbHNlIHNlZW49aXRlcmF0ZWU/W106cmVzdWx0O291dGVyOndoaWxlKCsraW5kZXg8bGVuZ3RoKXt2YXIgdmFsdWU9YXJyYXlbaW5kZXhdLGNvbXB1dGVkPWl0ZXJhdGVlP2l0ZXJhdGVlKHZhbHVlKTp2YWx1ZTt2YWx1ZT1jb21wYXJhdG9yfHx2YWx1ZSE9PTA/dmFsdWU6MDtpZihpc0NvbW1vbiYmY29tcHV0ZWQ9PT1jb21wdXRlZCl7dmFyIHNlZW5JbmRleD1zZWVuLmxlbmd0aDt3aGlsZShzZWVuSW5kZXgtLSlpZihzZWVuW3NlZW5JbmRleF09PT1jb21wdXRlZCljb250aW51ZSBvdXRlcjtpZihpdGVyYXRlZSlzZWVuLnB1c2goY29tcHV0ZWQpO3Jlc3VsdC5wdXNoKHZhbHVlKX1lbHNlIGlmKCFpbmNsdWRlcyhzZWVuLGNvbXB1dGVkLGNvbXBhcmF0b3IpKXtpZihzZWVuIT09cmVzdWx0KXNlZW4ucHVzaChjb21wdXRlZCk7CnJlc3VsdC5wdXNoKHZhbHVlKX19cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBiYXNlVW5zZXQob2JqZWN0LHBhdGgpe3BhdGg9Y2FzdFBhdGgocGF0aCxvYmplY3QpO29iamVjdD1wYXJlbnQob2JqZWN0LHBhdGgpO3JldHVybiBvYmplY3Q9PW51bGx8fGRlbGV0ZSBvYmplY3RbdG9LZXkobGFzdChwYXRoKSldfWZ1bmN0aW9uIGJhc2VVcGRhdGUob2JqZWN0LHBhdGgsdXBkYXRlcixjdXN0b21pemVyKXtyZXR1cm4gYmFzZVNldChvYmplY3QscGF0aCx1cGRhdGVyKGJhc2VHZXQob2JqZWN0LHBhdGgpKSxjdXN0b21pemVyKX1mdW5jdGlvbiBiYXNlV2hpbGUoYXJyYXkscHJlZGljYXRlLGlzRHJvcCxmcm9tUmlnaHQpe3ZhciBsZW5ndGg9YXJyYXkubGVuZ3RoLGluZGV4PWZyb21SaWdodD9sZW5ndGg6LTE7d2hpbGUoKGZyb21SaWdodD9pbmRleC0tOisraW5kZXg8bGVuZ3RoKSYmcHJlZGljYXRlKGFycmF5W2luZGV4XSxpbmRleCxhcnJheSkpO3JldHVybiBpc0Ryb3A/YmFzZVNsaWNlKGFycmF5LApmcm9tUmlnaHQ/MDppbmRleCxmcm9tUmlnaHQ/aW5kZXgrMTpsZW5ndGgpOmJhc2VTbGljZShhcnJheSxmcm9tUmlnaHQ/aW5kZXgrMTowLGZyb21SaWdodD9sZW5ndGg6aW5kZXgpfWZ1bmN0aW9uIGJhc2VXcmFwcGVyVmFsdWUodmFsdWUsYWN0aW9ucyl7dmFyIHJlc3VsdD12YWx1ZTtpZihyZXN1bHQgaW5zdGFuY2VvZiBMYXp5V3JhcHBlcilyZXN1bHQ9cmVzdWx0LnZhbHVlKCk7cmV0dXJuIGFycmF5UmVkdWNlKGFjdGlvbnMsZnVuY3Rpb24ocmVzdWx0LGFjdGlvbil7cmV0dXJuIGFjdGlvbi5mdW5jLmFwcGx5KGFjdGlvbi50aGlzQXJnLGFycmF5UHVzaChbcmVzdWx0XSxhY3Rpb24uYXJncykpfSxyZXN1bHQpfWZ1bmN0aW9uIGJhc2VYb3IoYXJyYXlzLGl0ZXJhdGVlLGNvbXBhcmF0b3Ipe3ZhciBsZW5ndGg9YXJyYXlzLmxlbmd0aDtpZihsZW5ndGg8MilyZXR1cm4gbGVuZ3RoP2Jhc2VVbmlxKGFycmF5c1swXSk6W107dmFyIGluZGV4PS0xLHJlc3VsdD1BcnJheShsZW5ndGgpOwp3aGlsZSgrK2luZGV4PGxlbmd0aCl7dmFyIGFycmF5PWFycmF5c1tpbmRleF0sb3RoSW5kZXg9LTE7d2hpbGUoKytvdGhJbmRleDxsZW5ndGgpaWYob3RoSW5kZXghPWluZGV4KXJlc3VsdFtpbmRleF09YmFzZURpZmZlcmVuY2UocmVzdWx0W2luZGV4XXx8YXJyYXksYXJyYXlzW290aEluZGV4XSxpdGVyYXRlZSxjb21wYXJhdG9yKX1yZXR1cm4gYmFzZVVuaXEoYmFzZUZsYXR0ZW4ocmVzdWx0LDEpLGl0ZXJhdGVlLGNvbXBhcmF0b3IpfWZ1bmN0aW9uIGJhc2VaaXBPYmplY3QocHJvcHMsdmFsdWVzLGFzc2lnbkZ1bmMpe3ZhciBpbmRleD0tMSxsZW5ndGg9cHJvcHMubGVuZ3RoLHZhbHNMZW5ndGg9dmFsdWVzLmxlbmd0aCxyZXN1bHQ9e307d2hpbGUoKytpbmRleDxsZW5ndGgpe3ZhciB2YWx1ZT1pbmRleDx2YWxzTGVuZ3RoP3ZhbHVlc1tpbmRleF06dW5kZWZpbmVkO2Fzc2lnbkZ1bmMocmVzdWx0LHByb3BzW2luZGV4XSx2YWx1ZSl9cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBjYXN0QXJyYXlMaWtlT2JqZWN0KHZhbHVlKXtyZXR1cm4gaXNBcnJheUxpa2VPYmplY3QodmFsdWUpPwp2YWx1ZTpbXX1mdW5jdGlvbiBjYXN0RnVuY3Rpb24odmFsdWUpe3JldHVybiB0eXBlb2YgdmFsdWU9PSJmdW5jdGlvbiI/dmFsdWU6aWRlbnRpdHl9ZnVuY3Rpb24gY2FzdFBhdGgodmFsdWUsb2JqZWN0KXtpZihpc0FycmF5KHZhbHVlKSlyZXR1cm4gdmFsdWU7cmV0dXJuIGlzS2V5KHZhbHVlLG9iamVjdCk/W3ZhbHVlXTpzdHJpbmdUb1BhdGgodG9TdHJpbmcodmFsdWUpKX12YXIgY2FzdFJlc3Q9YmFzZVJlc3Q7ZnVuY3Rpb24gY2FzdFNsaWNlKGFycmF5LHN0YXJ0LGVuZCl7dmFyIGxlbmd0aD1hcnJheS5sZW5ndGg7ZW5kPWVuZD09PXVuZGVmaW5lZD9sZW5ndGg6ZW5kO3JldHVybiFzdGFydCYmZW5kPj1sZW5ndGg/YXJyYXk6YmFzZVNsaWNlKGFycmF5LHN0YXJ0LGVuZCl9dmFyIGNsZWFyVGltZW91dD1jdHhDbGVhclRpbWVvdXR8fGZ1bmN0aW9uKGlkKXtyZXR1cm4gcm9vdC5jbGVhclRpbWVvdXQoaWQpfTtmdW5jdGlvbiBjbG9uZUJ1ZmZlcihidWZmZXIsaXNEZWVwKXtpZihpc0RlZXApcmV0dXJuIGJ1ZmZlci5zbGljZSgpOwp2YXIgbGVuZ3RoPWJ1ZmZlci5sZW5ndGgscmVzdWx0PWFsbG9jVW5zYWZlP2FsbG9jVW5zYWZlKGxlbmd0aCk6bmV3IGJ1ZmZlci5jb25zdHJ1Y3RvcihsZW5ndGgpO2J1ZmZlci5jb3B5KHJlc3VsdCk7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBjbG9uZUFycmF5QnVmZmVyKGFycmF5QnVmZmVyKXt2YXIgcmVzdWx0PW5ldyBhcnJheUJ1ZmZlci5jb25zdHJ1Y3RvcihhcnJheUJ1ZmZlci5ieXRlTGVuZ3RoKTsobmV3IFVpbnQ4QXJyYXkocmVzdWx0KSkuc2V0KG5ldyBVaW50OEFycmF5KGFycmF5QnVmZmVyKSk7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBjbG9uZURhdGFWaWV3KGRhdGFWaWV3LGlzRGVlcCl7dmFyIGJ1ZmZlcj1pc0RlZXA/Y2xvbmVBcnJheUJ1ZmZlcihkYXRhVmlldy5idWZmZXIpOmRhdGFWaWV3LmJ1ZmZlcjtyZXR1cm4gbmV3IGRhdGFWaWV3LmNvbnN0cnVjdG9yKGJ1ZmZlcixkYXRhVmlldy5ieXRlT2Zmc2V0LGRhdGFWaWV3LmJ5dGVMZW5ndGgpfWZ1bmN0aW9uIGNsb25lUmVnRXhwKHJlZ2V4cCl7dmFyIHJlc3VsdD0KbmV3IHJlZ2V4cC5jb25zdHJ1Y3RvcihyZWdleHAuc291cmNlLHJlRmxhZ3MuZXhlYyhyZWdleHApKTtyZXN1bHQubGFzdEluZGV4PXJlZ2V4cC5sYXN0SW5kZXg7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBjbG9uZVN5bWJvbChzeW1ib2wpe3JldHVybiBzeW1ib2xWYWx1ZU9mP09iamVjdChzeW1ib2xWYWx1ZU9mLmNhbGwoc3ltYm9sKSk6e319ZnVuY3Rpb24gY2xvbmVUeXBlZEFycmF5KHR5cGVkQXJyYXksaXNEZWVwKXt2YXIgYnVmZmVyPWlzRGVlcD9jbG9uZUFycmF5QnVmZmVyKHR5cGVkQXJyYXkuYnVmZmVyKTp0eXBlZEFycmF5LmJ1ZmZlcjtyZXR1cm4gbmV3IHR5cGVkQXJyYXkuY29uc3RydWN0b3IoYnVmZmVyLHR5cGVkQXJyYXkuYnl0ZU9mZnNldCx0eXBlZEFycmF5Lmxlbmd0aCl9ZnVuY3Rpb24gY29tcGFyZUFzY2VuZGluZyh2YWx1ZSxvdGhlcil7aWYodmFsdWUhPT1vdGhlcil7dmFyIHZhbElzRGVmaW5lZD12YWx1ZSE9PXVuZGVmaW5lZCx2YWxJc051bGw9dmFsdWU9PT0KbnVsbCx2YWxJc1JlZmxleGl2ZT12YWx1ZT09PXZhbHVlLHZhbElzU3ltYm9sPWlzU3ltYm9sKHZhbHVlKTt2YXIgb3RoSXNEZWZpbmVkPW90aGVyIT09dW5kZWZpbmVkLG90aElzTnVsbD1vdGhlcj09PW51bGwsb3RoSXNSZWZsZXhpdmU9b3RoZXI9PT1vdGhlcixvdGhJc1N5bWJvbD1pc1N5bWJvbChvdGhlcik7aWYoIW90aElzTnVsbCYmIW90aElzU3ltYm9sJiYhdmFsSXNTeW1ib2wmJnZhbHVlPm90aGVyfHx2YWxJc1N5bWJvbCYmb3RoSXNEZWZpbmVkJiZvdGhJc1JlZmxleGl2ZSYmIW90aElzTnVsbCYmIW90aElzU3ltYm9sfHx2YWxJc051bGwmJm90aElzRGVmaW5lZCYmb3RoSXNSZWZsZXhpdmV8fCF2YWxJc0RlZmluZWQmJm90aElzUmVmbGV4aXZlfHwhdmFsSXNSZWZsZXhpdmUpcmV0dXJuIDE7aWYoIXZhbElzTnVsbCYmIXZhbElzU3ltYm9sJiYhb3RoSXNTeW1ib2wmJnZhbHVlPG90aGVyfHxvdGhJc1N5bWJvbCYmdmFsSXNEZWZpbmVkJiZ2YWxJc1JlZmxleGl2ZSYmIXZhbElzTnVsbCYmCiF2YWxJc1N5bWJvbHx8b3RoSXNOdWxsJiZ2YWxJc0RlZmluZWQmJnZhbElzUmVmbGV4aXZlfHwhb3RoSXNEZWZpbmVkJiZ2YWxJc1JlZmxleGl2ZXx8IW90aElzUmVmbGV4aXZlKXJldHVybi0xfXJldHVybiAwfWZ1bmN0aW9uIGNvbXBhcmVNdWx0aXBsZShvYmplY3Qsb3RoZXIsb3JkZXJzKXt2YXIgaW5kZXg9LTEsb2JqQ3JpdGVyaWE9b2JqZWN0LmNyaXRlcmlhLG90aENyaXRlcmlhPW90aGVyLmNyaXRlcmlhLGxlbmd0aD1vYmpDcml0ZXJpYS5sZW5ndGgsb3JkZXJzTGVuZ3RoPW9yZGVycy5sZW5ndGg7d2hpbGUoKytpbmRleDxsZW5ndGgpe3ZhciByZXN1bHQ9Y29tcGFyZUFzY2VuZGluZyhvYmpDcml0ZXJpYVtpbmRleF0sb3RoQ3JpdGVyaWFbaW5kZXhdKTtpZihyZXN1bHQpe2lmKGluZGV4Pj1vcmRlcnNMZW5ndGgpcmV0dXJuIHJlc3VsdDt2YXIgb3JkZXI9b3JkZXJzW2luZGV4XTtyZXR1cm4gcmVzdWx0KihvcmRlcj09ImRlc2MiPy0xOjEpfX1yZXR1cm4gb2JqZWN0LmluZGV4LQpvdGhlci5pbmRleH1mdW5jdGlvbiBjb21wb3NlQXJncyhhcmdzLHBhcnRpYWxzLGhvbGRlcnMsaXNDdXJyaWVkKXt2YXIgYXJnc0luZGV4PS0xLGFyZ3NMZW5ndGg9YXJncy5sZW5ndGgsaG9sZGVyc0xlbmd0aD1ob2xkZXJzLmxlbmd0aCxsZWZ0SW5kZXg9LTEsbGVmdExlbmd0aD1wYXJ0aWFscy5sZW5ndGgscmFuZ2VMZW5ndGg9bmF0aXZlTWF4KGFyZ3NMZW5ndGgtaG9sZGVyc0xlbmd0aCwwKSxyZXN1bHQ9QXJyYXkobGVmdExlbmd0aCtyYW5nZUxlbmd0aCksaXNVbmN1cnJpZWQ9IWlzQ3VycmllZDt3aGlsZSgrK2xlZnRJbmRleDxsZWZ0TGVuZ3RoKXJlc3VsdFtsZWZ0SW5kZXhdPXBhcnRpYWxzW2xlZnRJbmRleF07d2hpbGUoKythcmdzSW5kZXg8aG9sZGVyc0xlbmd0aClpZihpc1VuY3VycmllZHx8YXJnc0luZGV4PGFyZ3NMZW5ndGgpcmVzdWx0W2hvbGRlcnNbYXJnc0luZGV4XV09YXJnc1thcmdzSW5kZXhdO3doaWxlKHJhbmdlTGVuZ3RoLS0pcmVzdWx0W2xlZnRJbmRleCsrXT0KYXJnc1thcmdzSW5kZXgrK107cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBjb21wb3NlQXJnc1JpZ2h0KGFyZ3MscGFydGlhbHMsaG9sZGVycyxpc0N1cnJpZWQpe3ZhciBhcmdzSW5kZXg9LTEsYXJnc0xlbmd0aD1hcmdzLmxlbmd0aCxob2xkZXJzSW5kZXg9LTEsaG9sZGVyc0xlbmd0aD1ob2xkZXJzLmxlbmd0aCxyaWdodEluZGV4PS0xLHJpZ2h0TGVuZ3RoPXBhcnRpYWxzLmxlbmd0aCxyYW5nZUxlbmd0aD1uYXRpdmVNYXgoYXJnc0xlbmd0aC1ob2xkZXJzTGVuZ3RoLDApLHJlc3VsdD1BcnJheShyYW5nZUxlbmd0aCtyaWdodExlbmd0aCksaXNVbmN1cnJpZWQ9IWlzQ3VycmllZDt3aGlsZSgrK2FyZ3NJbmRleDxyYW5nZUxlbmd0aClyZXN1bHRbYXJnc0luZGV4XT1hcmdzW2FyZ3NJbmRleF07dmFyIG9mZnNldD1hcmdzSW5kZXg7d2hpbGUoKytyaWdodEluZGV4PHJpZ2h0TGVuZ3RoKXJlc3VsdFtvZmZzZXQrcmlnaHRJbmRleF09cGFydGlhbHNbcmlnaHRJbmRleF07d2hpbGUoKytob2xkZXJzSW5kZXg8CmhvbGRlcnNMZW5ndGgpaWYoaXNVbmN1cnJpZWR8fGFyZ3NJbmRleDxhcmdzTGVuZ3RoKXJlc3VsdFtvZmZzZXQraG9sZGVyc1tob2xkZXJzSW5kZXhdXT1hcmdzW2FyZ3NJbmRleCsrXTtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGNvcHlBcnJheShzb3VyY2UsYXJyYXkpe3ZhciBpbmRleD0tMSxsZW5ndGg9c291cmNlLmxlbmd0aDthcnJheXx8KGFycmF5PUFycmF5KGxlbmd0aCkpO3doaWxlKCsraW5kZXg8bGVuZ3RoKWFycmF5W2luZGV4XT1zb3VyY2VbaW5kZXhdO3JldHVybiBhcnJheX1mdW5jdGlvbiBjb3B5T2JqZWN0KHNvdXJjZSxwcm9wcyxvYmplY3QsY3VzdG9taXplcil7dmFyIGlzTmV3PSFvYmplY3Q7b2JqZWN0fHwob2JqZWN0PXt9KTt2YXIgaW5kZXg9LTEsbGVuZ3RoPXByb3BzLmxlbmd0aDt3aGlsZSgrK2luZGV4PGxlbmd0aCl7dmFyIGtleT1wcm9wc1tpbmRleF07dmFyIG5ld1ZhbHVlPWN1c3RvbWl6ZXI/Y3VzdG9taXplcihvYmplY3Rba2V5XSxzb3VyY2Vba2V5XSwKa2V5LG9iamVjdCxzb3VyY2UpOnVuZGVmaW5lZDtpZihuZXdWYWx1ZT09PXVuZGVmaW5lZCluZXdWYWx1ZT1zb3VyY2Vba2V5XTtpZihpc05ldyliYXNlQXNzaWduVmFsdWUob2JqZWN0LGtleSxuZXdWYWx1ZSk7ZWxzZSBhc3NpZ25WYWx1ZShvYmplY3Qsa2V5LG5ld1ZhbHVlKX1yZXR1cm4gb2JqZWN0fWZ1bmN0aW9uIGNvcHlTeW1ib2xzKHNvdXJjZSxvYmplY3Qpe3JldHVybiBjb3B5T2JqZWN0KHNvdXJjZSxnZXRTeW1ib2xzKHNvdXJjZSksb2JqZWN0KX1mdW5jdGlvbiBjb3B5U3ltYm9sc0luKHNvdXJjZSxvYmplY3Qpe3JldHVybiBjb3B5T2JqZWN0KHNvdXJjZSxnZXRTeW1ib2xzSW4oc291cmNlKSxvYmplY3QpfWZ1bmN0aW9uIGNyZWF0ZUFnZ3JlZ2F0b3Ioc2V0dGVyLGluaXRpYWxpemVyKXtyZXR1cm4gZnVuY3Rpb24oY29sbGVjdGlvbixpdGVyYXRlZSl7dmFyIGZ1bmM9aXNBcnJheShjb2xsZWN0aW9uKT9hcnJheUFnZ3JlZ2F0b3I6YmFzZUFnZ3JlZ2F0b3IsYWNjdW11bGF0b3I9CmluaXRpYWxpemVyP2luaXRpYWxpemVyKCk6e307cmV0dXJuIGZ1bmMoY29sbGVjdGlvbixzZXR0ZXIsZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsMiksYWNjdW11bGF0b3IpfX1mdW5jdGlvbiBjcmVhdGVBc3NpZ25lcihhc3NpZ25lcil7cmV0dXJuIGJhc2VSZXN0KGZ1bmN0aW9uKG9iamVjdCxzb3VyY2VzKXt2YXIgaW5kZXg9LTEsbGVuZ3RoPXNvdXJjZXMubGVuZ3RoLGN1c3RvbWl6ZXI9bGVuZ3RoPjE/c291cmNlc1tsZW5ndGgtMV06dW5kZWZpbmVkLGd1YXJkPWxlbmd0aD4yP3NvdXJjZXNbMl06dW5kZWZpbmVkO2N1c3RvbWl6ZXI9YXNzaWduZXIubGVuZ3RoPjMmJnR5cGVvZiBjdXN0b21pemVyPT0iZnVuY3Rpb24iPyhsZW5ndGgtLSxjdXN0b21pemVyKTp1bmRlZmluZWQ7aWYoZ3VhcmQmJmlzSXRlcmF0ZWVDYWxsKHNvdXJjZXNbMF0sc291cmNlc1sxXSxndWFyZCkpe2N1c3RvbWl6ZXI9bGVuZ3RoPDM/dW5kZWZpbmVkOmN1c3RvbWl6ZXI7bGVuZ3RoPTF9b2JqZWN0PU9iamVjdChvYmplY3QpOwp3aGlsZSgrK2luZGV4PGxlbmd0aCl7dmFyIHNvdXJjZT1zb3VyY2VzW2luZGV4XTtpZihzb3VyY2UpYXNzaWduZXIob2JqZWN0LHNvdXJjZSxpbmRleCxjdXN0b21pemVyKX1yZXR1cm4gb2JqZWN0fSl9ZnVuY3Rpb24gY3JlYXRlQmFzZUVhY2goZWFjaEZ1bmMsZnJvbVJpZ2h0KXtyZXR1cm4gZnVuY3Rpb24oY29sbGVjdGlvbixpdGVyYXRlZSl7aWYoY29sbGVjdGlvbj09bnVsbClyZXR1cm4gY29sbGVjdGlvbjtpZighaXNBcnJheUxpa2UoY29sbGVjdGlvbikpcmV0dXJuIGVhY2hGdW5jKGNvbGxlY3Rpb24saXRlcmF0ZWUpO3ZhciBsZW5ndGg9Y29sbGVjdGlvbi5sZW5ndGgsaW5kZXg9ZnJvbVJpZ2h0P2xlbmd0aDotMSxpdGVyYWJsZT1PYmplY3QoY29sbGVjdGlvbik7d2hpbGUoZnJvbVJpZ2h0P2luZGV4LS06KytpbmRleDxsZW5ndGgpaWYoaXRlcmF0ZWUoaXRlcmFibGVbaW5kZXhdLGluZGV4LGl0ZXJhYmxlKT09PWZhbHNlKWJyZWFrO3JldHVybiBjb2xsZWN0aW9ufX1mdW5jdGlvbiBjcmVhdGVCYXNlRm9yKGZyb21SaWdodCl7cmV0dXJuIGZ1bmN0aW9uKG9iamVjdCwKaXRlcmF0ZWUsa2V5c0Z1bmMpe3ZhciBpbmRleD0tMSxpdGVyYWJsZT1PYmplY3Qob2JqZWN0KSxwcm9wcz1rZXlzRnVuYyhvYmplY3QpLGxlbmd0aD1wcm9wcy5sZW5ndGg7d2hpbGUobGVuZ3RoLS0pe3ZhciBrZXk9cHJvcHNbZnJvbVJpZ2h0P2xlbmd0aDorK2luZGV4XTtpZihpdGVyYXRlZShpdGVyYWJsZVtrZXldLGtleSxpdGVyYWJsZSk9PT1mYWxzZSlicmVha31yZXR1cm4gb2JqZWN0fX1mdW5jdGlvbiBjcmVhdGVCaW5kKGZ1bmMsYml0bWFzayx0aGlzQXJnKXt2YXIgaXNCaW5kPWJpdG1hc2smV1JBUF9CSU5EX0ZMQUcsQ3Rvcj1jcmVhdGVDdG9yKGZ1bmMpO2Z1bmN0aW9uIHdyYXBwZXIoKXt2YXIgZm49dGhpcyYmdGhpcyE9PXJvb3QmJnRoaXMgaW5zdGFuY2VvZiB3cmFwcGVyP0N0b3I6ZnVuYztyZXR1cm4gZm4uYXBwbHkoaXNCaW5kP3RoaXNBcmc6dGhpcyxhcmd1bWVudHMpfXJldHVybiB3cmFwcGVyfWZ1bmN0aW9uIGNyZWF0ZUNhc2VGaXJzdChtZXRob2ROYW1lKXtyZXR1cm4gZnVuY3Rpb24oc3RyaW5nKXtzdHJpbmc9CnRvU3RyaW5nKHN0cmluZyk7dmFyIHN0clN5bWJvbHM9aGFzVW5pY29kZShzdHJpbmcpP3N0cmluZ1RvQXJyYXkoc3RyaW5nKTp1bmRlZmluZWQ7dmFyIGNocj1zdHJTeW1ib2xzP3N0clN5bWJvbHNbMF06c3RyaW5nLmNoYXJBdCgwKTt2YXIgdHJhaWxpbmc9c3RyU3ltYm9scz9jYXN0U2xpY2Uoc3RyU3ltYm9scywxKS5qb2luKCIiKTpzdHJpbmcuc2xpY2UoMSk7cmV0dXJuIGNoclttZXRob2ROYW1lXSgpK3RyYWlsaW5nfX1mdW5jdGlvbiBjcmVhdGVDb21wb3VuZGVyKGNhbGxiYWNrKXtyZXR1cm4gZnVuY3Rpb24oc3RyaW5nKXtyZXR1cm4gYXJyYXlSZWR1Y2Uod29yZHMoZGVidXJyKHN0cmluZykucmVwbGFjZShyZUFwb3MsIiIpKSxjYWxsYmFjaywiIil9fWZ1bmN0aW9uIGNyZWF0ZUN0b3IoQ3Rvcil7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGFyZ3M9YXJndW1lbnRzO3N3aXRjaChhcmdzLmxlbmd0aCl7Y2FzZSAwOnJldHVybiBuZXcgQ3RvcjtjYXNlIDE6cmV0dXJuIG5ldyBDdG9yKGFyZ3NbMF0pOwpjYXNlIDI6cmV0dXJuIG5ldyBDdG9yKGFyZ3NbMF0sYXJnc1sxXSk7Y2FzZSAzOnJldHVybiBuZXcgQ3RvcihhcmdzWzBdLGFyZ3NbMV0sYXJnc1syXSk7Y2FzZSA0OnJldHVybiBuZXcgQ3RvcihhcmdzWzBdLGFyZ3NbMV0sYXJnc1syXSxhcmdzWzNdKTtjYXNlIDU6cmV0dXJuIG5ldyBDdG9yKGFyZ3NbMF0sYXJnc1sxXSxhcmdzWzJdLGFyZ3NbM10sYXJnc1s0XSk7Y2FzZSA2OnJldHVybiBuZXcgQ3RvcihhcmdzWzBdLGFyZ3NbMV0sYXJnc1syXSxhcmdzWzNdLGFyZ3NbNF0sYXJnc1s1XSk7Y2FzZSA3OnJldHVybiBuZXcgQ3RvcihhcmdzWzBdLGFyZ3NbMV0sYXJnc1syXSxhcmdzWzNdLGFyZ3NbNF0sYXJnc1s1XSxhcmdzWzZdKX12YXIgdGhpc0JpbmRpbmc9YmFzZUNyZWF0ZShDdG9yLnByb3RvdHlwZSkscmVzdWx0PUN0b3IuYXBwbHkodGhpc0JpbmRpbmcsYXJncyk7cmV0dXJuIGlzT2JqZWN0KHJlc3VsdCk/cmVzdWx0OnRoaXNCaW5kaW5nfX1mdW5jdGlvbiBjcmVhdGVDdXJyeShmdW5jLApiaXRtYXNrLGFyaXR5KXt2YXIgQ3Rvcj1jcmVhdGVDdG9yKGZ1bmMpO2Z1bmN0aW9uIHdyYXBwZXIoKXt2YXIgbGVuZ3RoPWFyZ3VtZW50cy5sZW5ndGgsYXJncz1BcnJheShsZW5ndGgpLGluZGV4PWxlbmd0aCxwbGFjZWhvbGRlcj1nZXRIb2xkZXIod3JhcHBlcik7d2hpbGUoaW5kZXgtLSlhcmdzW2luZGV4XT1hcmd1bWVudHNbaW5kZXhdO3ZhciBob2xkZXJzPWxlbmd0aDwzJiZhcmdzWzBdIT09cGxhY2Vob2xkZXImJmFyZ3NbbGVuZ3RoLTFdIT09cGxhY2Vob2xkZXI/W106cmVwbGFjZUhvbGRlcnMoYXJncyxwbGFjZWhvbGRlcik7bGVuZ3RoLT1ob2xkZXJzLmxlbmd0aDtpZihsZW5ndGg8YXJpdHkpcmV0dXJuIGNyZWF0ZVJlY3VycnkoZnVuYyxiaXRtYXNrLGNyZWF0ZUh5YnJpZCx3cmFwcGVyLnBsYWNlaG9sZGVyLHVuZGVmaW5lZCxhcmdzLGhvbGRlcnMsdW5kZWZpbmVkLHVuZGVmaW5lZCxhcml0eS1sZW5ndGgpO3ZhciBmbj10aGlzJiZ0aGlzIT09cm9vdCYmdGhpcyBpbnN0YW5jZW9mCndyYXBwZXI/Q3RvcjpmdW5jO3JldHVybiBhcHBseShmbix0aGlzLGFyZ3MpfXJldHVybiB3cmFwcGVyfWZ1bmN0aW9uIGNyZWF0ZUZpbmQoZmluZEluZGV4RnVuYyl7cmV0dXJuIGZ1bmN0aW9uKGNvbGxlY3Rpb24scHJlZGljYXRlLGZyb21JbmRleCl7dmFyIGl0ZXJhYmxlPU9iamVjdChjb2xsZWN0aW9uKTtpZighaXNBcnJheUxpa2UoY29sbGVjdGlvbikpe3ZhciBpdGVyYXRlZT1nZXRJdGVyYXRlZShwcmVkaWNhdGUsMyk7Y29sbGVjdGlvbj1rZXlzKGNvbGxlY3Rpb24pO3ByZWRpY2F0ZT1mdW5jdGlvbihrZXkpe3JldHVybiBpdGVyYXRlZShpdGVyYWJsZVtrZXldLGtleSxpdGVyYWJsZSl9fXZhciBpbmRleD1maW5kSW5kZXhGdW5jKGNvbGxlY3Rpb24scHJlZGljYXRlLGZyb21JbmRleCk7cmV0dXJuIGluZGV4Pi0xP2l0ZXJhYmxlW2l0ZXJhdGVlP2NvbGxlY3Rpb25baW5kZXhdOmluZGV4XTp1bmRlZmluZWR9fWZ1bmN0aW9uIGNyZWF0ZUZsb3coZnJvbVJpZ2h0KXtyZXR1cm4gZmxhdFJlc3QoZnVuY3Rpb24oZnVuY3Mpe3ZhciBsZW5ndGg9CmZ1bmNzLmxlbmd0aCxpbmRleD1sZW5ndGgscHJlcmVxPUxvZGFzaFdyYXBwZXIucHJvdG90eXBlLnRocnU7aWYoZnJvbVJpZ2h0KWZ1bmNzLnJldmVyc2UoKTt3aGlsZShpbmRleC0tKXt2YXIgZnVuYz1mdW5jc1tpbmRleF07aWYodHlwZW9mIGZ1bmMhPSJmdW5jdGlvbiIpdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO2lmKHByZXJlcSYmIXdyYXBwZXImJmdldEZ1bmNOYW1lKGZ1bmMpPT0id3JhcHBlciIpdmFyIHdyYXBwZXI9bmV3IExvZGFzaFdyYXBwZXIoW10sdHJ1ZSl9aW5kZXg9d3JhcHBlcj9pbmRleDpsZW5ndGg7d2hpbGUoKytpbmRleDxsZW5ndGgpe2Z1bmM9ZnVuY3NbaW5kZXhdO3ZhciBmdW5jTmFtZT1nZXRGdW5jTmFtZShmdW5jKSxkYXRhPWZ1bmNOYW1lPT0id3JhcHBlciI/Z2V0RGF0YShmdW5jKTp1bmRlZmluZWQ7aWYoZGF0YSYmaXNMYXppYWJsZShkYXRhWzBdKSYmZGF0YVsxXT09KFdSQVBfQVJZX0ZMQUd8V1JBUF9DVVJSWV9GTEFHfFdSQVBfUEFSVElBTF9GTEFHfApXUkFQX1JFQVJHX0ZMQUcpJiYhZGF0YVs0XS5sZW5ndGgmJmRhdGFbOV09PTEpd3JhcHBlcj13cmFwcGVyW2dldEZ1bmNOYW1lKGRhdGFbMF0pXS5hcHBseSh3cmFwcGVyLGRhdGFbM10pO2Vsc2Ugd3JhcHBlcj1mdW5jLmxlbmd0aD09MSYmaXNMYXppYWJsZShmdW5jKT93cmFwcGVyW2Z1bmNOYW1lXSgpOndyYXBwZXIudGhydShmdW5jKX1yZXR1cm4gZnVuY3Rpb24oKXt2YXIgYXJncz1hcmd1bWVudHMsdmFsdWU9YXJnc1swXTtpZih3cmFwcGVyJiZhcmdzLmxlbmd0aD09MSYmaXNBcnJheSh2YWx1ZSkpcmV0dXJuIHdyYXBwZXIucGxhbnQodmFsdWUpLnZhbHVlKCk7dmFyIGluZGV4PTAscmVzdWx0PWxlbmd0aD9mdW5jc1tpbmRleF0uYXBwbHkodGhpcyxhcmdzKTp2YWx1ZTt3aGlsZSgrK2luZGV4PGxlbmd0aClyZXN1bHQ9ZnVuY3NbaW5kZXhdLmNhbGwodGhpcyxyZXN1bHQpO3JldHVybiByZXN1bHR9fSl9ZnVuY3Rpb24gY3JlYXRlSHlicmlkKGZ1bmMsYml0bWFzayx0aGlzQXJnLApwYXJ0aWFscyxob2xkZXJzLHBhcnRpYWxzUmlnaHQsaG9sZGVyc1JpZ2h0LGFyZ1BvcyxhcnksYXJpdHkpe3ZhciBpc0FyeT1iaXRtYXNrJldSQVBfQVJZX0ZMQUcsaXNCaW5kPWJpdG1hc2smV1JBUF9CSU5EX0ZMQUcsaXNCaW5kS2V5PWJpdG1hc2smV1JBUF9CSU5EX0tFWV9GTEFHLGlzQ3VycmllZD1iaXRtYXNrJihXUkFQX0NVUlJZX0ZMQUd8V1JBUF9DVVJSWV9SSUdIVF9GTEFHKSxpc0ZsaXA9Yml0bWFzayZXUkFQX0ZMSVBfRkxBRyxDdG9yPWlzQmluZEtleT91bmRlZmluZWQ6Y3JlYXRlQ3RvcihmdW5jKTtmdW5jdGlvbiB3cmFwcGVyKCl7dmFyIGxlbmd0aD1hcmd1bWVudHMubGVuZ3RoLGFyZ3M9QXJyYXkobGVuZ3RoKSxpbmRleD1sZW5ndGg7d2hpbGUoaW5kZXgtLSlhcmdzW2luZGV4XT1hcmd1bWVudHNbaW5kZXhdO2lmKGlzQ3VycmllZCl2YXIgcGxhY2Vob2xkZXI9Z2V0SG9sZGVyKHdyYXBwZXIpLGhvbGRlcnNDb3VudD1jb3VudEhvbGRlcnMoYXJncyxwbGFjZWhvbGRlcik7CmlmKHBhcnRpYWxzKWFyZ3M9Y29tcG9zZUFyZ3MoYXJncyxwYXJ0aWFscyxob2xkZXJzLGlzQ3VycmllZCk7aWYocGFydGlhbHNSaWdodClhcmdzPWNvbXBvc2VBcmdzUmlnaHQoYXJncyxwYXJ0aWFsc1JpZ2h0LGhvbGRlcnNSaWdodCxpc0N1cnJpZWQpO2xlbmd0aC09aG9sZGVyc0NvdW50O2lmKGlzQ3VycmllZCYmbGVuZ3RoPGFyaXR5KXt2YXIgbmV3SG9sZGVycz1yZXBsYWNlSG9sZGVycyhhcmdzLHBsYWNlaG9sZGVyKTtyZXR1cm4gY3JlYXRlUmVjdXJyeShmdW5jLGJpdG1hc2ssY3JlYXRlSHlicmlkLHdyYXBwZXIucGxhY2Vob2xkZXIsdGhpc0FyZyxhcmdzLG5ld0hvbGRlcnMsYXJnUG9zLGFyeSxhcml0eS1sZW5ndGgpfXZhciB0aGlzQmluZGluZz1pc0JpbmQ/dGhpc0FyZzp0aGlzLGZuPWlzQmluZEtleT90aGlzQmluZGluZ1tmdW5jXTpmdW5jO2xlbmd0aD1hcmdzLmxlbmd0aDtpZihhcmdQb3MpYXJncz1yZW9yZGVyKGFyZ3MsYXJnUG9zKTtlbHNlIGlmKGlzRmxpcCYmbGVuZ3RoPgoxKWFyZ3MucmV2ZXJzZSgpO2lmKGlzQXJ5JiZhcnk8bGVuZ3RoKWFyZ3MubGVuZ3RoPWFyeTtpZih0aGlzJiZ0aGlzIT09cm9vdCYmdGhpcyBpbnN0YW5jZW9mIHdyYXBwZXIpZm49Q3Rvcnx8Y3JlYXRlQ3Rvcihmbik7cmV0dXJuIGZuLmFwcGx5KHRoaXNCaW5kaW5nLGFyZ3MpfXJldHVybiB3cmFwcGVyfWZ1bmN0aW9uIGNyZWF0ZUludmVydGVyKHNldHRlcix0b0l0ZXJhdGVlKXtyZXR1cm4gZnVuY3Rpb24ob2JqZWN0LGl0ZXJhdGVlKXtyZXR1cm4gYmFzZUludmVydGVyKG9iamVjdCxzZXR0ZXIsdG9JdGVyYXRlZShpdGVyYXRlZSkse30pfX1mdW5jdGlvbiBjcmVhdGVNYXRoT3BlcmF0aW9uKG9wZXJhdG9yLGRlZmF1bHRWYWx1ZSl7cmV0dXJuIGZ1bmN0aW9uKHZhbHVlLG90aGVyKXt2YXIgcmVzdWx0O2lmKHZhbHVlPT09dW5kZWZpbmVkJiZvdGhlcj09PXVuZGVmaW5lZClyZXR1cm4gZGVmYXVsdFZhbHVlO2lmKHZhbHVlIT09dW5kZWZpbmVkKXJlc3VsdD12YWx1ZTtpZihvdGhlciE9PQp1bmRlZmluZWQpe2lmKHJlc3VsdD09PXVuZGVmaW5lZClyZXR1cm4gb3RoZXI7aWYodHlwZW9mIHZhbHVlPT0ic3RyaW5nInx8dHlwZW9mIG90aGVyPT0ic3RyaW5nIil7dmFsdWU9YmFzZVRvU3RyaW5nKHZhbHVlKTtvdGhlcj1iYXNlVG9TdHJpbmcob3RoZXIpfWVsc2V7dmFsdWU9YmFzZVRvTnVtYmVyKHZhbHVlKTtvdGhlcj1iYXNlVG9OdW1iZXIob3RoZXIpfXJlc3VsdD1vcGVyYXRvcih2YWx1ZSxvdGhlcil9cmV0dXJuIHJlc3VsdH19ZnVuY3Rpb24gY3JlYXRlT3ZlcihhcnJheUZ1bmMpe3JldHVybiBmbGF0UmVzdChmdW5jdGlvbihpdGVyYXRlZXMpe2l0ZXJhdGVlcz1hcnJheU1hcChpdGVyYXRlZXMsYmFzZVVuYXJ5KGdldEl0ZXJhdGVlKCkpKTtyZXR1cm4gYmFzZVJlc3QoZnVuY3Rpb24oYXJncyl7dmFyIHRoaXNBcmc9dGhpcztyZXR1cm4gYXJyYXlGdW5jKGl0ZXJhdGVlcyxmdW5jdGlvbihpdGVyYXRlZSl7cmV0dXJuIGFwcGx5KGl0ZXJhdGVlLHRoaXNBcmcsYXJncyl9KX0pfSl9CmZ1bmN0aW9uIGNyZWF0ZVBhZGRpbmcobGVuZ3RoLGNoYXJzKXtjaGFycz1jaGFycz09PXVuZGVmaW5lZD8iICI6YmFzZVRvU3RyaW5nKGNoYXJzKTt2YXIgY2hhcnNMZW5ndGg9Y2hhcnMubGVuZ3RoO2lmKGNoYXJzTGVuZ3RoPDIpcmV0dXJuIGNoYXJzTGVuZ3RoP2Jhc2VSZXBlYXQoY2hhcnMsbGVuZ3RoKTpjaGFyczt2YXIgcmVzdWx0PWJhc2VSZXBlYXQoY2hhcnMsbmF0aXZlQ2VpbChsZW5ndGgvc3RyaW5nU2l6ZShjaGFycykpKTtyZXR1cm4gaGFzVW5pY29kZShjaGFycyk/Y2FzdFNsaWNlKHN0cmluZ1RvQXJyYXkocmVzdWx0KSwwLGxlbmd0aCkuam9pbigiIik6cmVzdWx0LnNsaWNlKDAsbGVuZ3RoKX1mdW5jdGlvbiBjcmVhdGVQYXJ0aWFsKGZ1bmMsYml0bWFzayx0aGlzQXJnLHBhcnRpYWxzKXt2YXIgaXNCaW5kPWJpdG1hc2smV1JBUF9CSU5EX0ZMQUcsQ3Rvcj1jcmVhdGVDdG9yKGZ1bmMpO2Z1bmN0aW9uIHdyYXBwZXIoKXt2YXIgYXJnc0luZGV4PS0xLGFyZ3NMZW5ndGg9CmFyZ3VtZW50cy5sZW5ndGgsbGVmdEluZGV4PS0xLGxlZnRMZW5ndGg9cGFydGlhbHMubGVuZ3RoLGFyZ3M9QXJyYXkobGVmdExlbmd0aCthcmdzTGVuZ3RoKSxmbj10aGlzJiZ0aGlzIT09cm9vdCYmdGhpcyBpbnN0YW5jZW9mIHdyYXBwZXI/Q3RvcjpmdW5jO3doaWxlKCsrbGVmdEluZGV4PGxlZnRMZW5ndGgpYXJnc1tsZWZ0SW5kZXhdPXBhcnRpYWxzW2xlZnRJbmRleF07d2hpbGUoYXJnc0xlbmd0aC0tKWFyZ3NbbGVmdEluZGV4KytdPWFyZ3VtZW50c1srK2FyZ3NJbmRleF07cmV0dXJuIGFwcGx5KGZuLGlzQmluZD90aGlzQXJnOnRoaXMsYXJncyl9cmV0dXJuIHdyYXBwZXJ9ZnVuY3Rpb24gY3JlYXRlUmFuZ2UoZnJvbVJpZ2h0KXtyZXR1cm4gZnVuY3Rpb24oc3RhcnQsZW5kLHN0ZXApe2lmKHN0ZXAmJnR5cGVvZiBzdGVwIT0ibnVtYmVyIiYmaXNJdGVyYXRlZUNhbGwoc3RhcnQsZW5kLHN0ZXApKWVuZD1zdGVwPXVuZGVmaW5lZDtzdGFydD10b0Zpbml0ZShzdGFydCk7aWYoZW5kPT09CnVuZGVmaW5lZCl7ZW5kPXN0YXJ0O3N0YXJ0PTB9ZWxzZSBlbmQ9dG9GaW5pdGUoZW5kKTtzdGVwPXN0ZXA9PT11bmRlZmluZWQ/c3RhcnQ8ZW5kPzE6LTE6dG9GaW5pdGUoc3RlcCk7cmV0dXJuIGJhc2VSYW5nZShzdGFydCxlbmQsc3RlcCxmcm9tUmlnaHQpfX1mdW5jdGlvbiBjcmVhdGVSZWxhdGlvbmFsT3BlcmF0aW9uKG9wZXJhdG9yKXtyZXR1cm4gZnVuY3Rpb24odmFsdWUsb3RoZXIpe2lmKCEodHlwZW9mIHZhbHVlPT0ic3RyaW5nIiYmdHlwZW9mIG90aGVyPT0ic3RyaW5nIikpe3ZhbHVlPXRvTnVtYmVyKHZhbHVlKTtvdGhlcj10b051bWJlcihvdGhlcil9cmV0dXJuIG9wZXJhdG9yKHZhbHVlLG90aGVyKX19ZnVuY3Rpb24gY3JlYXRlUmVjdXJyeShmdW5jLGJpdG1hc2ssd3JhcEZ1bmMscGxhY2Vob2xkZXIsdGhpc0FyZyxwYXJ0aWFscyxob2xkZXJzLGFyZ1BvcyxhcnksYXJpdHkpe3ZhciBpc0N1cnJ5PWJpdG1hc2smV1JBUF9DVVJSWV9GTEFHLG5ld0hvbGRlcnM9aXNDdXJyeT8KaG9sZGVyczp1bmRlZmluZWQsbmV3SG9sZGVyc1JpZ2h0PWlzQ3Vycnk/dW5kZWZpbmVkOmhvbGRlcnMsbmV3UGFydGlhbHM9aXNDdXJyeT9wYXJ0aWFsczp1bmRlZmluZWQsbmV3UGFydGlhbHNSaWdodD1pc0N1cnJ5P3VuZGVmaW5lZDpwYXJ0aWFscztiaXRtYXNrfD1pc0N1cnJ5P1dSQVBfUEFSVElBTF9GTEFHOldSQVBfUEFSVElBTF9SSUdIVF9GTEFHO2JpdG1hc2smPX4oaXNDdXJyeT9XUkFQX1BBUlRJQUxfUklHSFRfRkxBRzpXUkFQX1BBUlRJQUxfRkxBRyk7aWYoIShiaXRtYXNrJldSQVBfQ1VSUllfQk9VTkRfRkxBRykpYml0bWFzayY9fihXUkFQX0JJTkRfRkxBR3xXUkFQX0JJTkRfS0VZX0ZMQUcpO3ZhciBuZXdEYXRhPVtmdW5jLGJpdG1hc2ssdGhpc0FyZyxuZXdQYXJ0aWFscyxuZXdIb2xkZXJzLG5ld1BhcnRpYWxzUmlnaHQsbmV3SG9sZGVyc1JpZ2h0LGFyZ1BvcyxhcnksYXJpdHldO3ZhciByZXN1bHQ9d3JhcEZ1bmMuYXBwbHkodW5kZWZpbmVkLG5ld0RhdGEpO2lmKGlzTGF6aWFibGUoZnVuYykpc2V0RGF0YShyZXN1bHQsCm5ld0RhdGEpO3Jlc3VsdC5wbGFjZWhvbGRlcj1wbGFjZWhvbGRlcjtyZXR1cm4gc2V0V3JhcFRvU3RyaW5nKHJlc3VsdCxmdW5jLGJpdG1hc2spfWZ1bmN0aW9uIGNyZWF0ZVJvdW5kKG1ldGhvZE5hbWUpe3ZhciBmdW5jPU1hdGhbbWV0aG9kTmFtZV07cmV0dXJuIGZ1bmN0aW9uKG51bWJlcixwcmVjaXNpb24pe251bWJlcj10b051bWJlcihudW1iZXIpO3ByZWNpc2lvbj1wcmVjaXNpb249PW51bGw/MDpuYXRpdmVNaW4odG9JbnRlZ2VyKHByZWNpc2lvbiksMjkyKTtpZihwcmVjaXNpb24pe3ZhciBwYWlyPSh0b1N0cmluZyhudW1iZXIpKyJlIikuc3BsaXQoImUiKSx2YWx1ZT1mdW5jKHBhaXJbMF0rImUiKygrcGFpclsxXStwcmVjaXNpb24pKTtwYWlyPSh0b1N0cmluZyh2YWx1ZSkrImUiKS5zcGxpdCgiZSIpO3JldHVybisocGFpclswXSsiZSIrKCtwYWlyWzFdLXByZWNpc2lvbikpfXJldHVybiBmdW5jKG51bWJlcil9fXZhciBjcmVhdGVTZXQ9IShTZXQmJjEvc2V0VG9BcnJheShuZXcgU2V0KFssCi0wXSkpWzFdPT1JTkZJTklUWSk/bm9vcDpmdW5jdGlvbih2YWx1ZXMpe3JldHVybiBuZXcgU2V0KHZhbHVlcyl9O2Z1bmN0aW9uIGNyZWF0ZVRvUGFpcnMoa2V5c0Z1bmMpe3JldHVybiBmdW5jdGlvbihvYmplY3Qpe3ZhciB0YWc9Z2V0VGFnKG9iamVjdCk7aWYodGFnPT1tYXBUYWcpcmV0dXJuIG1hcFRvQXJyYXkob2JqZWN0KTtpZih0YWc9PXNldFRhZylyZXR1cm4gc2V0VG9QYWlycyhvYmplY3QpO3JldHVybiBiYXNlVG9QYWlycyhvYmplY3Qsa2V5c0Z1bmMob2JqZWN0KSl9fWZ1bmN0aW9uIGNyZWF0ZVdyYXAoZnVuYyxiaXRtYXNrLHRoaXNBcmcscGFydGlhbHMsaG9sZGVycyxhcmdQb3MsYXJ5LGFyaXR5KXt2YXIgaXNCaW5kS2V5PWJpdG1hc2smV1JBUF9CSU5EX0tFWV9GTEFHO2lmKCFpc0JpbmRLZXkmJnR5cGVvZiBmdW5jIT0iZnVuY3Rpb24iKXRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTt2YXIgbGVuZ3RoPXBhcnRpYWxzP3BhcnRpYWxzLmxlbmd0aDoKMDtpZighbGVuZ3RoKXtiaXRtYXNrJj1+KFdSQVBfUEFSVElBTF9GTEFHfFdSQVBfUEFSVElBTF9SSUdIVF9GTEFHKTtwYXJ0aWFscz1ob2xkZXJzPXVuZGVmaW5lZH1hcnk9YXJ5PT09dW5kZWZpbmVkP2FyeTpuYXRpdmVNYXgodG9JbnRlZ2VyKGFyeSksMCk7YXJpdHk9YXJpdHk9PT11bmRlZmluZWQ/YXJpdHk6dG9JbnRlZ2VyKGFyaXR5KTtsZW5ndGgtPWhvbGRlcnM/aG9sZGVycy5sZW5ndGg6MDtpZihiaXRtYXNrJldSQVBfUEFSVElBTF9SSUdIVF9GTEFHKXt2YXIgcGFydGlhbHNSaWdodD1wYXJ0aWFscyxob2xkZXJzUmlnaHQ9aG9sZGVycztwYXJ0aWFscz1ob2xkZXJzPXVuZGVmaW5lZH12YXIgZGF0YT1pc0JpbmRLZXk/dW5kZWZpbmVkOmdldERhdGEoZnVuYyk7dmFyIG5ld0RhdGE9W2Z1bmMsYml0bWFzayx0aGlzQXJnLHBhcnRpYWxzLGhvbGRlcnMscGFydGlhbHNSaWdodCxob2xkZXJzUmlnaHQsYXJnUG9zLGFyeSxhcml0eV07aWYoZGF0YSltZXJnZURhdGEobmV3RGF0YSwKZGF0YSk7ZnVuYz1uZXdEYXRhWzBdO2JpdG1hc2s9bmV3RGF0YVsxXTt0aGlzQXJnPW5ld0RhdGFbMl07cGFydGlhbHM9bmV3RGF0YVszXTtob2xkZXJzPW5ld0RhdGFbNF07YXJpdHk9bmV3RGF0YVs5XT1uZXdEYXRhWzldPT09dW5kZWZpbmVkP2lzQmluZEtleT8wOmZ1bmMubGVuZ3RoOm5hdGl2ZU1heChuZXdEYXRhWzldLWxlbmd0aCwwKTtpZighYXJpdHkmJmJpdG1hc2smKFdSQVBfQ1VSUllfRkxBR3xXUkFQX0NVUlJZX1JJR0hUX0ZMQUcpKWJpdG1hc2smPX4oV1JBUF9DVVJSWV9GTEFHfFdSQVBfQ1VSUllfUklHSFRfRkxBRyk7aWYoIWJpdG1hc2t8fGJpdG1hc2s9PVdSQVBfQklORF9GTEFHKXZhciByZXN1bHQ9Y3JlYXRlQmluZChmdW5jLGJpdG1hc2ssdGhpc0FyZyk7ZWxzZSBpZihiaXRtYXNrPT1XUkFQX0NVUlJZX0ZMQUd8fGJpdG1hc2s9PVdSQVBfQ1VSUllfUklHSFRfRkxBRylyZXN1bHQ9Y3JlYXRlQ3VycnkoZnVuYyxiaXRtYXNrLGFyaXR5KTtlbHNlIGlmKChiaXRtYXNrPT0KV1JBUF9QQVJUSUFMX0ZMQUd8fGJpdG1hc2s9PShXUkFQX0JJTkRfRkxBR3xXUkFQX1BBUlRJQUxfRkxBRykpJiYhaG9sZGVycy5sZW5ndGgpcmVzdWx0PWNyZWF0ZVBhcnRpYWwoZnVuYyxiaXRtYXNrLHRoaXNBcmcscGFydGlhbHMpO2Vsc2UgcmVzdWx0PWNyZWF0ZUh5YnJpZC5hcHBseSh1bmRlZmluZWQsbmV3RGF0YSk7dmFyIHNldHRlcj1kYXRhP2Jhc2VTZXREYXRhOnNldERhdGE7cmV0dXJuIHNldFdyYXBUb1N0cmluZyhzZXR0ZXIocmVzdWx0LG5ld0RhdGEpLGZ1bmMsYml0bWFzayl9ZnVuY3Rpb24gY3VzdG9tRGVmYXVsdHNBc3NpZ25JbihvYmpWYWx1ZSxzcmNWYWx1ZSxrZXksb2JqZWN0KXtpZihvYmpWYWx1ZT09PXVuZGVmaW5lZHx8ZXEob2JqVmFsdWUsb2JqZWN0UHJvdG9ba2V5XSkmJiFoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCxrZXkpKXJldHVybiBzcmNWYWx1ZTtyZXR1cm4gb2JqVmFsdWV9ZnVuY3Rpb24gY3VzdG9tRGVmYXVsdHNNZXJnZShvYmpWYWx1ZSxzcmNWYWx1ZSwKa2V5LG9iamVjdCxzb3VyY2Usc3RhY2spe2lmKGlzT2JqZWN0KG9ialZhbHVlKSYmaXNPYmplY3Qoc3JjVmFsdWUpKXtzdGFjay5zZXQoc3JjVmFsdWUsb2JqVmFsdWUpO2Jhc2VNZXJnZShvYmpWYWx1ZSxzcmNWYWx1ZSx1bmRlZmluZWQsY3VzdG9tRGVmYXVsdHNNZXJnZSxzdGFjayk7c3RhY2tbImRlbGV0ZSJdKHNyY1ZhbHVlKX1yZXR1cm4gb2JqVmFsdWV9ZnVuY3Rpb24gY3VzdG9tT21pdENsb25lKHZhbHVlKXtyZXR1cm4gaXNQbGFpbk9iamVjdCh2YWx1ZSk/dW5kZWZpbmVkOnZhbHVlfWZ1bmN0aW9uIGVxdWFsQXJyYXlzKGFycmF5LG90aGVyLGJpdG1hc2ssY3VzdG9taXplcixlcXVhbEZ1bmMsc3RhY2spe3ZhciBpc1BhcnRpYWw9Yml0bWFzayZDT01QQVJFX1BBUlRJQUxfRkxBRyxhcnJMZW5ndGg9YXJyYXkubGVuZ3RoLG90aExlbmd0aD1vdGhlci5sZW5ndGg7aWYoYXJyTGVuZ3RoIT1vdGhMZW5ndGgmJiEoaXNQYXJ0aWFsJiZvdGhMZW5ndGg+YXJyTGVuZ3RoKSlyZXR1cm4gZmFsc2U7CnZhciBzdGFja2VkPXN0YWNrLmdldChhcnJheSk7aWYoc3RhY2tlZCYmc3RhY2suZ2V0KG90aGVyKSlyZXR1cm4gc3RhY2tlZD09b3RoZXI7dmFyIGluZGV4PS0xLHJlc3VsdD10cnVlLHNlZW49Yml0bWFzayZDT01QQVJFX1VOT1JERVJFRF9GTEFHP25ldyBTZXRDYWNoZTp1bmRlZmluZWQ7c3RhY2suc2V0KGFycmF5LG90aGVyKTtzdGFjay5zZXQob3RoZXIsYXJyYXkpO3doaWxlKCsraW5kZXg8YXJyTGVuZ3RoKXt2YXIgYXJyVmFsdWU9YXJyYXlbaW5kZXhdLG90aFZhbHVlPW90aGVyW2luZGV4XTtpZihjdXN0b21pemVyKXZhciBjb21wYXJlZD1pc1BhcnRpYWw/Y3VzdG9taXplcihvdGhWYWx1ZSxhcnJWYWx1ZSxpbmRleCxvdGhlcixhcnJheSxzdGFjayk6Y3VzdG9taXplcihhcnJWYWx1ZSxvdGhWYWx1ZSxpbmRleCxhcnJheSxvdGhlcixzdGFjayk7aWYoY29tcGFyZWQhPT11bmRlZmluZWQpe2lmKGNvbXBhcmVkKWNvbnRpbnVlO3Jlc3VsdD1mYWxzZTticmVha31pZihzZWVuKXtpZighYXJyYXlTb21lKG90aGVyLApmdW5jdGlvbihvdGhWYWx1ZSxvdGhJbmRleCl7aWYoIWNhY2hlSGFzKHNlZW4sb3RoSW5kZXgpJiYoYXJyVmFsdWU9PT1vdGhWYWx1ZXx8ZXF1YWxGdW5jKGFyclZhbHVlLG90aFZhbHVlLGJpdG1hc2ssY3VzdG9taXplcixzdGFjaykpKXJldHVybiBzZWVuLnB1c2gob3RoSW5kZXgpfSkpe3Jlc3VsdD1mYWxzZTticmVha319ZWxzZSBpZighKGFyclZhbHVlPT09b3RoVmFsdWV8fGVxdWFsRnVuYyhhcnJWYWx1ZSxvdGhWYWx1ZSxiaXRtYXNrLGN1c3RvbWl6ZXIsc3RhY2spKSl7cmVzdWx0PWZhbHNlO2JyZWFrfX1zdGFja1siZGVsZXRlIl0oYXJyYXkpO3N0YWNrWyJkZWxldGUiXShvdGhlcik7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBlcXVhbEJ5VGFnKG9iamVjdCxvdGhlcix0YWcsYml0bWFzayxjdXN0b21pemVyLGVxdWFsRnVuYyxzdGFjayl7c3dpdGNoKHRhZyl7Y2FzZSBkYXRhVmlld1RhZzppZihvYmplY3QuYnl0ZUxlbmd0aCE9b3RoZXIuYnl0ZUxlbmd0aHx8b2JqZWN0LmJ5dGVPZmZzZXQhPQpvdGhlci5ieXRlT2Zmc2V0KXJldHVybiBmYWxzZTtvYmplY3Q9b2JqZWN0LmJ1ZmZlcjtvdGhlcj1vdGhlci5idWZmZXI7Y2FzZSBhcnJheUJ1ZmZlclRhZzppZihvYmplY3QuYnl0ZUxlbmd0aCE9b3RoZXIuYnl0ZUxlbmd0aHx8IWVxdWFsRnVuYyhuZXcgVWludDhBcnJheShvYmplY3QpLG5ldyBVaW50OEFycmF5KG90aGVyKSkpcmV0dXJuIGZhbHNlO3JldHVybiB0cnVlO2Nhc2UgYm9vbFRhZzpjYXNlIGRhdGVUYWc6Y2FzZSBudW1iZXJUYWc6cmV0dXJuIGVxKCtvYmplY3QsK290aGVyKTtjYXNlIGVycm9yVGFnOnJldHVybiBvYmplY3QubmFtZT09b3RoZXIubmFtZSYmb2JqZWN0Lm1lc3NhZ2U9PW90aGVyLm1lc3NhZ2U7Y2FzZSByZWdleHBUYWc6Y2FzZSBzdHJpbmdUYWc6cmV0dXJuIG9iamVjdD09b3RoZXIrIiI7Y2FzZSBtYXBUYWc6dmFyIGNvbnZlcnQ9bWFwVG9BcnJheTtjYXNlIHNldFRhZzp2YXIgaXNQYXJ0aWFsPWJpdG1hc2smQ09NUEFSRV9QQVJUSUFMX0ZMQUc7Y29udmVydHx8Cihjb252ZXJ0PXNldFRvQXJyYXkpO2lmKG9iamVjdC5zaXplIT1vdGhlci5zaXplJiYhaXNQYXJ0aWFsKXJldHVybiBmYWxzZTt2YXIgc3RhY2tlZD1zdGFjay5nZXQob2JqZWN0KTtpZihzdGFja2VkKXJldHVybiBzdGFja2VkPT1vdGhlcjtiaXRtYXNrfD1DT01QQVJFX1VOT1JERVJFRF9GTEFHO3N0YWNrLnNldChvYmplY3Qsb3RoZXIpO3ZhciByZXN1bHQ9ZXF1YWxBcnJheXMoY29udmVydChvYmplY3QpLGNvbnZlcnQob3RoZXIpLGJpdG1hc2ssY3VzdG9taXplcixlcXVhbEZ1bmMsc3RhY2spO3N0YWNrWyJkZWxldGUiXShvYmplY3QpO3JldHVybiByZXN1bHQ7Y2FzZSBzeW1ib2xUYWc6aWYoc3ltYm9sVmFsdWVPZilyZXR1cm4gc3ltYm9sVmFsdWVPZi5jYWxsKG9iamVjdCk9PXN5bWJvbFZhbHVlT2YuY2FsbChvdGhlcil9cmV0dXJuIGZhbHNlfWZ1bmN0aW9uIGVxdWFsT2JqZWN0cyhvYmplY3Qsb3RoZXIsYml0bWFzayxjdXN0b21pemVyLGVxdWFsRnVuYyxzdGFjayl7dmFyIGlzUGFydGlhbD0KYml0bWFzayZDT01QQVJFX1BBUlRJQUxfRkxBRyxvYmpQcm9wcz1nZXRBbGxLZXlzKG9iamVjdCksb2JqTGVuZ3RoPW9ialByb3BzLmxlbmd0aCxvdGhQcm9wcz1nZXRBbGxLZXlzKG90aGVyKSxvdGhMZW5ndGg9b3RoUHJvcHMubGVuZ3RoO2lmKG9iakxlbmd0aCE9b3RoTGVuZ3RoJiYhaXNQYXJ0aWFsKXJldHVybiBmYWxzZTt2YXIgaW5kZXg9b2JqTGVuZ3RoO3doaWxlKGluZGV4LS0pe3ZhciBrZXk9b2JqUHJvcHNbaW5kZXhdO2lmKCEoaXNQYXJ0aWFsP2tleSBpbiBvdGhlcjpoYXNPd25Qcm9wZXJ0eS5jYWxsKG90aGVyLGtleSkpKXJldHVybiBmYWxzZX12YXIgc3RhY2tlZD1zdGFjay5nZXQob2JqZWN0KTtpZihzdGFja2VkJiZzdGFjay5nZXQob3RoZXIpKXJldHVybiBzdGFja2VkPT1vdGhlcjt2YXIgcmVzdWx0PXRydWU7c3RhY2suc2V0KG9iamVjdCxvdGhlcik7c3RhY2suc2V0KG90aGVyLG9iamVjdCk7dmFyIHNraXBDdG9yPWlzUGFydGlhbDt3aGlsZSgrK2luZGV4PG9iakxlbmd0aCl7a2V5PQpvYmpQcm9wc1tpbmRleF07dmFyIG9ialZhbHVlPW9iamVjdFtrZXldLG90aFZhbHVlPW90aGVyW2tleV07aWYoY3VzdG9taXplcil2YXIgY29tcGFyZWQ9aXNQYXJ0aWFsP2N1c3RvbWl6ZXIob3RoVmFsdWUsb2JqVmFsdWUsa2V5LG90aGVyLG9iamVjdCxzdGFjayk6Y3VzdG9taXplcihvYmpWYWx1ZSxvdGhWYWx1ZSxrZXksb2JqZWN0LG90aGVyLHN0YWNrKTtpZighKGNvbXBhcmVkPT09dW5kZWZpbmVkP29ialZhbHVlPT09b3RoVmFsdWV8fGVxdWFsRnVuYyhvYmpWYWx1ZSxvdGhWYWx1ZSxiaXRtYXNrLGN1c3RvbWl6ZXIsc3RhY2spOmNvbXBhcmVkKSl7cmVzdWx0PWZhbHNlO2JyZWFrfXNraXBDdG9yfHwoc2tpcEN0b3I9a2V5PT0iY29uc3RydWN0b3IiKX1pZihyZXN1bHQmJiFza2lwQ3Rvcil7dmFyIG9iakN0b3I9b2JqZWN0LmNvbnN0cnVjdG9yLG90aEN0b3I9b3RoZXIuY29uc3RydWN0b3I7aWYob2JqQ3RvciE9b3RoQ3RvciYmKCJjb25zdHJ1Y3RvciJpbiBvYmplY3QmJiJjb25zdHJ1Y3RvciJpbgpvdGhlcikmJiEodHlwZW9mIG9iakN0b3I9PSJmdW5jdGlvbiImJm9iakN0b3IgaW5zdGFuY2VvZiBvYmpDdG9yJiZ0eXBlb2Ygb3RoQ3Rvcj09ImZ1bmN0aW9uIiYmb3RoQ3RvciBpbnN0YW5jZW9mIG90aEN0b3IpKXJlc3VsdD1mYWxzZX1zdGFja1siZGVsZXRlIl0ob2JqZWN0KTtzdGFja1siZGVsZXRlIl0ob3RoZXIpO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gZmxhdFJlc3QoZnVuYyl7cmV0dXJuIHNldFRvU3RyaW5nKG92ZXJSZXN0KGZ1bmMsdW5kZWZpbmVkLGZsYXR0ZW4pLGZ1bmMrIiIpfWZ1bmN0aW9uIGdldEFsbEtleXMob2JqZWN0KXtyZXR1cm4gYmFzZUdldEFsbEtleXMob2JqZWN0LGtleXMsZ2V0U3ltYm9scyl9ZnVuY3Rpb24gZ2V0QWxsS2V5c0luKG9iamVjdCl7cmV0dXJuIGJhc2VHZXRBbGxLZXlzKG9iamVjdCxrZXlzSW4sZ2V0U3ltYm9sc0luKX12YXIgZ2V0RGF0YT0hbWV0YU1hcD9ub29wOmZ1bmN0aW9uKGZ1bmMpe3JldHVybiBtZXRhTWFwLmdldChmdW5jKX07CmZ1bmN0aW9uIGdldEZ1bmNOYW1lKGZ1bmMpe3ZhciByZXN1bHQ9ZnVuYy5uYW1lKyIiLGFycmF5PXJlYWxOYW1lc1tyZXN1bHRdLGxlbmd0aD1oYXNPd25Qcm9wZXJ0eS5jYWxsKHJlYWxOYW1lcyxyZXN1bHQpP2FycmF5Lmxlbmd0aDowO3doaWxlKGxlbmd0aC0tKXt2YXIgZGF0YT1hcnJheVtsZW5ndGhdLG90aGVyRnVuYz1kYXRhLmZ1bmM7aWYob3RoZXJGdW5jPT1udWxsfHxvdGhlckZ1bmM9PWZ1bmMpcmV0dXJuIGRhdGEubmFtZX1yZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGdldEhvbGRlcihmdW5jKXt2YXIgb2JqZWN0PWhhc093blByb3BlcnR5LmNhbGwobG9kYXNoLCJwbGFjZWhvbGRlciIpP2xvZGFzaDpmdW5jO3JldHVybiBvYmplY3QucGxhY2Vob2xkZXJ9ZnVuY3Rpb24gZ2V0SXRlcmF0ZWUoKXt2YXIgcmVzdWx0PWxvZGFzaC5pdGVyYXRlZXx8aXRlcmF0ZWU7cmVzdWx0PXJlc3VsdD09PWl0ZXJhdGVlP2Jhc2VJdGVyYXRlZTpyZXN1bHQ7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/CnJlc3VsdChhcmd1bWVudHNbMF0sYXJndW1lbnRzWzFdKTpyZXN1bHR9ZnVuY3Rpb24gZ2V0TWFwRGF0YShtYXAsa2V5KXt2YXIgZGF0YT1tYXAuX19kYXRhX187cmV0dXJuIGlzS2V5YWJsZShrZXkpP2RhdGFbdHlwZW9mIGtleT09InN0cmluZyI/InN0cmluZyI6Imhhc2giXTpkYXRhLm1hcH1mdW5jdGlvbiBnZXRNYXRjaERhdGEob2JqZWN0KXt2YXIgcmVzdWx0PWtleXMob2JqZWN0KSxsZW5ndGg9cmVzdWx0Lmxlbmd0aDt3aGlsZShsZW5ndGgtLSl7dmFyIGtleT1yZXN1bHRbbGVuZ3RoXSx2YWx1ZT1vYmplY3Rba2V5XTtyZXN1bHRbbGVuZ3RoXT1ba2V5LHZhbHVlLGlzU3RyaWN0Q29tcGFyYWJsZSh2YWx1ZSldfXJldHVybiByZXN1bHR9ZnVuY3Rpb24gZ2V0TmF0aXZlKG9iamVjdCxrZXkpe3ZhciB2YWx1ZT1nZXRWYWx1ZShvYmplY3Qsa2V5KTtyZXR1cm4gYmFzZUlzTmF0aXZlKHZhbHVlKT92YWx1ZTp1bmRlZmluZWR9ZnVuY3Rpb24gZ2V0UmF3VGFnKHZhbHVlKXt2YXIgaXNPd249Cmhhc093blByb3BlcnR5LmNhbGwodmFsdWUsc3ltVG9TdHJpbmdUYWcpLHRhZz12YWx1ZVtzeW1Ub1N0cmluZ1RhZ107dHJ5e3ZhbHVlW3N5bVRvU3RyaW5nVGFnXT11bmRlZmluZWQ7dmFyIHVubWFza2VkPXRydWV9Y2F0Y2goZSl7fXZhciByZXN1bHQ9bmF0aXZlT2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSk7aWYodW5tYXNrZWQpaWYoaXNPd24pdmFsdWVbc3ltVG9TdHJpbmdUYWddPXRhZztlbHNlIGRlbGV0ZSB2YWx1ZVtzeW1Ub1N0cmluZ1RhZ107cmV0dXJuIHJlc3VsdH12YXIgZ2V0U3ltYm9scz0hbmF0aXZlR2V0U3ltYm9scz9zdHViQXJyYXk6ZnVuY3Rpb24ob2JqZWN0KXtpZihvYmplY3Q9PW51bGwpcmV0dXJuW107b2JqZWN0PU9iamVjdChvYmplY3QpO3JldHVybiBhcnJheUZpbHRlcihuYXRpdmVHZXRTeW1ib2xzKG9iamVjdCksZnVuY3Rpb24oc3ltYm9sKXtyZXR1cm4gcHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChvYmplY3Qsc3ltYm9sKX0pfTt2YXIgZ2V0U3ltYm9sc0luPQohbmF0aXZlR2V0U3ltYm9scz9zdHViQXJyYXk6ZnVuY3Rpb24ob2JqZWN0KXt2YXIgcmVzdWx0PVtdO3doaWxlKG9iamVjdCl7YXJyYXlQdXNoKHJlc3VsdCxnZXRTeW1ib2xzKG9iamVjdCkpO29iamVjdD1nZXRQcm90b3R5cGUob2JqZWN0KX1yZXR1cm4gcmVzdWx0fTt2YXIgZ2V0VGFnPWJhc2VHZXRUYWc7aWYoRGF0YVZpZXcmJmdldFRhZyhuZXcgRGF0YVZpZXcobmV3IEFycmF5QnVmZmVyKDEpKSkhPWRhdGFWaWV3VGFnfHxNYXAmJmdldFRhZyhuZXcgTWFwKSE9bWFwVGFnfHxQcm9taXNlJiZnZXRUYWcoUHJvbWlzZS5yZXNvbHZlKCkpIT1wcm9taXNlVGFnfHxTZXQmJmdldFRhZyhuZXcgU2V0KSE9c2V0VGFnfHxXZWFrTWFwJiZnZXRUYWcobmV3IFdlYWtNYXApIT13ZWFrTWFwVGFnKWdldFRhZz1mdW5jdGlvbih2YWx1ZSl7dmFyIHJlc3VsdD1iYXNlR2V0VGFnKHZhbHVlKSxDdG9yPXJlc3VsdD09b2JqZWN0VGFnP3ZhbHVlLmNvbnN0cnVjdG9yOnVuZGVmaW5lZCxjdG9yU3RyaW5nPQpDdG9yP3RvU291cmNlKEN0b3IpOiIiO2lmKGN0b3JTdHJpbmcpc3dpdGNoKGN0b3JTdHJpbmcpe2Nhc2UgZGF0YVZpZXdDdG9yU3RyaW5nOnJldHVybiBkYXRhVmlld1RhZztjYXNlIG1hcEN0b3JTdHJpbmc6cmV0dXJuIG1hcFRhZztjYXNlIHByb21pc2VDdG9yU3RyaW5nOnJldHVybiBwcm9taXNlVGFnO2Nhc2Ugc2V0Q3RvclN0cmluZzpyZXR1cm4gc2V0VGFnO2Nhc2Ugd2Vha01hcEN0b3JTdHJpbmc6cmV0dXJuIHdlYWtNYXBUYWd9cmV0dXJuIHJlc3VsdH07ZnVuY3Rpb24gZ2V0VmlldyhzdGFydCxlbmQsdHJhbnNmb3Jtcyl7dmFyIGluZGV4PS0xLGxlbmd0aD10cmFuc2Zvcm1zLmxlbmd0aDt3aGlsZSgrK2luZGV4PGxlbmd0aCl7dmFyIGRhdGE9dHJhbnNmb3Jtc1tpbmRleF0sc2l6ZT1kYXRhLnNpemU7c3dpdGNoKGRhdGEudHlwZSl7Y2FzZSAiZHJvcCI6c3RhcnQrPXNpemU7YnJlYWs7Y2FzZSAiZHJvcFJpZ2h0IjplbmQtPXNpemU7YnJlYWs7Y2FzZSAidGFrZSI6ZW5kPW5hdGl2ZU1pbihlbmQsCnN0YXJ0K3NpemUpO2JyZWFrO2Nhc2UgInRha2VSaWdodCI6c3RhcnQ9bmF0aXZlTWF4KHN0YXJ0LGVuZC1zaXplKTticmVha319cmV0dXJueyJzdGFydCI6c3RhcnQsImVuZCI6ZW5kfX1mdW5jdGlvbiBnZXRXcmFwRGV0YWlscyhzb3VyY2Upe3ZhciBtYXRjaD1zb3VyY2UubWF0Y2gocmVXcmFwRGV0YWlscyk7cmV0dXJuIG1hdGNoP21hdGNoWzFdLnNwbGl0KHJlU3BsaXREZXRhaWxzKTpbXX1mdW5jdGlvbiBoYXNQYXRoKG9iamVjdCxwYXRoLGhhc0Z1bmMpe3BhdGg9Y2FzdFBhdGgocGF0aCxvYmplY3QpO3ZhciBpbmRleD0tMSxsZW5ndGg9cGF0aC5sZW5ndGgscmVzdWx0PWZhbHNlO3doaWxlKCsraW5kZXg8bGVuZ3RoKXt2YXIga2V5PXRvS2V5KHBhdGhbaW5kZXhdKTtpZighKHJlc3VsdD1vYmplY3QhPW51bGwmJmhhc0Z1bmMob2JqZWN0LGtleSkpKWJyZWFrO29iamVjdD1vYmplY3Rba2V5XX1pZihyZXN1bHR8fCsraW5kZXghPWxlbmd0aClyZXR1cm4gcmVzdWx0O2xlbmd0aD0Kb2JqZWN0PT1udWxsPzA6b2JqZWN0Lmxlbmd0aDtyZXR1cm4hIWxlbmd0aCYmaXNMZW5ndGgobGVuZ3RoKSYmaXNJbmRleChrZXksbGVuZ3RoKSYmKGlzQXJyYXkob2JqZWN0KXx8aXNBcmd1bWVudHMob2JqZWN0KSl9ZnVuY3Rpb24gaW5pdENsb25lQXJyYXkoYXJyYXkpe3ZhciBsZW5ndGg9YXJyYXkubGVuZ3RoLHJlc3VsdD1uZXcgYXJyYXkuY29uc3RydWN0b3IobGVuZ3RoKTtpZihsZW5ndGgmJnR5cGVvZiBhcnJheVswXT09InN0cmluZyImJmhhc093blByb3BlcnR5LmNhbGwoYXJyYXksImluZGV4Iikpe3Jlc3VsdC5pbmRleD1hcnJheS5pbmRleDtyZXN1bHQuaW5wdXQ9YXJyYXkuaW5wdXR9cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBpbml0Q2xvbmVPYmplY3Qob2JqZWN0KXtyZXR1cm4gdHlwZW9mIG9iamVjdC5jb25zdHJ1Y3Rvcj09ImZ1bmN0aW9uIiYmIWlzUHJvdG90eXBlKG9iamVjdCk/YmFzZUNyZWF0ZShnZXRQcm90b3R5cGUob2JqZWN0KSk6e319ZnVuY3Rpb24gaW5pdENsb25lQnlUYWcob2JqZWN0LAp0YWcsaXNEZWVwKXt2YXIgQ3Rvcj1vYmplY3QuY29uc3RydWN0b3I7c3dpdGNoKHRhZyl7Y2FzZSBhcnJheUJ1ZmZlclRhZzpyZXR1cm4gY2xvbmVBcnJheUJ1ZmZlcihvYmplY3QpO2Nhc2UgYm9vbFRhZzpjYXNlIGRhdGVUYWc6cmV0dXJuIG5ldyBDdG9yKCtvYmplY3QpO2Nhc2UgZGF0YVZpZXdUYWc6cmV0dXJuIGNsb25lRGF0YVZpZXcob2JqZWN0LGlzRGVlcCk7Y2FzZSBmbG9hdDMyVGFnOmNhc2UgZmxvYXQ2NFRhZzpjYXNlIGludDhUYWc6Y2FzZSBpbnQxNlRhZzpjYXNlIGludDMyVGFnOmNhc2UgdWludDhUYWc6Y2FzZSB1aW50OENsYW1wZWRUYWc6Y2FzZSB1aW50MTZUYWc6Y2FzZSB1aW50MzJUYWc6cmV0dXJuIGNsb25lVHlwZWRBcnJheShvYmplY3QsaXNEZWVwKTtjYXNlIG1hcFRhZzpyZXR1cm4gbmV3IEN0b3I7Y2FzZSBudW1iZXJUYWc6Y2FzZSBzdHJpbmdUYWc6cmV0dXJuIG5ldyBDdG9yKG9iamVjdCk7Y2FzZSByZWdleHBUYWc6cmV0dXJuIGNsb25lUmVnRXhwKG9iamVjdCk7CmNhc2Ugc2V0VGFnOnJldHVybiBuZXcgQ3RvcjtjYXNlIHN5bWJvbFRhZzpyZXR1cm4gY2xvbmVTeW1ib2wob2JqZWN0KX19ZnVuY3Rpb24gaW5zZXJ0V3JhcERldGFpbHMoc291cmNlLGRldGFpbHMpe3ZhciBsZW5ndGg9ZGV0YWlscy5sZW5ndGg7aWYoIWxlbmd0aClyZXR1cm4gc291cmNlO3ZhciBsYXN0SW5kZXg9bGVuZ3RoLTE7ZGV0YWlsc1tsYXN0SW5kZXhdPShsZW5ndGg+MT8iXHgyNiAiOiIiKStkZXRhaWxzW2xhc3RJbmRleF07ZGV0YWlscz1kZXRhaWxzLmpvaW4obGVuZ3RoPjI/IiwgIjoiICIpO3JldHVybiBzb3VyY2UucmVwbGFjZShyZVdyYXBDb21tZW50LCJ7XG4vKiBbd3JhcHBlZCB3aXRoICIrZGV0YWlscysiXSAqL1xuIil9ZnVuY3Rpb24gaXNGbGF0dGVuYWJsZSh2YWx1ZSl7cmV0dXJuIGlzQXJyYXkodmFsdWUpfHxpc0FyZ3VtZW50cyh2YWx1ZSl8fCEhKHNwcmVhZGFibGVTeW1ib2wmJnZhbHVlJiZ2YWx1ZVtzcHJlYWRhYmxlU3ltYm9sXSl9ZnVuY3Rpb24gaXNJbmRleCh2YWx1ZSwKbGVuZ3RoKXt2YXIgdHlwZT10eXBlb2YgdmFsdWU7bGVuZ3RoPWxlbmd0aD09bnVsbD9NQVhfU0FGRV9JTlRFR0VSOmxlbmd0aDtyZXR1cm4hIWxlbmd0aCYmKHR5cGU9PSJudW1iZXIifHx0eXBlIT0ic3ltYm9sIiYmcmVJc1VpbnQudGVzdCh2YWx1ZSkpJiYodmFsdWU+LTEmJnZhbHVlJTE9PTAmJnZhbHVlPGxlbmd0aCl9ZnVuY3Rpb24gaXNJdGVyYXRlZUNhbGwodmFsdWUsaW5kZXgsb2JqZWN0KXtpZighaXNPYmplY3Qob2JqZWN0KSlyZXR1cm4gZmFsc2U7dmFyIHR5cGU9dHlwZW9mIGluZGV4O2lmKHR5cGU9PSJudW1iZXIiP2lzQXJyYXlMaWtlKG9iamVjdCkmJmlzSW5kZXgoaW5kZXgsb2JqZWN0Lmxlbmd0aCk6dHlwZT09InN0cmluZyImJmluZGV4IGluIG9iamVjdClyZXR1cm4gZXEob2JqZWN0W2luZGV4XSx2YWx1ZSk7cmV0dXJuIGZhbHNlfWZ1bmN0aW9uIGlzS2V5KHZhbHVlLG9iamVjdCl7aWYoaXNBcnJheSh2YWx1ZSkpcmV0dXJuIGZhbHNlO3ZhciB0eXBlPXR5cGVvZiB2YWx1ZTsKaWYodHlwZT09Im51bWJlciJ8fHR5cGU9PSJzeW1ib2wifHx0eXBlPT0iYm9vbGVhbiJ8fHZhbHVlPT1udWxsfHxpc1N5bWJvbCh2YWx1ZSkpcmV0dXJuIHRydWU7cmV0dXJuIHJlSXNQbGFpblByb3AudGVzdCh2YWx1ZSl8fCFyZUlzRGVlcFByb3AudGVzdCh2YWx1ZSl8fG9iamVjdCE9bnVsbCYmdmFsdWUgaW4gT2JqZWN0KG9iamVjdCl9ZnVuY3Rpb24gaXNLZXlhYmxlKHZhbHVlKXt2YXIgdHlwZT10eXBlb2YgdmFsdWU7cmV0dXJuIHR5cGU9PSJzdHJpbmcifHx0eXBlPT0ibnVtYmVyInx8dHlwZT09InN5bWJvbCJ8fHR5cGU9PSJib29sZWFuIj92YWx1ZSE9PSJfX3Byb3RvX18iOnZhbHVlPT09bnVsbH1mdW5jdGlvbiBpc0xhemlhYmxlKGZ1bmMpe3ZhciBmdW5jTmFtZT1nZXRGdW5jTmFtZShmdW5jKSxvdGhlcj1sb2Rhc2hbZnVuY05hbWVdO2lmKHR5cGVvZiBvdGhlciE9ImZ1bmN0aW9uInx8IShmdW5jTmFtZSBpbiBMYXp5V3JhcHBlci5wcm90b3R5cGUpKXJldHVybiBmYWxzZTsKaWYoZnVuYz09PW90aGVyKXJldHVybiB0cnVlO3ZhciBkYXRhPWdldERhdGEob3RoZXIpO3JldHVybiEhZGF0YSYmZnVuYz09PWRhdGFbMF19ZnVuY3Rpb24gaXNNYXNrZWQoZnVuYyl7cmV0dXJuISFtYXNrU3JjS2V5JiZtYXNrU3JjS2V5IGluIGZ1bmN9dmFyIGlzTWFza2FibGU9Y29yZUpzRGF0YT9pc0Z1bmN0aW9uOnN0dWJGYWxzZTtmdW5jdGlvbiBpc1Byb3RvdHlwZSh2YWx1ZSl7dmFyIEN0b3I9dmFsdWUmJnZhbHVlLmNvbnN0cnVjdG9yLHByb3RvPXR5cGVvZiBDdG9yPT0iZnVuY3Rpb24iJiZDdG9yLnByb3RvdHlwZXx8b2JqZWN0UHJvdG87cmV0dXJuIHZhbHVlPT09cHJvdG99ZnVuY3Rpb24gaXNTdHJpY3RDb21wYXJhYmxlKHZhbHVlKXtyZXR1cm4gdmFsdWU9PT12YWx1ZSYmIWlzT2JqZWN0KHZhbHVlKX1mdW5jdGlvbiBtYXRjaGVzU3RyaWN0Q29tcGFyYWJsZShrZXksc3JjVmFsdWUpe3JldHVybiBmdW5jdGlvbihvYmplY3Qpe2lmKG9iamVjdD09bnVsbClyZXR1cm4gZmFsc2U7CnJldHVybiBvYmplY3Rba2V5XT09PXNyY1ZhbHVlJiYoc3JjVmFsdWUhPT11bmRlZmluZWR8fGtleSBpbiBPYmplY3Qob2JqZWN0KSl9fWZ1bmN0aW9uIG1lbW9pemVDYXBwZWQoZnVuYyl7dmFyIHJlc3VsdD1tZW1vaXplKGZ1bmMsZnVuY3Rpb24oa2V5KXtpZihjYWNoZS5zaXplPT09TUFYX01FTU9JWkVfU0laRSljYWNoZS5jbGVhcigpO3JldHVybiBrZXl9KTt2YXIgY2FjaGU9cmVzdWx0LmNhY2hlO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gbWVyZ2VEYXRhKGRhdGEsc291cmNlKXt2YXIgYml0bWFzaz1kYXRhWzFdLHNyY0JpdG1hc2s9c291cmNlWzFdLG5ld0JpdG1hc2s9Yml0bWFza3xzcmNCaXRtYXNrLGlzQ29tbW9uPW5ld0JpdG1hc2s8KFdSQVBfQklORF9GTEFHfFdSQVBfQklORF9LRVlfRkxBR3xXUkFQX0FSWV9GTEFHKTt2YXIgaXNDb21ibz1zcmNCaXRtYXNrPT1XUkFQX0FSWV9GTEFHJiZiaXRtYXNrPT1XUkFQX0NVUlJZX0ZMQUd8fHNyY0JpdG1hc2s9PVdSQVBfQVJZX0ZMQUcmJgpiaXRtYXNrPT1XUkFQX1JFQVJHX0ZMQUcmJmRhdGFbN10ubGVuZ3RoPD1zb3VyY2VbOF18fHNyY0JpdG1hc2s9PShXUkFQX0FSWV9GTEFHfFdSQVBfUkVBUkdfRkxBRykmJnNvdXJjZVs3XS5sZW5ndGg8PXNvdXJjZVs4XSYmYml0bWFzaz09V1JBUF9DVVJSWV9GTEFHO2lmKCEoaXNDb21tb258fGlzQ29tYm8pKXJldHVybiBkYXRhO2lmKHNyY0JpdG1hc2smV1JBUF9CSU5EX0ZMQUcpe2RhdGFbMl09c291cmNlWzJdO25ld0JpdG1hc2t8PWJpdG1hc2smV1JBUF9CSU5EX0ZMQUc/MDpXUkFQX0NVUlJZX0JPVU5EX0ZMQUd9dmFyIHZhbHVlPXNvdXJjZVszXTtpZih2YWx1ZSl7dmFyIHBhcnRpYWxzPWRhdGFbM107ZGF0YVszXT1wYXJ0aWFscz9jb21wb3NlQXJncyhwYXJ0aWFscyx2YWx1ZSxzb3VyY2VbNF0pOnZhbHVlO2RhdGFbNF09cGFydGlhbHM/cmVwbGFjZUhvbGRlcnMoZGF0YVszXSxQTEFDRUhPTERFUik6c291cmNlWzRdfXZhbHVlPXNvdXJjZVs1XTtpZih2YWx1ZSl7cGFydGlhbHM9CmRhdGFbNV07ZGF0YVs1XT1wYXJ0aWFscz9jb21wb3NlQXJnc1JpZ2h0KHBhcnRpYWxzLHZhbHVlLHNvdXJjZVs2XSk6dmFsdWU7ZGF0YVs2XT1wYXJ0aWFscz9yZXBsYWNlSG9sZGVycyhkYXRhWzVdLFBMQUNFSE9MREVSKTpzb3VyY2VbNl19dmFsdWU9c291cmNlWzddO2lmKHZhbHVlKWRhdGFbN109dmFsdWU7aWYoc3JjQml0bWFzayZXUkFQX0FSWV9GTEFHKWRhdGFbOF09ZGF0YVs4XT09bnVsbD9zb3VyY2VbOF06bmF0aXZlTWluKGRhdGFbOF0sc291cmNlWzhdKTtpZihkYXRhWzldPT1udWxsKWRhdGFbOV09c291cmNlWzldO2RhdGFbMF09c291cmNlWzBdO2RhdGFbMV09bmV3Qml0bWFzaztyZXR1cm4gZGF0YX1mdW5jdGlvbiBuYXRpdmVLZXlzSW4ob2JqZWN0KXt2YXIgcmVzdWx0PVtdO2lmKG9iamVjdCE9bnVsbClmb3IodmFyIGtleSBpbiBPYmplY3Qob2JqZWN0KSlyZXN1bHQucHVzaChrZXkpO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gb2JqZWN0VG9TdHJpbmcodmFsdWUpe3JldHVybiBuYXRpdmVPYmplY3RUb1N0cmluZy5jYWxsKHZhbHVlKX0KZnVuY3Rpb24gb3ZlclJlc3QoZnVuYyxzdGFydCx0cmFuc2Zvcm0pe3N0YXJ0PW5hdGl2ZU1heChzdGFydD09PXVuZGVmaW5lZD9mdW5jLmxlbmd0aC0xOnN0YXJ0LDApO3JldHVybiBmdW5jdGlvbigpe3ZhciBhcmdzPWFyZ3VtZW50cyxpbmRleD0tMSxsZW5ndGg9bmF0aXZlTWF4KGFyZ3MubGVuZ3RoLXN0YXJ0LDApLGFycmF5PUFycmF5KGxlbmd0aCk7d2hpbGUoKytpbmRleDxsZW5ndGgpYXJyYXlbaW5kZXhdPWFyZ3Nbc3RhcnQraW5kZXhdO2luZGV4PS0xO3ZhciBvdGhlckFyZ3M9QXJyYXkoc3RhcnQrMSk7d2hpbGUoKytpbmRleDxzdGFydClvdGhlckFyZ3NbaW5kZXhdPWFyZ3NbaW5kZXhdO290aGVyQXJnc1tzdGFydF09dHJhbnNmb3JtKGFycmF5KTtyZXR1cm4gYXBwbHkoZnVuYyx0aGlzLG90aGVyQXJncyl9fWZ1bmN0aW9uIHBhcmVudChvYmplY3QscGF0aCl7cmV0dXJuIHBhdGgubGVuZ3RoPDI/b2JqZWN0OmJhc2VHZXQob2JqZWN0LGJhc2VTbGljZShwYXRoLDAsLTEpKX0KZnVuY3Rpb24gcmVvcmRlcihhcnJheSxpbmRleGVzKXt2YXIgYXJyTGVuZ3RoPWFycmF5Lmxlbmd0aCxsZW5ndGg9bmF0aXZlTWluKGluZGV4ZXMubGVuZ3RoLGFyckxlbmd0aCksb2xkQXJyYXk9Y29weUFycmF5KGFycmF5KTt3aGlsZShsZW5ndGgtLSl7dmFyIGluZGV4PWluZGV4ZXNbbGVuZ3RoXTthcnJheVtsZW5ndGhdPWlzSW5kZXgoaW5kZXgsYXJyTGVuZ3RoKT9vbGRBcnJheVtpbmRleF06dW5kZWZpbmVkfXJldHVybiBhcnJheX12YXIgc2V0RGF0YT1zaG9ydE91dChiYXNlU2V0RGF0YSk7dmFyIHNldFRpbWVvdXQ9Y3R4U2V0VGltZW91dHx8ZnVuY3Rpb24oZnVuYyx3YWl0KXtyZXR1cm4gcm9vdC5zZXRUaW1lb3V0KGZ1bmMsd2FpdCl9O3ZhciBzZXRUb1N0cmluZz1zaG9ydE91dChiYXNlU2V0VG9TdHJpbmcpO2Z1bmN0aW9uIHNldFdyYXBUb1N0cmluZyh3cmFwcGVyLHJlZmVyZW5jZSxiaXRtYXNrKXt2YXIgc291cmNlPXJlZmVyZW5jZSsiIjtyZXR1cm4gc2V0VG9TdHJpbmcod3JhcHBlciwKaW5zZXJ0V3JhcERldGFpbHMoc291cmNlLHVwZGF0ZVdyYXBEZXRhaWxzKGdldFdyYXBEZXRhaWxzKHNvdXJjZSksYml0bWFzaykpKX1mdW5jdGlvbiBzaG9ydE91dChmdW5jKXt2YXIgY291bnQ9MCxsYXN0Q2FsbGVkPTA7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHN0YW1wPW5hdGl2ZU5vdygpLHJlbWFpbmluZz1IT1RfU1BBTi0oc3RhbXAtbGFzdENhbGxlZCk7bGFzdENhbGxlZD1zdGFtcDtpZihyZW1haW5pbmc+MCl7aWYoKytjb3VudD49SE9UX0NPVU5UKXJldHVybiBhcmd1bWVudHNbMF19ZWxzZSBjb3VudD0wO3JldHVybiBmdW5jLmFwcGx5KHVuZGVmaW5lZCxhcmd1bWVudHMpfX1mdW5jdGlvbiBzaHVmZmxlU2VsZihhcnJheSxzaXplKXt2YXIgaW5kZXg9LTEsbGVuZ3RoPWFycmF5Lmxlbmd0aCxsYXN0SW5kZXg9bGVuZ3RoLTE7c2l6ZT1zaXplPT09dW5kZWZpbmVkP2xlbmd0aDpzaXplO3doaWxlKCsraW5kZXg8c2l6ZSl7dmFyIHJhbmQ9YmFzZVJhbmRvbShpbmRleCxsYXN0SW5kZXgpLAp2YWx1ZT1hcnJheVtyYW5kXTthcnJheVtyYW5kXT1hcnJheVtpbmRleF07YXJyYXlbaW5kZXhdPXZhbHVlfWFycmF5Lmxlbmd0aD1zaXplO3JldHVybiBhcnJheX12YXIgc3RyaW5nVG9QYXRoPW1lbW9pemVDYXBwZWQoZnVuY3Rpb24oc3RyaW5nKXt2YXIgcmVzdWx0PVtdO2lmKHN0cmluZy5jaGFyQ29kZUF0KDApPT09NDYpcmVzdWx0LnB1c2goIiIpO3N0cmluZy5yZXBsYWNlKHJlUHJvcE5hbWUsZnVuY3Rpb24obWF0Y2gsbnVtYmVyLHF1b3RlLHN1YlN0cmluZyl7cmVzdWx0LnB1c2gocXVvdGU/c3ViU3RyaW5nLnJlcGxhY2UocmVFc2NhcGVDaGFyLCIkMSIpOm51bWJlcnx8bWF0Y2gpfSk7cmV0dXJuIHJlc3VsdH0pO2Z1bmN0aW9uIHRvS2V5KHZhbHVlKXtpZih0eXBlb2YgdmFsdWU9PSJzdHJpbmcifHxpc1N5bWJvbCh2YWx1ZSkpcmV0dXJuIHZhbHVlO3ZhciByZXN1bHQ9dmFsdWUrIiI7cmV0dXJuIHJlc3VsdD09IjAiJiYxL3ZhbHVlPT0tSU5GSU5JVFk/Ii0wIjpyZXN1bHR9CmZ1bmN0aW9uIHRvU291cmNlKGZ1bmMpe2lmKGZ1bmMhPW51bGwpe3RyeXtyZXR1cm4gZnVuY1RvU3RyaW5nLmNhbGwoZnVuYyl9Y2F0Y2goZSl7fXRyeXtyZXR1cm4gZnVuYysiIn1jYXRjaChlJDApe319cmV0dXJuIiJ9ZnVuY3Rpb24gdXBkYXRlV3JhcERldGFpbHMoZGV0YWlscyxiaXRtYXNrKXthcnJheUVhY2god3JhcEZsYWdzLGZ1bmN0aW9uKHBhaXIpe3ZhciB2YWx1ZT0iXy4iK3BhaXJbMF07aWYoYml0bWFzayZwYWlyWzFdJiYhYXJyYXlJbmNsdWRlcyhkZXRhaWxzLHZhbHVlKSlkZXRhaWxzLnB1c2godmFsdWUpfSk7cmV0dXJuIGRldGFpbHMuc29ydCgpfWZ1bmN0aW9uIHdyYXBwZXJDbG9uZSh3cmFwcGVyKXtpZih3cmFwcGVyIGluc3RhbmNlb2YgTGF6eVdyYXBwZXIpcmV0dXJuIHdyYXBwZXIuY2xvbmUoKTt2YXIgcmVzdWx0PW5ldyBMb2Rhc2hXcmFwcGVyKHdyYXBwZXIuX193cmFwcGVkX18sd3JhcHBlci5fX2NoYWluX18pO3Jlc3VsdC5fX2FjdGlvbnNfXz1jb3B5QXJyYXkod3JhcHBlci5fX2FjdGlvbnNfXyk7CnJlc3VsdC5fX2luZGV4X189d3JhcHBlci5fX2luZGV4X187cmVzdWx0Ll9fdmFsdWVzX189d3JhcHBlci5fX3ZhbHVlc19fO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gY2h1bmsoYXJyYXksc2l6ZSxndWFyZCl7aWYoZ3VhcmQ/aXNJdGVyYXRlZUNhbGwoYXJyYXksc2l6ZSxndWFyZCk6c2l6ZT09PXVuZGVmaW5lZClzaXplPTE7ZWxzZSBzaXplPW5hdGl2ZU1heCh0b0ludGVnZXIoc2l6ZSksMCk7dmFyIGxlbmd0aD1hcnJheT09bnVsbD8wOmFycmF5Lmxlbmd0aDtpZighbGVuZ3RofHxzaXplPDEpcmV0dXJuW107dmFyIGluZGV4PTAscmVzSW5kZXg9MCxyZXN1bHQ9QXJyYXkobmF0aXZlQ2VpbChsZW5ndGgvc2l6ZSkpO3doaWxlKGluZGV4PGxlbmd0aClyZXN1bHRbcmVzSW5kZXgrK109YmFzZVNsaWNlKGFycmF5LGluZGV4LGluZGV4Kz1zaXplKTtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGNvbXBhY3QoYXJyYXkpe3ZhciBpbmRleD0tMSxsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGgsCnJlc0luZGV4PTAscmVzdWx0PVtdO3doaWxlKCsraW5kZXg8bGVuZ3RoKXt2YXIgdmFsdWU9YXJyYXlbaW5kZXhdO2lmKHZhbHVlKXJlc3VsdFtyZXNJbmRleCsrXT12YWx1ZX1yZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGNvbmNhdCgpe3ZhciBsZW5ndGg9YXJndW1lbnRzLmxlbmd0aDtpZighbGVuZ3RoKXJldHVybltdO3ZhciBhcmdzPUFycmF5KGxlbmd0aC0xKSxhcnJheT1hcmd1bWVudHNbMF0saW5kZXg9bGVuZ3RoO3doaWxlKGluZGV4LS0pYXJnc1tpbmRleC0xXT1hcmd1bWVudHNbaW5kZXhdO3JldHVybiBhcnJheVB1c2goaXNBcnJheShhcnJheSk/Y29weUFycmF5KGFycmF5KTpbYXJyYXldLGJhc2VGbGF0dGVuKGFyZ3MsMSkpfXZhciBkaWZmZXJlbmNlPWJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5LHZhbHVlcyl7cmV0dXJuIGlzQXJyYXlMaWtlT2JqZWN0KGFycmF5KT9iYXNlRGlmZmVyZW5jZShhcnJheSxiYXNlRmxhdHRlbih2YWx1ZXMsMSxpc0FycmF5TGlrZU9iamVjdCx0cnVlKSk6CltdfSk7dmFyIGRpZmZlcmVuY2VCeT1iYXNlUmVzdChmdW5jdGlvbihhcnJheSx2YWx1ZXMpe3ZhciBpdGVyYXRlZT1sYXN0KHZhbHVlcyk7aWYoaXNBcnJheUxpa2VPYmplY3QoaXRlcmF0ZWUpKWl0ZXJhdGVlPXVuZGVmaW5lZDtyZXR1cm4gaXNBcnJheUxpa2VPYmplY3QoYXJyYXkpP2Jhc2VEaWZmZXJlbmNlKGFycmF5LGJhc2VGbGF0dGVuKHZhbHVlcywxLGlzQXJyYXlMaWtlT2JqZWN0LHRydWUpLGdldEl0ZXJhdGVlKGl0ZXJhdGVlLDIpKTpbXX0pO3ZhciBkaWZmZXJlbmNlV2l0aD1iYXNlUmVzdChmdW5jdGlvbihhcnJheSx2YWx1ZXMpe3ZhciBjb21wYXJhdG9yPWxhc3QodmFsdWVzKTtpZihpc0FycmF5TGlrZU9iamVjdChjb21wYXJhdG9yKSljb21wYXJhdG9yPXVuZGVmaW5lZDtyZXR1cm4gaXNBcnJheUxpa2VPYmplY3QoYXJyYXkpP2Jhc2VEaWZmZXJlbmNlKGFycmF5LGJhc2VGbGF0dGVuKHZhbHVlcywxLGlzQXJyYXlMaWtlT2JqZWN0LHRydWUpLHVuZGVmaW5lZCxjb21wYXJhdG9yKToKW119KTtmdW5jdGlvbiBkcm9wKGFycmF5LG4sZ3VhcmQpe3ZhciBsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7aWYoIWxlbmd0aClyZXR1cm5bXTtuPWd1YXJkfHxuPT09dW5kZWZpbmVkPzE6dG9JbnRlZ2VyKG4pO3JldHVybiBiYXNlU2xpY2UoYXJyYXksbjwwPzA6bixsZW5ndGgpfWZ1bmN0aW9uIGRyb3BSaWdodChhcnJheSxuLGd1YXJkKXt2YXIgbGVuZ3RoPWFycmF5PT1udWxsPzA6YXJyYXkubGVuZ3RoO2lmKCFsZW5ndGgpcmV0dXJuW107bj1ndWFyZHx8bj09PXVuZGVmaW5lZD8xOnRvSW50ZWdlcihuKTtuPWxlbmd0aC1uO3JldHVybiBiYXNlU2xpY2UoYXJyYXksMCxuPDA/MDpuKX1mdW5jdGlvbiBkcm9wUmlnaHRXaGlsZShhcnJheSxwcmVkaWNhdGUpe3JldHVybiBhcnJheSYmYXJyYXkubGVuZ3RoP2Jhc2VXaGlsZShhcnJheSxnZXRJdGVyYXRlZShwcmVkaWNhdGUsMyksdHJ1ZSx0cnVlKTpbXX1mdW5jdGlvbiBkcm9wV2hpbGUoYXJyYXkscHJlZGljYXRlKXtyZXR1cm4gYXJyYXkmJgphcnJheS5sZW5ndGg/YmFzZVdoaWxlKGFycmF5LGdldEl0ZXJhdGVlKHByZWRpY2F0ZSwzKSx0cnVlKTpbXX1mdW5jdGlvbiBmaWxsKGFycmF5LHZhbHVlLHN0YXJ0LGVuZCl7dmFyIGxlbmd0aD1hcnJheT09bnVsbD8wOmFycmF5Lmxlbmd0aDtpZighbGVuZ3RoKXJldHVybltdO2lmKHN0YXJ0JiZ0eXBlb2Ygc3RhcnQhPSJudW1iZXIiJiZpc0l0ZXJhdGVlQ2FsbChhcnJheSx2YWx1ZSxzdGFydCkpe3N0YXJ0PTA7ZW5kPWxlbmd0aH1yZXR1cm4gYmFzZUZpbGwoYXJyYXksdmFsdWUsc3RhcnQsZW5kKX1mdW5jdGlvbiBmaW5kSW5kZXgoYXJyYXkscHJlZGljYXRlLGZyb21JbmRleCl7dmFyIGxlbmd0aD1hcnJheT09bnVsbD8wOmFycmF5Lmxlbmd0aDtpZighbGVuZ3RoKXJldHVybi0xO3ZhciBpbmRleD1mcm9tSW5kZXg9PW51bGw/MDp0b0ludGVnZXIoZnJvbUluZGV4KTtpZihpbmRleDwwKWluZGV4PW5hdGl2ZU1heChsZW5ndGgraW5kZXgsMCk7cmV0dXJuIGJhc2VGaW5kSW5kZXgoYXJyYXksCmdldEl0ZXJhdGVlKHByZWRpY2F0ZSwzKSxpbmRleCl9ZnVuY3Rpb24gZmluZExhc3RJbmRleChhcnJheSxwcmVkaWNhdGUsZnJvbUluZGV4KXt2YXIgbGVuZ3RoPWFycmF5PT1udWxsPzA6YXJyYXkubGVuZ3RoO2lmKCFsZW5ndGgpcmV0dXJuLTE7dmFyIGluZGV4PWxlbmd0aC0xO2lmKGZyb21JbmRleCE9PXVuZGVmaW5lZCl7aW5kZXg9dG9JbnRlZ2VyKGZyb21JbmRleCk7aW5kZXg9ZnJvbUluZGV4PDA/bmF0aXZlTWF4KGxlbmd0aCtpbmRleCwwKTpuYXRpdmVNaW4oaW5kZXgsbGVuZ3RoLTEpfXJldHVybiBiYXNlRmluZEluZGV4KGFycmF5LGdldEl0ZXJhdGVlKHByZWRpY2F0ZSwzKSxpbmRleCx0cnVlKX1mdW5jdGlvbiBmbGF0dGVuKGFycmF5KXt2YXIgbGVuZ3RoPWFycmF5PT1udWxsPzA6YXJyYXkubGVuZ3RoO3JldHVybiBsZW5ndGg/YmFzZUZsYXR0ZW4oYXJyYXksMSk6W119ZnVuY3Rpb24gZmxhdHRlbkRlZXAoYXJyYXkpe3ZhciBsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7CnJldHVybiBsZW5ndGg/YmFzZUZsYXR0ZW4oYXJyYXksSU5GSU5JVFkpOltdfWZ1bmN0aW9uIGZsYXR0ZW5EZXB0aChhcnJheSxkZXB0aCl7dmFyIGxlbmd0aD1hcnJheT09bnVsbD8wOmFycmF5Lmxlbmd0aDtpZighbGVuZ3RoKXJldHVybltdO2RlcHRoPWRlcHRoPT09dW5kZWZpbmVkPzE6dG9JbnRlZ2VyKGRlcHRoKTtyZXR1cm4gYmFzZUZsYXR0ZW4oYXJyYXksZGVwdGgpfWZ1bmN0aW9uIGZyb21QYWlycyhwYWlycyl7dmFyIGluZGV4PS0xLGxlbmd0aD1wYWlycz09bnVsbD8wOnBhaXJzLmxlbmd0aCxyZXN1bHQ9e307d2hpbGUoKytpbmRleDxsZW5ndGgpe3ZhciBwYWlyPXBhaXJzW2luZGV4XTtyZXN1bHRbcGFpclswXV09cGFpclsxXX1yZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGhlYWQoYXJyYXkpe3JldHVybiBhcnJheSYmYXJyYXkubGVuZ3RoP2FycmF5WzBdOnVuZGVmaW5lZH1mdW5jdGlvbiBpbmRleE9mKGFycmF5LHZhbHVlLGZyb21JbmRleCl7dmFyIGxlbmd0aD1hcnJheT09Cm51bGw/MDphcnJheS5sZW5ndGg7aWYoIWxlbmd0aClyZXR1cm4tMTt2YXIgaW5kZXg9ZnJvbUluZGV4PT1udWxsPzA6dG9JbnRlZ2VyKGZyb21JbmRleCk7aWYoaW5kZXg8MClpbmRleD1uYXRpdmVNYXgobGVuZ3RoK2luZGV4LDApO3JldHVybiBiYXNlSW5kZXhPZihhcnJheSx2YWx1ZSxpbmRleCl9ZnVuY3Rpb24gaW5pdGlhbChhcnJheSl7dmFyIGxlbmd0aD1hcnJheT09bnVsbD8wOmFycmF5Lmxlbmd0aDtyZXR1cm4gbGVuZ3RoP2Jhc2VTbGljZShhcnJheSwwLC0xKTpbXX12YXIgaW50ZXJzZWN0aW9uPWJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5cyl7dmFyIG1hcHBlZD1hcnJheU1hcChhcnJheXMsY2FzdEFycmF5TGlrZU9iamVjdCk7cmV0dXJuIG1hcHBlZC5sZW5ndGgmJm1hcHBlZFswXT09PWFycmF5c1swXT9iYXNlSW50ZXJzZWN0aW9uKG1hcHBlZCk6W119KTt2YXIgaW50ZXJzZWN0aW9uQnk9YmFzZVJlc3QoZnVuY3Rpb24oYXJyYXlzKXt2YXIgaXRlcmF0ZWU9bGFzdChhcnJheXMpLAptYXBwZWQ9YXJyYXlNYXAoYXJyYXlzLGNhc3RBcnJheUxpa2VPYmplY3QpO2lmKGl0ZXJhdGVlPT09bGFzdChtYXBwZWQpKWl0ZXJhdGVlPXVuZGVmaW5lZDtlbHNlIG1hcHBlZC5wb3AoKTtyZXR1cm4gbWFwcGVkLmxlbmd0aCYmbWFwcGVkWzBdPT09YXJyYXlzWzBdP2Jhc2VJbnRlcnNlY3Rpb24obWFwcGVkLGdldEl0ZXJhdGVlKGl0ZXJhdGVlLDIpKTpbXX0pO3ZhciBpbnRlcnNlY3Rpb25XaXRoPWJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5cyl7dmFyIGNvbXBhcmF0b3I9bGFzdChhcnJheXMpLG1hcHBlZD1hcnJheU1hcChhcnJheXMsY2FzdEFycmF5TGlrZU9iamVjdCk7Y29tcGFyYXRvcj10eXBlb2YgY29tcGFyYXRvcj09ImZ1bmN0aW9uIj9jb21wYXJhdG9yOnVuZGVmaW5lZDtpZihjb21wYXJhdG9yKW1hcHBlZC5wb3AoKTtyZXR1cm4gbWFwcGVkLmxlbmd0aCYmbWFwcGVkWzBdPT09YXJyYXlzWzBdP2Jhc2VJbnRlcnNlY3Rpb24obWFwcGVkLHVuZGVmaW5lZCxjb21wYXJhdG9yKToKW119KTtmdW5jdGlvbiBqb2luKGFycmF5LHNlcGFyYXRvcil7cmV0dXJuIGFycmF5PT1udWxsPyIiOm5hdGl2ZUpvaW4uY2FsbChhcnJheSxzZXBhcmF0b3IpfWZ1bmN0aW9uIGxhc3QoYXJyYXkpe3ZhciBsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7cmV0dXJuIGxlbmd0aD9hcnJheVtsZW5ndGgtMV06dW5kZWZpbmVkfWZ1bmN0aW9uIGxhc3RJbmRleE9mKGFycmF5LHZhbHVlLGZyb21JbmRleCl7dmFyIGxlbmd0aD1hcnJheT09bnVsbD8wOmFycmF5Lmxlbmd0aDtpZighbGVuZ3RoKXJldHVybi0xO3ZhciBpbmRleD1sZW5ndGg7aWYoZnJvbUluZGV4IT09dW5kZWZpbmVkKXtpbmRleD10b0ludGVnZXIoZnJvbUluZGV4KTtpbmRleD1pbmRleDwwP25hdGl2ZU1heChsZW5ndGgraW5kZXgsMCk6bmF0aXZlTWluKGluZGV4LGxlbmd0aC0xKX1yZXR1cm4gdmFsdWU9PT12YWx1ZT9zdHJpY3RMYXN0SW5kZXhPZihhcnJheSx2YWx1ZSxpbmRleCk6YmFzZUZpbmRJbmRleChhcnJheSwKYmFzZUlzTmFOLGluZGV4LHRydWUpfWZ1bmN0aW9uIG50aChhcnJheSxuKXtyZXR1cm4gYXJyYXkmJmFycmF5Lmxlbmd0aD9iYXNlTnRoKGFycmF5LHRvSW50ZWdlcihuKSk6dW5kZWZpbmVkfXZhciBwdWxsPWJhc2VSZXN0KHB1bGxBbGwpO2Z1bmN0aW9uIHB1bGxBbGwoYXJyYXksdmFsdWVzKXtyZXR1cm4gYXJyYXkmJmFycmF5Lmxlbmd0aCYmdmFsdWVzJiZ2YWx1ZXMubGVuZ3RoP2Jhc2VQdWxsQWxsKGFycmF5LHZhbHVlcyk6YXJyYXl9ZnVuY3Rpb24gcHVsbEFsbEJ5KGFycmF5LHZhbHVlcyxpdGVyYXRlZSl7cmV0dXJuIGFycmF5JiZhcnJheS5sZW5ndGgmJnZhbHVlcyYmdmFsdWVzLmxlbmd0aD9iYXNlUHVsbEFsbChhcnJheSx2YWx1ZXMsZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsMikpOmFycmF5fWZ1bmN0aW9uIHB1bGxBbGxXaXRoKGFycmF5LHZhbHVlcyxjb21wYXJhdG9yKXtyZXR1cm4gYXJyYXkmJmFycmF5Lmxlbmd0aCYmdmFsdWVzJiZ2YWx1ZXMubGVuZ3RoP2Jhc2VQdWxsQWxsKGFycmF5LAp2YWx1ZXMsdW5kZWZpbmVkLGNvbXBhcmF0b3IpOmFycmF5fXZhciBwdWxsQXQ9ZmxhdFJlc3QoZnVuY3Rpb24oYXJyYXksaW5kZXhlcyl7dmFyIGxlbmd0aD1hcnJheT09bnVsbD8wOmFycmF5Lmxlbmd0aCxyZXN1bHQ9YmFzZUF0KGFycmF5LGluZGV4ZXMpO2Jhc2VQdWxsQXQoYXJyYXksYXJyYXlNYXAoaW5kZXhlcyxmdW5jdGlvbihpbmRleCl7cmV0dXJuIGlzSW5kZXgoaW5kZXgsbGVuZ3RoKT8raW5kZXg6aW5kZXh9KS5zb3J0KGNvbXBhcmVBc2NlbmRpbmcpKTtyZXR1cm4gcmVzdWx0fSk7ZnVuY3Rpb24gcmVtb3ZlKGFycmF5LHByZWRpY2F0ZSl7dmFyIHJlc3VsdD1bXTtpZighKGFycmF5JiZhcnJheS5sZW5ndGgpKXJldHVybiByZXN1bHQ7dmFyIGluZGV4PS0xLGluZGV4ZXM9W10sbGVuZ3RoPWFycmF5Lmxlbmd0aDtwcmVkaWNhdGU9Z2V0SXRlcmF0ZWUocHJlZGljYXRlLDMpO3doaWxlKCsraW5kZXg8bGVuZ3RoKXt2YXIgdmFsdWU9YXJyYXlbaW5kZXhdO2lmKHByZWRpY2F0ZSh2YWx1ZSwKaW5kZXgsYXJyYXkpKXtyZXN1bHQucHVzaCh2YWx1ZSk7aW5kZXhlcy5wdXNoKGluZGV4KX19YmFzZVB1bGxBdChhcnJheSxpbmRleGVzKTtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIHJldmVyc2UoYXJyYXkpe3JldHVybiBhcnJheT09bnVsbD9hcnJheTpuYXRpdmVSZXZlcnNlLmNhbGwoYXJyYXkpfWZ1bmN0aW9uIHNsaWNlKGFycmF5LHN0YXJ0LGVuZCl7dmFyIGxlbmd0aD1hcnJheT09bnVsbD8wOmFycmF5Lmxlbmd0aDtpZighbGVuZ3RoKXJldHVybltdO2lmKGVuZCYmdHlwZW9mIGVuZCE9Im51bWJlciImJmlzSXRlcmF0ZWVDYWxsKGFycmF5LHN0YXJ0LGVuZCkpe3N0YXJ0PTA7ZW5kPWxlbmd0aH1lbHNle3N0YXJ0PXN0YXJ0PT1udWxsPzA6dG9JbnRlZ2VyKHN0YXJ0KTtlbmQ9ZW5kPT09dW5kZWZpbmVkP2xlbmd0aDp0b0ludGVnZXIoZW5kKX1yZXR1cm4gYmFzZVNsaWNlKGFycmF5LHN0YXJ0LGVuZCl9ZnVuY3Rpb24gc29ydGVkSW5kZXgoYXJyYXksdmFsdWUpe3JldHVybiBiYXNlU29ydGVkSW5kZXgoYXJyYXksCnZhbHVlKX1mdW5jdGlvbiBzb3J0ZWRJbmRleEJ5KGFycmF5LHZhbHVlLGl0ZXJhdGVlKXtyZXR1cm4gYmFzZVNvcnRlZEluZGV4QnkoYXJyYXksdmFsdWUsZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsMikpfWZ1bmN0aW9uIHNvcnRlZEluZGV4T2YoYXJyYXksdmFsdWUpe3ZhciBsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7aWYobGVuZ3RoKXt2YXIgaW5kZXg9YmFzZVNvcnRlZEluZGV4KGFycmF5LHZhbHVlKTtpZihpbmRleDxsZW5ndGgmJmVxKGFycmF5W2luZGV4XSx2YWx1ZSkpcmV0dXJuIGluZGV4fXJldHVybi0xfWZ1bmN0aW9uIHNvcnRlZExhc3RJbmRleChhcnJheSx2YWx1ZSl7cmV0dXJuIGJhc2VTb3J0ZWRJbmRleChhcnJheSx2YWx1ZSx0cnVlKX1mdW5jdGlvbiBzb3J0ZWRMYXN0SW5kZXhCeShhcnJheSx2YWx1ZSxpdGVyYXRlZSl7cmV0dXJuIGJhc2VTb3J0ZWRJbmRleEJ5KGFycmF5LHZhbHVlLGdldEl0ZXJhdGVlKGl0ZXJhdGVlLDIpLHRydWUpfWZ1bmN0aW9uIHNvcnRlZExhc3RJbmRleE9mKGFycmF5LAp2YWx1ZSl7dmFyIGxlbmd0aD1hcnJheT09bnVsbD8wOmFycmF5Lmxlbmd0aDtpZihsZW5ndGgpe3ZhciBpbmRleD1iYXNlU29ydGVkSW5kZXgoYXJyYXksdmFsdWUsdHJ1ZSktMTtpZihlcShhcnJheVtpbmRleF0sdmFsdWUpKXJldHVybiBpbmRleH1yZXR1cm4tMX1mdW5jdGlvbiBzb3J0ZWRVbmlxKGFycmF5KXtyZXR1cm4gYXJyYXkmJmFycmF5Lmxlbmd0aD9iYXNlU29ydGVkVW5pcShhcnJheSk6W119ZnVuY3Rpb24gc29ydGVkVW5pcUJ5KGFycmF5LGl0ZXJhdGVlKXtyZXR1cm4gYXJyYXkmJmFycmF5Lmxlbmd0aD9iYXNlU29ydGVkVW5pcShhcnJheSxnZXRJdGVyYXRlZShpdGVyYXRlZSwyKSk6W119ZnVuY3Rpb24gdGFpbChhcnJheSl7dmFyIGxlbmd0aD1hcnJheT09bnVsbD8wOmFycmF5Lmxlbmd0aDtyZXR1cm4gbGVuZ3RoP2Jhc2VTbGljZShhcnJheSwxLGxlbmd0aCk6W119ZnVuY3Rpb24gdGFrZShhcnJheSxuLGd1YXJkKXtpZighKGFycmF5JiZhcnJheS5sZW5ndGgpKXJldHVybltdOwpuPWd1YXJkfHxuPT09dW5kZWZpbmVkPzE6dG9JbnRlZ2VyKG4pO3JldHVybiBiYXNlU2xpY2UoYXJyYXksMCxuPDA/MDpuKX1mdW5jdGlvbiB0YWtlUmlnaHQoYXJyYXksbixndWFyZCl7dmFyIGxlbmd0aD1hcnJheT09bnVsbD8wOmFycmF5Lmxlbmd0aDtpZighbGVuZ3RoKXJldHVybltdO249Z3VhcmR8fG49PT11bmRlZmluZWQ/MTp0b0ludGVnZXIobik7bj1sZW5ndGgtbjtyZXR1cm4gYmFzZVNsaWNlKGFycmF5LG48MD8wOm4sbGVuZ3RoKX1mdW5jdGlvbiB0YWtlUmlnaHRXaGlsZShhcnJheSxwcmVkaWNhdGUpe3JldHVybiBhcnJheSYmYXJyYXkubGVuZ3RoP2Jhc2VXaGlsZShhcnJheSxnZXRJdGVyYXRlZShwcmVkaWNhdGUsMyksZmFsc2UsdHJ1ZSk6W119ZnVuY3Rpb24gdGFrZVdoaWxlKGFycmF5LHByZWRpY2F0ZSl7cmV0dXJuIGFycmF5JiZhcnJheS5sZW5ndGg/YmFzZVdoaWxlKGFycmF5LGdldEl0ZXJhdGVlKHByZWRpY2F0ZSwzKSk6W119dmFyIHVuaW9uPWJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5cyl7cmV0dXJuIGJhc2VVbmlxKGJhc2VGbGF0dGVuKGFycmF5cywKMSxpc0FycmF5TGlrZU9iamVjdCx0cnVlKSl9KTt2YXIgdW5pb25CeT1iYXNlUmVzdChmdW5jdGlvbihhcnJheXMpe3ZhciBpdGVyYXRlZT1sYXN0KGFycmF5cyk7aWYoaXNBcnJheUxpa2VPYmplY3QoaXRlcmF0ZWUpKWl0ZXJhdGVlPXVuZGVmaW5lZDtyZXR1cm4gYmFzZVVuaXEoYmFzZUZsYXR0ZW4oYXJyYXlzLDEsaXNBcnJheUxpa2VPYmplY3QsdHJ1ZSksZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsMikpfSk7dmFyIHVuaW9uV2l0aD1iYXNlUmVzdChmdW5jdGlvbihhcnJheXMpe3ZhciBjb21wYXJhdG9yPWxhc3QoYXJyYXlzKTtjb21wYXJhdG9yPXR5cGVvZiBjb21wYXJhdG9yPT0iZnVuY3Rpb24iP2NvbXBhcmF0b3I6dW5kZWZpbmVkO3JldHVybiBiYXNlVW5pcShiYXNlRmxhdHRlbihhcnJheXMsMSxpc0FycmF5TGlrZU9iamVjdCx0cnVlKSx1bmRlZmluZWQsY29tcGFyYXRvcil9KTtmdW5jdGlvbiB1bmlxKGFycmF5KXtyZXR1cm4gYXJyYXkmJmFycmF5Lmxlbmd0aD9iYXNlVW5pcShhcnJheSk6CltdfWZ1bmN0aW9uIHVuaXFCeShhcnJheSxpdGVyYXRlZSl7cmV0dXJuIGFycmF5JiZhcnJheS5sZW5ndGg/YmFzZVVuaXEoYXJyYXksZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsMikpOltdfWZ1bmN0aW9uIHVuaXFXaXRoKGFycmF5LGNvbXBhcmF0b3Ipe2NvbXBhcmF0b3I9dHlwZW9mIGNvbXBhcmF0b3I9PSJmdW5jdGlvbiI/Y29tcGFyYXRvcjp1bmRlZmluZWQ7cmV0dXJuIGFycmF5JiZhcnJheS5sZW5ndGg/YmFzZVVuaXEoYXJyYXksdW5kZWZpbmVkLGNvbXBhcmF0b3IpOltdfWZ1bmN0aW9uIHVuemlwKGFycmF5KXtpZighKGFycmF5JiZhcnJheS5sZW5ndGgpKXJldHVybltdO3ZhciBsZW5ndGg9MDthcnJheT1hcnJheUZpbHRlcihhcnJheSxmdW5jdGlvbihncm91cCl7aWYoaXNBcnJheUxpa2VPYmplY3QoZ3JvdXApKXtsZW5ndGg9bmF0aXZlTWF4KGdyb3VwLmxlbmd0aCxsZW5ndGgpO3JldHVybiB0cnVlfX0pO3JldHVybiBiYXNlVGltZXMobGVuZ3RoLGZ1bmN0aW9uKGluZGV4KXtyZXR1cm4gYXJyYXlNYXAoYXJyYXksCmJhc2VQcm9wZXJ0eShpbmRleCkpfSl9ZnVuY3Rpb24gdW56aXBXaXRoKGFycmF5LGl0ZXJhdGVlKXtpZighKGFycmF5JiZhcnJheS5sZW5ndGgpKXJldHVybltdO3ZhciByZXN1bHQ9dW56aXAoYXJyYXkpO2lmKGl0ZXJhdGVlPT1udWxsKXJldHVybiByZXN1bHQ7cmV0dXJuIGFycmF5TWFwKHJlc3VsdCxmdW5jdGlvbihncm91cCl7cmV0dXJuIGFwcGx5KGl0ZXJhdGVlLHVuZGVmaW5lZCxncm91cCl9KX12YXIgd2l0aG91dD1iYXNlUmVzdChmdW5jdGlvbihhcnJheSx2YWx1ZXMpe3JldHVybiBpc0FycmF5TGlrZU9iamVjdChhcnJheSk/YmFzZURpZmZlcmVuY2UoYXJyYXksdmFsdWVzKTpbXX0pO3ZhciB4b3I9YmFzZVJlc3QoZnVuY3Rpb24oYXJyYXlzKXtyZXR1cm4gYmFzZVhvcihhcnJheUZpbHRlcihhcnJheXMsaXNBcnJheUxpa2VPYmplY3QpKX0pO3ZhciB4b3JCeT1iYXNlUmVzdChmdW5jdGlvbihhcnJheXMpe3ZhciBpdGVyYXRlZT1sYXN0KGFycmF5cyk7aWYoaXNBcnJheUxpa2VPYmplY3QoaXRlcmF0ZWUpKWl0ZXJhdGVlPQp1bmRlZmluZWQ7cmV0dXJuIGJhc2VYb3IoYXJyYXlGaWx0ZXIoYXJyYXlzLGlzQXJyYXlMaWtlT2JqZWN0KSxnZXRJdGVyYXRlZShpdGVyYXRlZSwyKSl9KTt2YXIgeG9yV2l0aD1iYXNlUmVzdChmdW5jdGlvbihhcnJheXMpe3ZhciBjb21wYXJhdG9yPWxhc3QoYXJyYXlzKTtjb21wYXJhdG9yPXR5cGVvZiBjb21wYXJhdG9yPT0iZnVuY3Rpb24iP2NvbXBhcmF0b3I6dW5kZWZpbmVkO3JldHVybiBiYXNlWG9yKGFycmF5RmlsdGVyKGFycmF5cyxpc0FycmF5TGlrZU9iamVjdCksdW5kZWZpbmVkLGNvbXBhcmF0b3IpfSk7dmFyIHppcD1iYXNlUmVzdCh1bnppcCk7ZnVuY3Rpb24gemlwT2JqZWN0KHByb3BzLHZhbHVlcyl7cmV0dXJuIGJhc2VaaXBPYmplY3QocHJvcHN8fFtdLHZhbHVlc3x8W10sYXNzaWduVmFsdWUpfWZ1bmN0aW9uIHppcE9iamVjdERlZXAocHJvcHMsdmFsdWVzKXtyZXR1cm4gYmFzZVppcE9iamVjdChwcm9wc3x8W10sdmFsdWVzfHxbXSxiYXNlU2V0KX12YXIgemlwV2l0aD0KYmFzZVJlc3QoZnVuY3Rpb24oYXJyYXlzKXt2YXIgbGVuZ3RoPWFycmF5cy5sZW5ndGgsaXRlcmF0ZWU9bGVuZ3RoPjE/YXJyYXlzW2xlbmd0aC0xXTp1bmRlZmluZWQ7aXRlcmF0ZWU9dHlwZW9mIGl0ZXJhdGVlPT0iZnVuY3Rpb24iPyhhcnJheXMucG9wKCksaXRlcmF0ZWUpOnVuZGVmaW5lZDtyZXR1cm4gdW56aXBXaXRoKGFycmF5cyxpdGVyYXRlZSl9KTtmdW5jdGlvbiBjaGFpbih2YWx1ZSl7dmFyIHJlc3VsdD1sb2Rhc2godmFsdWUpO3Jlc3VsdC5fX2NoYWluX189dHJ1ZTtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIHRhcCh2YWx1ZSxpbnRlcmNlcHRvcil7aW50ZXJjZXB0b3IodmFsdWUpO3JldHVybiB2YWx1ZX1mdW5jdGlvbiB0aHJ1KHZhbHVlLGludGVyY2VwdG9yKXtyZXR1cm4gaW50ZXJjZXB0b3IodmFsdWUpfXZhciB3cmFwcGVyQXQ9ZmxhdFJlc3QoZnVuY3Rpb24ocGF0aHMpe3ZhciBsZW5ndGg9cGF0aHMubGVuZ3RoLHN0YXJ0PWxlbmd0aD9wYXRoc1swXTowLHZhbHVlPQp0aGlzLl9fd3JhcHBlZF9fLGludGVyY2VwdG9yPWZ1bmN0aW9uKG9iamVjdCl7cmV0dXJuIGJhc2VBdChvYmplY3QscGF0aHMpfTtpZihsZW5ndGg+MXx8dGhpcy5fX2FjdGlvbnNfXy5sZW5ndGh8fCEodmFsdWUgaW5zdGFuY2VvZiBMYXp5V3JhcHBlcil8fCFpc0luZGV4KHN0YXJ0KSlyZXR1cm4gdGhpcy50aHJ1KGludGVyY2VwdG9yKTt2YWx1ZT12YWx1ZS5zbGljZShzdGFydCwrc3RhcnQrKGxlbmd0aD8xOjApKTt2YWx1ZS5fX2FjdGlvbnNfXy5wdXNoKHsiZnVuYyI6dGhydSwiYXJncyI6W2ludGVyY2VwdG9yXSwidGhpc0FyZyI6dW5kZWZpbmVkfSk7cmV0dXJuKG5ldyBMb2Rhc2hXcmFwcGVyKHZhbHVlLHRoaXMuX19jaGFpbl9fKSkudGhydShmdW5jdGlvbihhcnJheSl7aWYobGVuZ3RoJiYhYXJyYXkubGVuZ3RoKWFycmF5LnB1c2godW5kZWZpbmVkKTtyZXR1cm4gYXJyYXl9KX0pO2Z1bmN0aW9uIHdyYXBwZXJDaGFpbigpe3JldHVybiBjaGFpbih0aGlzKX1mdW5jdGlvbiB3cmFwcGVyQ29tbWl0KCl7cmV0dXJuIG5ldyBMb2Rhc2hXcmFwcGVyKHRoaXMudmFsdWUoKSwKdGhpcy5fX2NoYWluX18pfWZ1bmN0aW9uIHdyYXBwZXJOZXh0KCl7aWYodGhpcy5fX3ZhbHVlc19fPT09dW5kZWZpbmVkKXRoaXMuX192YWx1ZXNfXz10b0FycmF5KHRoaXMudmFsdWUoKSk7dmFyIGRvbmU9dGhpcy5fX2luZGV4X18+PXRoaXMuX192YWx1ZXNfXy5sZW5ndGgsdmFsdWU9ZG9uZT91bmRlZmluZWQ6dGhpcy5fX3ZhbHVlc19fW3RoaXMuX19pbmRleF9fKytdO3JldHVybnsiZG9uZSI6ZG9uZSwidmFsdWUiOnZhbHVlfX1mdW5jdGlvbiB3cmFwcGVyVG9JdGVyYXRvcigpe3JldHVybiB0aGlzfWZ1bmN0aW9uIHdyYXBwZXJQbGFudCh2YWx1ZSl7dmFyIHJlc3VsdCxwYXJlbnQ9dGhpczt3aGlsZShwYXJlbnQgaW5zdGFuY2VvZiBiYXNlTG9kYXNoKXt2YXIgY2xvbmU9d3JhcHBlckNsb25lKHBhcmVudCk7Y2xvbmUuX19pbmRleF9fPTA7Y2xvbmUuX192YWx1ZXNfXz11bmRlZmluZWQ7aWYocmVzdWx0KXByZXZpb3VzLl9fd3JhcHBlZF9fPWNsb25lO2Vsc2UgcmVzdWx0PWNsb25lOwp2YXIgcHJldmlvdXM9Y2xvbmU7cGFyZW50PXBhcmVudC5fX3dyYXBwZWRfX31wcmV2aW91cy5fX3dyYXBwZWRfXz12YWx1ZTtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIHdyYXBwZXJSZXZlcnNlKCl7dmFyIHZhbHVlPXRoaXMuX193cmFwcGVkX187aWYodmFsdWUgaW5zdGFuY2VvZiBMYXp5V3JhcHBlcil7dmFyIHdyYXBwZWQ9dmFsdWU7aWYodGhpcy5fX2FjdGlvbnNfXy5sZW5ndGgpd3JhcHBlZD1uZXcgTGF6eVdyYXBwZXIodGhpcyk7d3JhcHBlZD13cmFwcGVkLnJldmVyc2UoKTt3cmFwcGVkLl9fYWN0aW9uc19fLnB1c2goeyJmdW5jIjp0aHJ1LCJhcmdzIjpbcmV2ZXJzZV0sInRoaXNBcmciOnVuZGVmaW5lZH0pO3JldHVybiBuZXcgTG9kYXNoV3JhcHBlcih3cmFwcGVkLHRoaXMuX19jaGFpbl9fKX1yZXR1cm4gdGhpcy50aHJ1KHJldmVyc2UpfWZ1bmN0aW9uIHdyYXBwZXJWYWx1ZSgpe3JldHVybiBiYXNlV3JhcHBlclZhbHVlKHRoaXMuX193cmFwcGVkX18sdGhpcy5fX2FjdGlvbnNfXyl9CnZhciBjb3VudEJ5PWNyZWF0ZUFnZ3JlZ2F0b3IoZnVuY3Rpb24ocmVzdWx0LHZhbHVlLGtleSl7aWYoaGFzT3duUHJvcGVydHkuY2FsbChyZXN1bHQsa2V5KSkrK3Jlc3VsdFtrZXldO2Vsc2UgYmFzZUFzc2lnblZhbHVlKHJlc3VsdCxrZXksMSl9KTtmdW5jdGlvbiBldmVyeShjb2xsZWN0aW9uLHByZWRpY2F0ZSxndWFyZCl7dmFyIGZ1bmM9aXNBcnJheShjb2xsZWN0aW9uKT9hcnJheUV2ZXJ5OmJhc2VFdmVyeTtpZihndWFyZCYmaXNJdGVyYXRlZUNhbGwoY29sbGVjdGlvbixwcmVkaWNhdGUsZ3VhcmQpKXByZWRpY2F0ZT11bmRlZmluZWQ7cmV0dXJuIGZ1bmMoY29sbGVjdGlvbixnZXRJdGVyYXRlZShwcmVkaWNhdGUsMykpfWZ1bmN0aW9uIGZpbHRlcihjb2xsZWN0aW9uLHByZWRpY2F0ZSl7dmFyIGZ1bmM9aXNBcnJheShjb2xsZWN0aW9uKT9hcnJheUZpbHRlcjpiYXNlRmlsdGVyO3JldHVybiBmdW5jKGNvbGxlY3Rpb24sZ2V0SXRlcmF0ZWUocHJlZGljYXRlLDMpKX12YXIgZmluZD0KY3JlYXRlRmluZChmaW5kSW5kZXgpO3ZhciBmaW5kTGFzdD1jcmVhdGVGaW5kKGZpbmRMYXN0SW5kZXgpO2Z1bmN0aW9uIGZsYXRNYXAoY29sbGVjdGlvbixpdGVyYXRlZSl7cmV0dXJuIGJhc2VGbGF0dGVuKG1hcChjb2xsZWN0aW9uLGl0ZXJhdGVlKSwxKX1mdW5jdGlvbiBmbGF0TWFwRGVlcChjb2xsZWN0aW9uLGl0ZXJhdGVlKXtyZXR1cm4gYmFzZUZsYXR0ZW4obWFwKGNvbGxlY3Rpb24saXRlcmF0ZWUpLElORklOSVRZKX1mdW5jdGlvbiBmbGF0TWFwRGVwdGgoY29sbGVjdGlvbixpdGVyYXRlZSxkZXB0aCl7ZGVwdGg9ZGVwdGg9PT11bmRlZmluZWQ/MTp0b0ludGVnZXIoZGVwdGgpO3JldHVybiBiYXNlRmxhdHRlbihtYXAoY29sbGVjdGlvbixpdGVyYXRlZSksZGVwdGgpfWZ1bmN0aW9uIGZvckVhY2goY29sbGVjdGlvbixpdGVyYXRlZSl7dmFyIGZ1bmM9aXNBcnJheShjb2xsZWN0aW9uKT9hcnJheUVhY2g6YmFzZUVhY2g7cmV0dXJuIGZ1bmMoY29sbGVjdGlvbixnZXRJdGVyYXRlZShpdGVyYXRlZSwKMykpfWZ1bmN0aW9uIGZvckVhY2hSaWdodChjb2xsZWN0aW9uLGl0ZXJhdGVlKXt2YXIgZnVuYz1pc0FycmF5KGNvbGxlY3Rpb24pP2FycmF5RWFjaFJpZ2h0OmJhc2VFYWNoUmlnaHQ7cmV0dXJuIGZ1bmMoY29sbGVjdGlvbixnZXRJdGVyYXRlZShpdGVyYXRlZSwzKSl9dmFyIGdyb3VwQnk9Y3JlYXRlQWdncmVnYXRvcihmdW5jdGlvbihyZXN1bHQsdmFsdWUsa2V5KXtpZihoYXNPd25Qcm9wZXJ0eS5jYWxsKHJlc3VsdCxrZXkpKXJlc3VsdFtrZXldLnB1c2godmFsdWUpO2Vsc2UgYmFzZUFzc2lnblZhbHVlKHJlc3VsdCxrZXksW3ZhbHVlXSl9KTtmdW5jdGlvbiBpbmNsdWRlcyhjb2xsZWN0aW9uLHZhbHVlLGZyb21JbmRleCxndWFyZCl7Y29sbGVjdGlvbj1pc0FycmF5TGlrZShjb2xsZWN0aW9uKT9jb2xsZWN0aW9uOnZhbHVlcyhjb2xsZWN0aW9uKTtmcm9tSW5kZXg9ZnJvbUluZGV4JiYhZ3VhcmQ/dG9JbnRlZ2VyKGZyb21JbmRleCk6MDt2YXIgbGVuZ3RoPWNvbGxlY3Rpb24ubGVuZ3RoOwppZihmcm9tSW5kZXg8MClmcm9tSW5kZXg9bmF0aXZlTWF4KGxlbmd0aCtmcm9tSW5kZXgsMCk7cmV0dXJuIGlzU3RyaW5nKGNvbGxlY3Rpb24pP2Zyb21JbmRleDw9bGVuZ3RoJiZjb2xsZWN0aW9uLmluZGV4T2YodmFsdWUsZnJvbUluZGV4KT4tMTohIWxlbmd0aCYmYmFzZUluZGV4T2YoY29sbGVjdGlvbix2YWx1ZSxmcm9tSW5kZXgpPi0xfXZhciBpbnZva2VNYXA9YmFzZVJlc3QoZnVuY3Rpb24oY29sbGVjdGlvbixwYXRoLGFyZ3Mpe3ZhciBpbmRleD0tMSxpc0Z1bmM9dHlwZW9mIHBhdGg9PSJmdW5jdGlvbiIscmVzdWx0PWlzQXJyYXlMaWtlKGNvbGxlY3Rpb24pP0FycmF5KGNvbGxlY3Rpb24ubGVuZ3RoKTpbXTtiYXNlRWFjaChjb2xsZWN0aW9uLGZ1bmN0aW9uKHZhbHVlKXtyZXN1bHRbKytpbmRleF09aXNGdW5jP2FwcGx5KHBhdGgsdmFsdWUsYXJncyk6YmFzZUludm9rZSh2YWx1ZSxwYXRoLGFyZ3MpfSk7cmV0dXJuIHJlc3VsdH0pO3ZhciBrZXlCeT1jcmVhdGVBZ2dyZWdhdG9yKGZ1bmN0aW9uKHJlc3VsdCwKdmFsdWUsa2V5KXtiYXNlQXNzaWduVmFsdWUocmVzdWx0LGtleSx2YWx1ZSl9KTtmdW5jdGlvbiBtYXAoY29sbGVjdGlvbixpdGVyYXRlZSl7dmFyIGZ1bmM9aXNBcnJheShjb2xsZWN0aW9uKT9hcnJheU1hcDpiYXNlTWFwO3JldHVybiBmdW5jKGNvbGxlY3Rpb24sZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsMykpfWZ1bmN0aW9uIG9yZGVyQnkoY29sbGVjdGlvbixpdGVyYXRlZXMsb3JkZXJzLGd1YXJkKXtpZihjb2xsZWN0aW9uPT1udWxsKXJldHVybltdO2lmKCFpc0FycmF5KGl0ZXJhdGVlcykpaXRlcmF0ZWVzPWl0ZXJhdGVlcz09bnVsbD9bXTpbaXRlcmF0ZWVzXTtvcmRlcnM9Z3VhcmQ/dW5kZWZpbmVkOm9yZGVycztpZighaXNBcnJheShvcmRlcnMpKW9yZGVycz1vcmRlcnM9PW51bGw/W106W29yZGVyc107cmV0dXJuIGJhc2VPcmRlckJ5KGNvbGxlY3Rpb24saXRlcmF0ZWVzLG9yZGVycyl9dmFyIHBhcnRpdGlvbj1jcmVhdGVBZ2dyZWdhdG9yKGZ1bmN0aW9uKHJlc3VsdCx2YWx1ZSwKa2V5KXtyZXN1bHRba2V5PzA6MV0ucHVzaCh2YWx1ZSl9LGZ1bmN0aW9uKCl7cmV0dXJuW1tdLFtdXX0pO2Z1bmN0aW9uIHJlZHVjZShjb2xsZWN0aW9uLGl0ZXJhdGVlLGFjY3VtdWxhdG9yKXt2YXIgZnVuYz1pc0FycmF5KGNvbGxlY3Rpb24pP2FycmF5UmVkdWNlOmJhc2VSZWR1Y2UsaW5pdEFjY3VtPWFyZ3VtZW50cy5sZW5ndGg8MztyZXR1cm4gZnVuYyhjb2xsZWN0aW9uLGdldEl0ZXJhdGVlKGl0ZXJhdGVlLDQpLGFjY3VtdWxhdG9yLGluaXRBY2N1bSxiYXNlRWFjaCl9ZnVuY3Rpb24gcmVkdWNlUmlnaHQoY29sbGVjdGlvbixpdGVyYXRlZSxhY2N1bXVsYXRvcil7dmFyIGZ1bmM9aXNBcnJheShjb2xsZWN0aW9uKT9hcnJheVJlZHVjZVJpZ2h0OmJhc2VSZWR1Y2UsaW5pdEFjY3VtPWFyZ3VtZW50cy5sZW5ndGg8MztyZXR1cm4gZnVuYyhjb2xsZWN0aW9uLGdldEl0ZXJhdGVlKGl0ZXJhdGVlLDQpLGFjY3VtdWxhdG9yLGluaXRBY2N1bSxiYXNlRWFjaFJpZ2h0KX1mdW5jdGlvbiByZWplY3QoY29sbGVjdGlvbiwKcHJlZGljYXRlKXt2YXIgZnVuYz1pc0FycmF5KGNvbGxlY3Rpb24pP2FycmF5RmlsdGVyOmJhc2VGaWx0ZXI7cmV0dXJuIGZ1bmMoY29sbGVjdGlvbixuZWdhdGUoZ2V0SXRlcmF0ZWUocHJlZGljYXRlLDMpKSl9ZnVuY3Rpb24gc2FtcGxlKGNvbGxlY3Rpb24pe3ZhciBmdW5jPWlzQXJyYXkoY29sbGVjdGlvbik/YXJyYXlTYW1wbGU6YmFzZVNhbXBsZTtyZXR1cm4gZnVuYyhjb2xsZWN0aW9uKX1mdW5jdGlvbiBzYW1wbGVTaXplKGNvbGxlY3Rpb24sbixndWFyZCl7aWYoZ3VhcmQ/aXNJdGVyYXRlZUNhbGwoY29sbGVjdGlvbixuLGd1YXJkKTpuPT09dW5kZWZpbmVkKW49MTtlbHNlIG49dG9JbnRlZ2VyKG4pO3ZhciBmdW5jPWlzQXJyYXkoY29sbGVjdGlvbik/YXJyYXlTYW1wbGVTaXplOmJhc2VTYW1wbGVTaXplO3JldHVybiBmdW5jKGNvbGxlY3Rpb24sbil9ZnVuY3Rpb24gc2h1ZmZsZShjb2xsZWN0aW9uKXt2YXIgZnVuYz1pc0FycmF5KGNvbGxlY3Rpb24pP2FycmF5U2h1ZmZsZToKYmFzZVNodWZmbGU7cmV0dXJuIGZ1bmMoY29sbGVjdGlvbil9ZnVuY3Rpb24gc2l6ZShjb2xsZWN0aW9uKXtpZihjb2xsZWN0aW9uPT1udWxsKXJldHVybiAwO2lmKGlzQXJyYXlMaWtlKGNvbGxlY3Rpb24pKXJldHVybiBpc1N0cmluZyhjb2xsZWN0aW9uKT9zdHJpbmdTaXplKGNvbGxlY3Rpb24pOmNvbGxlY3Rpb24ubGVuZ3RoO3ZhciB0YWc9Z2V0VGFnKGNvbGxlY3Rpb24pO2lmKHRhZz09bWFwVGFnfHx0YWc9PXNldFRhZylyZXR1cm4gY29sbGVjdGlvbi5zaXplO3JldHVybiBiYXNlS2V5cyhjb2xsZWN0aW9uKS5sZW5ndGh9ZnVuY3Rpb24gc29tZShjb2xsZWN0aW9uLHByZWRpY2F0ZSxndWFyZCl7dmFyIGZ1bmM9aXNBcnJheShjb2xsZWN0aW9uKT9hcnJheVNvbWU6YmFzZVNvbWU7aWYoZ3VhcmQmJmlzSXRlcmF0ZWVDYWxsKGNvbGxlY3Rpb24scHJlZGljYXRlLGd1YXJkKSlwcmVkaWNhdGU9dW5kZWZpbmVkO3JldHVybiBmdW5jKGNvbGxlY3Rpb24sZ2V0SXRlcmF0ZWUocHJlZGljYXRlLAozKSl9dmFyIHNvcnRCeT1iYXNlUmVzdChmdW5jdGlvbihjb2xsZWN0aW9uLGl0ZXJhdGVlcyl7aWYoY29sbGVjdGlvbj09bnVsbClyZXR1cm5bXTt2YXIgbGVuZ3RoPWl0ZXJhdGVlcy5sZW5ndGg7aWYobGVuZ3RoPjEmJmlzSXRlcmF0ZWVDYWxsKGNvbGxlY3Rpb24saXRlcmF0ZWVzWzBdLGl0ZXJhdGVlc1sxXSkpaXRlcmF0ZWVzPVtdO2Vsc2UgaWYobGVuZ3RoPjImJmlzSXRlcmF0ZWVDYWxsKGl0ZXJhdGVlc1swXSxpdGVyYXRlZXNbMV0saXRlcmF0ZWVzWzJdKSlpdGVyYXRlZXM9W2l0ZXJhdGVlc1swXV07cmV0dXJuIGJhc2VPcmRlckJ5KGNvbGxlY3Rpb24sYmFzZUZsYXR0ZW4oaXRlcmF0ZWVzLDEpLFtdKX0pO3ZhciBub3c9Y3R4Tm93fHxmdW5jdGlvbigpe3JldHVybiByb290LkRhdGUubm93KCl9O2Z1bmN0aW9uIGFmdGVyKG4sZnVuYyl7aWYodHlwZW9mIGZ1bmMhPSJmdW5jdGlvbiIpdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO249dG9JbnRlZ2VyKG4pOwpyZXR1cm4gZnVuY3Rpb24oKXtpZigtLW48MSlyZXR1cm4gZnVuYy5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fWZ1bmN0aW9uIGFyeShmdW5jLG4sZ3VhcmQpe249Z3VhcmQ/dW5kZWZpbmVkOm47bj1mdW5jJiZuPT1udWxsP2Z1bmMubGVuZ3RoOm47cmV0dXJuIGNyZWF0ZVdyYXAoZnVuYyxXUkFQX0FSWV9GTEFHLHVuZGVmaW5lZCx1bmRlZmluZWQsdW5kZWZpbmVkLHVuZGVmaW5lZCxuKX1mdW5jdGlvbiBiZWZvcmUobixmdW5jKXt2YXIgcmVzdWx0O2lmKHR5cGVvZiBmdW5jIT0iZnVuY3Rpb24iKXRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtuPXRvSW50ZWdlcihuKTtyZXR1cm4gZnVuY3Rpb24oKXtpZigtLW4+MClyZXN1bHQ9ZnVuYy5hcHBseSh0aGlzLGFyZ3VtZW50cyk7aWYobjw9MSlmdW5jPXVuZGVmaW5lZDtyZXR1cm4gcmVzdWx0fX12YXIgYmluZD1iYXNlUmVzdChmdW5jdGlvbihmdW5jLHRoaXNBcmcscGFydGlhbHMpe3ZhciBiaXRtYXNrPVdSQVBfQklORF9GTEFHOwppZihwYXJ0aWFscy5sZW5ndGgpe3ZhciBob2xkZXJzPXJlcGxhY2VIb2xkZXJzKHBhcnRpYWxzLGdldEhvbGRlcihiaW5kKSk7Yml0bWFza3w9V1JBUF9QQVJUSUFMX0ZMQUd9cmV0dXJuIGNyZWF0ZVdyYXAoZnVuYyxiaXRtYXNrLHRoaXNBcmcscGFydGlhbHMsaG9sZGVycyl9KTt2YXIgYmluZEtleT1iYXNlUmVzdChmdW5jdGlvbihvYmplY3Qsa2V5LHBhcnRpYWxzKXt2YXIgYml0bWFzaz1XUkFQX0JJTkRfRkxBR3xXUkFQX0JJTkRfS0VZX0ZMQUc7aWYocGFydGlhbHMubGVuZ3RoKXt2YXIgaG9sZGVycz1yZXBsYWNlSG9sZGVycyhwYXJ0aWFscyxnZXRIb2xkZXIoYmluZEtleSkpO2JpdG1hc2t8PVdSQVBfUEFSVElBTF9GTEFHfXJldHVybiBjcmVhdGVXcmFwKGtleSxiaXRtYXNrLG9iamVjdCxwYXJ0aWFscyxob2xkZXJzKX0pO2Z1bmN0aW9uIGN1cnJ5KGZ1bmMsYXJpdHksZ3VhcmQpe2FyaXR5PWd1YXJkP3VuZGVmaW5lZDphcml0eTt2YXIgcmVzdWx0PWNyZWF0ZVdyYXAoZnVuYywKV1JBUF9DVVJSWV9GTEFHLHVuZGVmaW5lZCx1bmRlZmluZWQsdW5kZWZpbmVkLHVuZGVmaW5lZCx1bmRlZmluZWQsYXJpdHkpO3Jlc3VsdC5wbGFjZWhvbGRlcj1jdXJyeS5wbGFjZWhvbGRlcjtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGN1cnJ5UmlnaHQoZnVuYyxhcml0eSxndWFyZCl7YXJpdHk9Z3VhcmQ/dW5kZWZpbmVkOmFyaXR5O3ZhciByZXN1bHQ9Y3JlYXRlV3JhcChmdW5jLFdSQVBfQ1VSUllfUklHSFRfRkxBRyx1bmRlZmluZWQsdW5kZWZpbmVkLHVuZGVmaW5lZCx1bmRlZmluZWQsdW5kZWZpbmVkLGFyaXR5KTtyZXN1bHQucGxhY2Vob2xkZXI9Y3VycnlSaWdodC5wbGFjZWhvbGRlcjtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGRlYm91bmNlKGZ1bmMsd2FpdCxvcHRpb25zKXt2YXIgbGFzdEFyZ3MsbGFzdFRoaXMsbWF4V2FpdCxyZXN1bHQsdGltZXJJZCxsYXN0Q2FsbFRpbWUsbGFzdEludm9rZVRpbWU9MCxsZWFkaW5nPWZhbHNlLG1heGluZz1mYWxzZSx0cmFpbGluZz10cnVlOwppZih0eXBlb2YgZnVuYyE9ImZ1bmN0aW9uIil0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7d2FpdD10b051bWJlcih3YWl0KXx8MDtpZihpc09iamVjdChvcHRpb25zKSl7bGVhZGluZz0hIW9wdGlvbnMubGVhZGluZzttYXhpbmc9Im1heFdhaXQiaW4gb3B0aW9uczttYXhXYWl0PW1heGluZz9uYXRpdmVNYXgodG9OdW1iZXIob3B0aW9ucy5tYXhXYWl0KXx8MCx3YWl0KTptYXhXYWl0O3RyYWlsaW5nPSJ0cmFpbGluZyJpbiBvcHRpb25zPyEhb3B0aW9ucy50cmFpbGluZzp0cmFpbGluZ31mdW5jdGlvbiBpbnZva2VGdW5jKHRpbWUpe3ZhciBhcmdzPWxhc3RBcmdzLHRoaXNBcmc9bGFzdFRoaXM7bGFzdEFyZ3M9bGFzdFRoaXM9dW5kZWZpbmVkO2xhc3RJbnZva2VUaW1lPXRpbWU7cmVzdWx0PWZ1bmMuYXBwbHkodGhpc0FyZyxhcmdzKTtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGxlYWRpbmdFZGdlKHRpbWUpe2xhc3RJbnZva2VUaW1lPXRpbWU7dGltZXJJZD1zZXRUaW1lb3V0KHRpbWVyRXhwaXJlZCwKd2FpdCk7cmV0dXJuIGxlYWRpbmc/aW52b2tlRnVuYyh0aW1lKTpyZXN1bHR9ZnVuY3Rpb24gcmVtYWluaW5nV2FpdCh0aW1lKXt2YXIgdGltZVNpbmNlTGFzdENhbGw9dGltZS1sYXN0Q2FsbFRpbWUsdGltZVNpbmNlTGFzdEludm9rZT10aW1lLWxhc3RJbnZva2VUaW1lLHRpbWVXYWl0aW5nPXdhaXQtdGltZVNpbmNlTGFzdENhbGw7cmV0dXJuIG1heGluZz9uYXRpdmVNaW4odGltZVdhaXRpbmcsbWF4V2FpdC10aW1lU2luY2VMYXN0SW52b2tlKTp0aW1lV2FpdGluZ31mdW5jdGlvbiBzaG91bGRJbnZva2UodGltZSl7dmFyIHRpbWVTaW5jZUxhc3RDYWxsPXRpbWUtbGFzdENhbGxUaW1lLHRpbWVTaW5jZUxhc3RJbnZva2U9dGltZS1sYXN0SW52b2tlVGltZTtyZXR1cm4gbGFzdENhbGxUaW1lPT09dW5kZWZpbmVkfHx0aW1lU2luY2VMYXN0Q2FsbD49d2FpdHx8dGltZVNpbmNlTGFzdENhbGw8MHx8bWF4aW5nJiZ0aW1lU2luY2VMYXN0SW52b2tlPj1tYXhXYWl0fWZ1bmN0aW9uIHRpbWVyRXhwaXJlZCgpe3ZhciB0aW1lPQpub3coKTtpZihzaG91bGRJbnZva2UodGltZSkpcmV0dXJuIHRyYWlsaW5nRWRnZSh0aW1lKTt0aW1lcklkPXNldFRpbWVvdXQodGltZXJFeHBpcmVkLHJlbWFpbmluZ1dhaXQodGltZSkpfWZ1bmN0aW9uIHRyYWlsaW5nRWRnZSh0aW1lKXt0aW1lcklkPXVuZGVmaW5lZDtpZih0cmFpbGluZyYmbGFzdEFyZ3MpcmV0dXJuIGludm9rZUZ1bmModGltZSk7bGFzdEFyZ3M9bGFzdFRoaXM9dW5kZWZpbmVkO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gY2FuY2VsKCl7aWYodGltZXJJZCE9PXVuZGVmaW5lZCljbGVhclRpbWVvdXQodGltZXJJZCk7bGFzdEludm9rZVRpbWU9MDtsYXN0QXJncz1sYXN0Q2FsbFRpbWU9bGFzdFRoaXM9dGltZXJJZD11bmRlZmluZWR9ZnVuY3Rpb24gZmx1c2goKXtyZXR1cm4gdGltZXJJZD09PXVuZGVmaW5lZD9yZXN1bHQ6dHJhaWxpbmdFZGdlKG5vdygpKX1mdW5jdGlvbiBkZWJvdW5jZWQoKXt2YXIgdGltZT1ub3coKSxpc0ludm9raW5nPXNob3VsZEludm9rZSh0aW1lKTsKbGFzdEFyZ3M9YXJndW1lbnRzO2xhc3RUaGlzPXRoaXM7bGFzdENhbGxUaW1lPXRpbWU7aWYoaXNJbnZva2luZyl7aWYodGltZXJJZD09PXVuZGVmaW5lZClyZXR1cm4gbGVhZGluZ0VkZ2UobGFzdENhbGxUaW1lKTtpZihtYXhpbmcpe3RpbWVySWQ9c2V0VGltZW91dCh0aW1lckV4cGlyZWQsd2FpdCk7cmV0dXJuIGludm9rZUZ1bmMobGFzdENhbGxUaW1lKX19aWYodGltZXJJZD09PXVuZGVmaW5lZCl0aW1lcklkPXNldFRpbWVvdXQodGltZXJFeHBpcmVkLHdhaXQpO3JldHVybiByZXN1bHR9ZGVib3VuY2VkLmNhbmNlbD1jYW5jZWw7ZGVib3VuY2VkLmZsdXNoPWZsdXNoO3JldHVybiBkZWJvdW5jZWR9dmFyIGRlZmVyPWJhc2VSZXN0KGZ1bmN0aW9uKGZ1bmMsYXJncyl7cmV0dXJuIGJhc2VEZWxheShmdW5jLDEsYXJncyl9KTt2YXIgZGVsYXk9YmFzZVJlc3QoZnVuY3Rpb24oZnVuYyx3YWl0LGFyZ3Mpe3JldHVybiBiYXNlRGVsYXkoZnVuYyx0b051bWJlcih3YWl0KXx8MCxhcmdzKX0pOwpmdW5jdGlvbiBmbGlwKGZ1bmMpe3JldHVybiBjcmVhdGVXcmFwKGZ1bmMsV1JBUF9GTElQX0ZMQUcpfWZ1bmN0aW9uIG1lbW9pemUoZnVuYyxyZXNvbHZlcil7aWYodHlwZW9mIGZ1bmMhPSJmdW5jdGlvbiJ8fHJlc29sdmVyIT1udWxsJiZ0eXBlb2YgcmVzb2x2ZXIhPSJmdW5jdGlvbiIpdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO3ZhciBtZW1vaXplZD1mdW5jdGlvbigpe3ZhciBhcmdzPWFyZ3VtZW50cyxrZXk9cmVzb2x2ZXI/cmVzb2x2ZXIuYXBwbHkodGhpcyxhcmdzKTphcmdzWzBdLGNhY2hlPW1lbW9pemVkLmNhY2hlO2lmKGNhY2hlLmhhcyhrZXkpKXJldHVybiBjYWNoZS5nZXQoa2V5KTt2YXIgcmVzdWx0PWZ1bmMuYXBwbHkodGhpcyxhcmdzKTttZW1vaXplZC5jYWNoZT1jYWNoZS5zZXQoa2V5LHJlc3VsdCl8fGNhY2hlO3JldHVybiByZXN1bHR9O21lbW9pemVkLmNhY2hlPW5ldyAobWVtb2l6ZS5DYWNoZXx8TWFwQ2FjaGUpO3JldHVybiBtZW1vaXplZH0KbWVtb2l6ZS5DYWNoZT1NYXBDYWNoZTtmdW5jdGlvbiBuZWdhdGUocHJlZGljYXRlKXtpZih0eXBlb2YgcHJlZGljYXRlIT0iZnVuY3Rpb24iKXRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgYXJncz1hcmd1bWVudHM7c3dpdGNoKGFyZ3MubGVuZ3RoKXtjYXNlIDA6cmV0dXJuIXByZWRpY2F0ZS5jYWxsKHRoaXMpO2Nhc2UgMTpyZXR1cm4hcHJlZGljYXRlLmNhbGwodGhpcyxhcmdzWzBdKTtjYXNlIDI6cmV0dXJuIXByZWRpY2F0ZS5jYWxsKHRoaXMsYXJnc1swXSxhcmdzWzFdKTtjYXNlIDM6cmV0dXJuIXByZWRpY2F0ZS5jYWxsKHRoaXMsYXJnc1swXSxhcmdzWzFdLGFyZ3NbMl0pfXJldHVybiFwcmVkaWNhdGUuYXBwbHkodGhpcyxhcmdzKX19ZnVuY3Rpb24gb25jZShmdW5jKXtyZXR1cm4gYmVmb3JlKDIsZnVuYyl9dmFyIG92ZXJBcmdzPWNhc3RSZXN0KGZ1bmN0aW9uKGZ1bmMsdHJhbnNmb3Jtcyl7dHJhbnNmb3Jtcz10cmFuc2Zvcm1zLmxlbmd0aD09CjEmJmlzQXJyYXkodHJhbnNmb3Jtc1swXSk/YXJyYXlNYXAodHJhbnNmb3Jtc1swXSxiYXNlVW5hcnkoZ2V0SXRlcmF0ZWUoKSkpOmFycmF5TWFwKGJhc2VGbGF0dGVuKHRyYW5zZm9ybXMsMSksYmFzZVVuYXJ5KGdldEl0ZXJhdGVlKCkpKTt2YXIgZnVuY3NMZW5ndGg9dHJhbnNmb3Jtcy5sZW5ndGg7cmV0dXJuIGJhc2VSZXN0KGZ1bmN0aW9uKGFyZ3Mpe3ZhciBpbmRleD0tMSxsZW5ndGg9bmF0aXZlTWluKGFyZ3MubGVuZ3RoLGZ1bmNzTGVuZ3RoKTt3aGlsZSgrK2luZGV4PGxlbmd0aClhcmdzW2luZGV4XT10cmFuc2Zvcm1zW2luZGV4XS5jYWxsKHRoaXMsYXJnc1tpbmRleF0pO3JldHVybiBhcHBseShmdW5jLHRoaXMsYXJncyl9KX0pO3ZhciBwYXJ0aWFsPWJhc2VSZXN0KGZ1bmN0aW9uKGZ1bmMscGFydGlhbHMpe3ZhciBob2xkZXJzPXJlcGxhY2VIb2xkZXJzKHBhcnRpYWxzLGdldEhvbGRlcihwYXJ0aWFsKSk7cmV0dXJuIGNyZWF0ZVdyYXAoZnVuYyxXUkFQX1BBUlRJQUxfRkxBRywKdW5kZWZpbmVkLHBhcnRpYWxzLGhvbGRlcnMpfSk7dmFyIHBhcnRpYWxSaWdodD1iYXNlUmVzdChmdW5jdGlvbihmdW5jLHBhcnRpYWxzKXt2YXIgaG9sZGVycz1yZXBsYWNlSG9sZGVycyhwYXJ0aWFscyxnZXRIb2xkZXIocGFydGlhbFJpZ2h0KSk7cmV0dXJuIGNyZWF0ZVdyYXAoZnVuYyxXUkFQX1BBUlRJQUxfUklHSFRfRkxBRyx1bmRlZmluZWQscGFydGlhbHMsaG9sZGVycyl9KTt2YXIgcmVhcmc9ZmxhdFJlc3QoZnVuY3Rpb24oZnVuYyxpbmRleGVzKXtyZXR1cm4gY3JlYXRlV3JhcChmdW5jLFdSQVBfUkVBUkdfRkxBRyx1bmRlZmluZWQsdW5kZWZpbmVkLHVuZGVmaW5lZCxpbmRleGVzKX0pO2Z1bmN0aW9uIHJlc3QoZnVuYyxzdGFydCl7aWYodHlwZW9mIGZ1bmMhPSJmdW5jdGlvbiIpdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO3N0YXJ0PXN0YXJ0PT09dW5kZWZpbmVkP3N0YXJ0OnRvSW50ZWdlcihzdGFydCk7cmV0dXJuIGJhc2VSZXN0KGZ1bmMsc3RhcnQpfQpmdW5jdGlvbiBzcHJlYWQoZnVuYyxzdGFydCl7aWYodHlwZW9mIGZ1bmMhPSJmdW5jdGlvbiIpdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO3N0YXJ0PXN0YXJ0PT1udWxsPzA6bmF0aXZlTWF4KHRvSW50ZWdlcihzdGFydCksMCk7cmV0dXJuIGJhc2VSZXN0KGZ1bmN0aW9uKGFyZ3Mpe3ZhciBhcnJheT1hcmdzW3N0YXJ0XSxvdGhlckFyZ3M9Y2FzdFNsaWNlKGFyZ3MsMCxzdGFydCk7aWYoYXJyYXkpYXJyYXlQdXNoKG90aGVyQXJncyxhcnJheSk7cmV0dXJuIGFwcGx5KGZ1bmMsdGhpcyxvdGhlckFyZ3MpfSl9ZnVuY3Rpb24gdGhyb3R0bGUoZnVuYyx3YWl0LG9wdGlvbnMpe3ZhciBsZWFkaW5nPXRydWUsdHJhaWxpbmc9dHJ1ZTtpZih0eXBlb2YgZnVuYyE9ImZ1bmN0aW9uIil0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7aWYoaXNPYmplY3Qob3B0aW9ucykpe2xlYWRpbmc9ImxlYWRpbmciaW4gb3B0aW9ucz8hIW9wdGlvbnMubGVhZGluZzoKbGVhZGluZzt0cmFpbGluZz0idHJhaWxpbmciaW4gb3B0aW9ucz8hIW9wdGlvbnMudHJhaWxpbmc6dHJhaWxpbmd9cmV0dXJuIGRlYm91bmNlKGZ1bmMsd2FpdCx7ImxlYWRpbmciOmxlYWRpbmcsIm1heFdhaXQiOndhaXQsInRyYWlsaW5nIjp0cmFpbGluZ30pfWZ1bmN0aW9uIHVuYXJ5KGZ1bmMpe3JldHVybiBhcnkoZnVuYywxKX1mdW5jdGlvbiB3cmFwKHZhbHVlLHdyYXBwZXIpe3JldHVybiBwYXJ0aWFsKGNhc3RGdW5jdGlvbih3cmFwcGVyKSx2YWx1ZSl9ZnVuY3Rpb24gY2FzdEFycmF5KCl7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuW107dmFyIHZhbHVlPWFyZ3VtZW50c1swXTtyZXR1cm4gaXNBcnJheSh2YWx1ZSk/dmFsdWU6W3ZhbHVlXX1mdW5jdGlvbiBjbG9uZSh2YWx1ZSl7cmV0dXJuIGJhc2VDbG9uZSh2YWx1ZSxDTE9ORV9TWU1CT0xTX0ZMQUcpfWZ1bmN0aW9uIGNsb25lV2l0aCh2YWx1ZSxjdXN0b21pemVyKXtjdXN0b21pemVyPXR5cGVvZiBjdXN0b21pemVyPT0KImZ1bmN0aW9uIj9jdXN0b21pemVyOnVuZGVmaW5lZDtyZXR1cm4gYmFzZUNsb25lKHZhbHVlLENMT05FX1NZTUJPTFNfRkxBRyxjdXN0b21pemVyKX1mdW5jdGlvbiBjbG9uZURlZXAodmFsdWUpe3JldHVybiBiYXNlQ2xvbmUodmFsdWUsQ0xPTkVfREVFUF9GTEFHfENMT05FX1NZTUJPTFNfRkxBRyl9ZnVuY3Rpb24gY2xvbmVEZWVwV2l0aCh2YWx1ZSxjdXN0b21pemVyKXtjdXN0b21pemVyPXR5cGVvZiBjdXN0b21pemVyPT0iZnVuY3Rpb24iP2N1c3RvbWl6ZXI6dW5kZWZpbmVkO3JldHVybiBiYXNlQ2xvbmUodmFsdWUsQ0xPTkVfREVFUF9GTEFHfENMT05FX1NZTUJPTFNfRkxBRyxjdXN0b21pemVyKX1mdW5jdGlvbiBjb25mb3Jtc1RvKG9iamVjdCxzb3VyY2Upe3JldHVybiBzb3VyY2U9PW51bGx8fGJhc2VDb25mb3Jtc1RvKG9iamVjdCxzb3VyY2Usa2V5cyhzb3VyY2UpKX1mdW5jdGlvbiBlcSh2YWx1ZSxvdGhlcil7cmV0dXJuIHZhbHVlPT09b3RoZXJ8fHZhbHVlIT09dmFsdWUmJgpvdGhlciE9PW90aGVyfXZhciBndD1jcmVhdGVSZWxhdGlvbmFsT3BlcmF0aW9uKGJhc2VHdCk7dmFyIGd0ZT1jcmVhdGVSZWxhdGlvbmFsT3BlcmF0aW9uKGZ1bmN0aW9uKHZhbHVlLG90aGVyKXtyZXR1cm4gdmFsdWU+PW90aGVyfSk7dmFyIGlzQXJndW1lbnRzPWJhc2VJc0FyZ3VtZW50cyhmdW5jdGlvbigpe3JldHVybiBhcmd1bWVudHN9KCkpP2Jhc2VJc0FyZ3VtZW50czpmdW5jdGlvbih2YWx1ZSl7cmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkmJmhhc093blByb3BlcnR5LmNhbGwodmFsdWUsImNhbGxlZSIpJiYhcHJvcGVydHlJc0VudW1lcmFibGUuY2FsbCh2YWx1ZSwiY2FsbGVlIil9O3ZhciBpc0FycmF5PUFycmF5LmlzQXJyYXk7dmFyIGlzQXJyYXlCdWZmZXI9bm9kZUlzQXJyYXlCdWZmZXI/YmFzZVVuYXJ5KG5vZGVJc0FycmF5QnVmZmVyKTpiYXNlSXNBcnJheUJ1ZmZlcjtmdW5jdGlvbiBpc0FycmF5TGlrZSh2YWx1ZSl7cmV0dXJuIHZhbHVlIT1udWxsJiZpc0xlbmd0aCh2YWx1ZS5sZW5ndGgpJiYKIWlzRnVuY3Rpb24odmFsdWUpfWZ1bmN0aW9uIGlzQXJyYXlMaWtlT2JqZWN0KHZhbHVlKXtyZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSYmaXNBcnJheUxpa2UodmFsdWUpfWZ1bmN0aW9uIGlzQm9vbGVhbih2YWx1ZSl7cmV0dXJuIHZhbHVlPT09dHJ1ZXx8dmFsdWU9PT1mYWxzZXx8aXNPYmplY3RMaWtlKHZhbHVlKSYmYmFzZUdldFRhZyh2YWx1ZSk9PWJvb2xUYWd9dmFyIGlzQnVmZmVyPW5hdGl2ZUlzQnVmZmVyfHxzdHViRmFsc2U7dmFyIGlzRGF0ZT1ub2RlSXNEYXRlP2Jhc2VVbmFyeShub2RlSXNEYXRlKTpiYXNlSXNEYXRlO2Z1bmN0aW9uIGlzRWxlbWVudCh2YWx1ZSl7cmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkmJnZhbHVlLm5vZGVUeXBlPT09MSYmIWlzUGxhaW5PYmplY3QodmFsdWUpfWZ1bmN0aW9uIGlzRW1wdHkodmFsdWUpe2lmKHZhbHVlPT1udWxsKXJldHVybiB0cnVlO2lmKGlzQXJyYXlMaWtlKHZhbHVlKSYmKGlzQXJyYXkodmFsdWUpfHx0eXBlb2YgdmFsdWU9PQoic3RyaW5nInx8dHlwZW9mIHZhbHVlLnNwbGljZT09ImZ1bmN0aW9uInx8aXNCdWZmZXIodmFsdWUpfHxpc1R5cGVkQXJyYXkodmFsdWUpfHxpc0FyZ3VtZW50cyh2YWx1ZSkpKXJldHVybiF2YWx1ZS5sZW5ndGg7dmFyIHRhZz1nZXRUYWcodmFsdWUpO2lmKHRhZz09bWFwVGFnfHx0YWc9PXNldFRhZylyZXR1cm4hdmFsdWUuc2l6ZTtpZihpc1Byb3RvdHlwZSh2YWx1ZSkpcmV0dXJuIWJhc2VLZXlzKHZhbHVlKS5sZW5ndGg7Zm9yKHZhciBrZXkgaW4gdmFsdWUpaWYoaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSxrZXkpKXJldHVybiBmYWxzZTtyZXR1cm4gdHJ1ZX1mdW5jdGlvbiBpc0VxdWFsKHZhbHVlLG90aGVyKXtyZXR1cm4gYmFzZUlzRXF1YWwodmFsdWUsb3RoZXIpfWZ1bmN0aW9uIGlzRXF1YWxXaXRoKHZhbHVlLG90aGVyLGN1c3RvbWl6ZXIpe2N1c3RvbWl6ZXI9dHlwZW9mIGN1c3RvbWl6ZXI9PSJmdW5jdGlvbiI/Y3VzdG9taXplcjp1bmRlZmluZWQ7dmFyIHJlc3VsdD0KY3VzdG9taXplcj9jdXN0b21pemVyKHZhbHVlLG90aGVyKTp1bmRlZmluZWQ7cmV0dXJuIHJlc3VsdD09PXVuZGVmaW5lZD9iYXNlSXNFcXVhbCh2YWx1ZSxvdGhlcix1bmRlZmluZWQsY3VzdG9taXplcik6ISFyZXN1bHR9ZnVuY3Rpb24gaXNFcnJvcih2YWx1ZSl7aWYoIWlzT2JqZWN0TGlrZSh2YWx1ZSkpcmV0dXJuIGZhbHNlO3ZhciB0YWc9YmFzZUdldFRhZyh2YWx1ZSk7cmV0dXJuIHRhZz09ZXJyb3JUYWd8fHRhZz09ZG9tRXhjVGFnfHx0eXBlb2YgdmFsdWUubWVzc2FnZT09InN0cmluZyImJnR5cGVvZiB2YWx1ZS5uYW1lPT0ic3RyaW5nIiYmIWlzUGxhaW5PYmplY3QodmFsdWUpfWZ1bmN0aW9uIGlzRmluaXRlKHZhbHVlKXtyZXR1cm4gdHlwZW9mIHZhbHVlPT0ibnVtYmVyIiYmbmF0aXZlSXNGaW5pdGUodmFsdWUpfWZ1bmN0aW9uIGlzRnVuY3Rpb24odmFsdWUpe2lmKCFpc09iamVjdCh2YWx1ZSkpcmV0dXJuIGZhbHNlO3ZhciB0YWc9YmFzZUdldFRhZyh2YWx1ZSk7cmV0dXJuIHRhZz09CmZ1bmNUYWd8fHRhZz09Z2VuVGFnfHx0YWc9PWFzeW5jVGFnfHx0YWc9PXByb3h5VGFnfWZ1bmN0aW9uIGlzSW50ZWdlcih2YWx1ZSl7cmV0dXJuIHR5cGVvZiB2YWx1ZT09Im51bWJlciImJnZhbHVlPT10b0ludGVnZXIodmFsdWUpfWZ1bmN0aW9uIGlzTGVuZ3RoKHZhbHVlKXtyZXR1cm4gdHlwZW9mIHZhbHVlPT0ibnVtYmVyIiYmdmFsdWU+LTEmJnZhbHVlJTE9PTAmJnZhbHVlPD1NQVhfU0FGRV9JTlRFR0VSfWZ1bmN0aW9uIGlzT2JqZWN0KHZhbHVlKXt2YXIgdHlwZT10eXBlb2YgdmFsdWU7cmV0dXJuIHZhbHVlIT1udWxsJiYodHlwZT09Im9iamVjdCJ8fHR5cGU9PSJmdW5jdGlvbiIpfWZ1bmN0aW9uIGlzT2JqZWN0TGlrZSh2YWx1ZSl7cmV0dXJuIHZhbHVlIT1udWxsJiZ0eXBlb2YgdmFsdWU9PSJvYmplY3QifXZhciBpc01hcD1ub2RlSXNNYXA/YmFzZVVuYXJ5KG5vZGVJc01hcCk6YmFzZUlzTWFwO2Z1bmN0aW9uIGlzTWF0Y2gob2JqZWN0LHNvdXJjZSl7cmV0dXJuIG9iamVjdD09PQpzb3VyY2V8fGJhc2VJc01hdGNoKG9iamVjdCxzb3VyY2UsZ2V0TWF0Y2hEYXRhKHNvdXJjZSkpfWZ1bmN0aW9uIGlzTWF0Y2hXaXRoKG9iamVjdCxzb3VyY2UsY3VzdG9taXplcil7Y3VzdG9taXplcj10eXBlb2YgY3VzdG9taXplcj09ImZ1bmN0aW9uIj9jdXN0b21pemVyOnVuZGVmaW5lZDtyZXR1cm4gYmFzZUlzTWF0Y2gob2JqZWN0LHNvdXJjZSxnZXRNYXRjaERhdGEoc291cmNlKSxjdXN0b21pemVyKX1mdW5jdGlvbiBpc05hTih2YWx1ZSl7cmV0dXJuIGlzTnVtYmVyKHZhbHVlKSYmdmFsdWUhPSt2YWx1ZX1mdW5jdGlvbiBpc05hdGl2ZSh2YWx1ZSl7aWYoaXNNYXNrYWJsZSh2YWx1ZSkpdGhyb3cgbmV3IEVycm9yKENPUkVfRVJST1JfVEVYVCk7cmV0dXJuIGJhc2VJc05hdGl2ZSh2YWx1ZSl9ZnVuY3Rpb24gaXNOdWxsKHZhbHVlKXtyZXR1cm4gdmFsdWU9PT1udWxsfWZ1bmN0aW9uIGlzTmlsKHZhbHVlKXtyZXR1cm4gdmFsdWU9PW51bGx9ZnVuY3Rpb24gaXNOdW1iZXIodmFsdWUpe3JldHVybiB0eXBlb2YgdmFsdWU9PQoibnVtYmVyInx8aXNPYmplY3RMaWtlKHZhbHVlKSYmYmFzZUdldFRhZyh2YWx1ZSk9PW51bWJlclRhZ31mdW5jdGlvbiBpc1BsYWluT2JqZWN0KHZhbHVlKXtpZighaXNPYmplY3RMaWtlKHZhbHVlKXx8YmFzZUdldFRhZyh2YWx1ZSkhPW9iamVjdFRhZylyZXR1cm4gZmFsc2U7dmFyIHByb3RvPWdldFByb3RvdHlwZSh2YWx1ZSk7aWYocHJvdG89PT1udWxsKXJldHVybiB0cnVlO3ZhciBDdG9yPWhhc093blByb3BlcnR5LmNhbGwocHJvdG8sImNvbnN0cnVjdG9yIikmJnByb3RvLmNvbnN0cnVjdG9yO3JldHVybiB0eXBlb2YgQ3Rvcj09ImZ1bmN0aW9uIiYmQ3RvciBpbnN0YW5jZW9mIEN0b3ImJmZ1bmNUb1N0cmluZy5jYWxsKEN0b3IpPT1vYmplY3RDdG9yU3RyaW5nfXZhciBpc1JlZ0V4cD1ub2RlSXNSZWdFeHA/YmFzZVVuYXJ5KG5vZGVJc1JlZ0V4cCk6YmFzZUlzUmVnRXhwO2Z1bmN0aW9uIGlzU2FmZUludGVnZXIodmFsdWUpe3JldHVybiBpc0ludGVnZXIodmFsdWUpJiZ2YWx1ZT49Ci1NQVhfU0FGRV9JTlRFR0VSJiZ2YWx1ZTw9TUFYX1NBRkVfSU5URUdFUn12YXIgaXNTZXQ9bm9kZUlzU2V0P2Jhc2VVbmFyeShub2RlSXNTZXQpOmJhc2VJc1NldDtmdW5jdGlvbiBpc1N0cmluZyh2YWx1ZSl7cmV0dXJuIHR5cGVvZiB2YWx1ZT09InN0cmluZyJ8fCFpc0FycmF5KHZhbHVlKSYmaXNPYmplY3RMaWtlKHZhbHVlKSYmYmFzZUdldFRhZyh2YWx1ZSk9PXN0cmluZ1RhZ31mdW5jdGlvbiBpc1N5bWJvbCh2YWx1ZSl7cmV0dXJuIHR5cGVvZiB2YWx1ZT09InN5bWJvbCJ8fGlzT2JqZWN0TGlrZSh2YWx1ZSkmJmJhc2VHZXRUYWcodmFsdWUpPT1zeW1ib2xUYWd9dmFyIGlzVHlwZWRBcnJheT1ub2RlSXNUeXBlZEFycmF5P2Jhc2VVbmFyeShub2RlSXNUeXBlZEFycmF5KTpiYXNlSXNUeXBlZEFycmF5O2Z1bmN0aW9uIGlzVW5kZWZpbmVkKHZhbHVlKXtyZXR1cm4gdmFsdWU9PT11bmRlZmluZWR9ZnVuY3Rpb24gaXNXZWFrTWFwKHZhbHVlKXtyZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSYmCmdldFRhZyh2YWx1ZSk9PXdlYWtNYXBUYWd9ZnVuY3Rpb24gaXNXZWFrU2V0KHZhbHVlKXtyZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSYmYmFzZUdldFRhZyh2YWx1ZSk9PXdlYWtTZXRUYWd9dmFyIGx0PWNyZWF0ZVJlbGF0aW9uYWxPcGVyYXRpb24oYmFzZUx0KTt2YXIgbHRlPWNyZWF0ZVJlbGF0aW9uYWxPcGVyYXRpb24oZnVuY3Rpb24odmFsdWUsb3RoZXIpe3JldHVybiB2YWx1ZTw9b3RoZXJ9KTtmdW5jdGlvbiB0b0FycmF5KHZhbHVlKXtpZighdmFsdWUpcmV0dXJuW107aWYoaXNBcnJheUxpa2UodmFsdWUpKXJldHVybiBpc1N0cmluZyh2YWx1ZSk/c3RyaW5nVG9BcnJheSh2YWx1ZSk6Y29weUFycmF5KHZhbHVlKTtpZihzeW1JdGVyYXRvciYmdmFsdWVbc3ltSXRlcmF0b3JdKXJldHVybiBpdGVyYXRvclRvQXJyYXkodmFsdWVbc3ltSXRlcmF0b3JdKCkpO3ZhciB0YWc9Z2V0VGFnKHZhbHVlKSxmdW5jPXRhZz09bWFwVGFnP21hcFRvQXJyYXk6dGFnPT1zZXRUYWc/c2V0VG9BcnJheToKdmFsdWVzO3JldHVybiBmdW5jKHZhbHVlKX1mdW5jdGlvbiB0b0Zpbml0ZSh2YWx1ZSl7aWYoIXZhbHVlKXJldHVybiB2YWx1ZT09PTA/dmFsdWU6MDt2YWx1ZT10b051bWJlcih2YWx1ZSk7aWYodmFsdWU9PT1JTkZJTklUWXx8dmFsdWU9PT0tSU5GSU5JVFkpe3ZhciBzaWduPXZhbHVlPDA/LTE6MTtyZXR1cm4gc2lnbipNQVhfSU5URUdFUn1yZXR1cm4gdmFsdWU9PT12YWx1ZT92YWx1ZTowfWZ1bmN0aW9uIHRvSW50ZWdlcih2YWx1ZSl7dmFyIHJlc3VsdD10b0Zpbml0ZSh2YWx1ZSkscmVtYWluZGVyPXJlc3VsdCUxO3JldHVybiByZXN1bHQ9PT1yZXN1bHQ/cmVtYWluZGVyP3Jlc3VsdC1yZW1haW5kZXI6cmVzdWx0OjB9ZnVuY3Rpb24gdG9MZW5ndGgodmFsdWUpe3JldHVybiB2YWx1ZT9iYXNlQ2xhbXAodG9JbnRlZ2VyKHZhbHVlKSwwLE1BWF9BUlJBWV9MRU5HVEgpOjB9ZnVuY3Rpb24gdG9OdW1iZXIodmFsdWUpe2lmKHR5cGVvZiB2YWx1ZT09Im51bWJlciIpcmV0dXJuIHZhbHVlOwppZihpc1N5bWJvbCh2YWx1ZSkpcmV0dXJuIE5BTjtpZihpc09iamVjdCh2YWx1ZSkpe3ZhciBvdGhlcj10eXBlb2YgdmFsdWUudmFsdWVPZj09ImZ1bmN0aW9uIj92YWx1ZS52YWx1ZU9mKCk6dmFsdWU7dmFsdWU9aXNPYmplY3Qob3RoZXIpP290aGVyKyIiOm90aGVyfWlmKHR5cGVvZiB2YWx1ZSE9InN0cmluZyIpcmV0dXJuIHZhbHVlPT09MD92YWx1ZTordmFsdWU7dmFsdWU9dmFsdWUucmVwbGFjZShyZVRyaW0sIiIpO3ZhciBpc0JpbmFyeT1yZUlzQmluYXJ5LnRlc3QodmFsdWUpO3JldHVybiBpc0JpbmFyeXx8cmVJc09jdGFsLnRlc3QodmFsdWUpP2ZyZWVQYXJzZUludCh2YWx1ZS5zbGljZSgyKSxpc0JpbmFyeT8yOjgpOnJlSXNCYWRIZXgudGVzdCh2YWx1ZSk/TkFOOit2YWx1ZX1mdW5jdGlvbiB0b1BsYWluT2JqZWN0KHZhbHVlKXtyZXR1cm4gY29weU9iamVjdCh2YWx1ZSxrZXlzSW4odmFsdWUpKX1mdW5jdGlvbiB0b1NhZmVJbnRlZ2VyKHZhbHVlKXtyZXR1cm4gdmFsdWU/CmJhc2VDbGFtcCh0b0ludGVnZXIodmFsdWUpLC1NQVhfU0FGRV9JTlRFR0VSLE1BWF9TQUZFX0lOVEVHRVIpOnZhbHVlPT09MD92YWx1ZTowfWZ1bmN0aW9uIHRvU3RyaW5nKHZhbHVlKXtyZXR1cm4gdmFsdWU9PW51bGw/IiI6YmFzZVRvU3RyaW5nKHZhbHVlKX12YXIgYXNzaWduPWNyZWF0ZUFzc2lnbmVyKGZ1bmN0aW9uKG9iamVjdCxzb3VyY2Upe2lmKGlzUHJvdG90eXBlKHNvdXJjZSl8fGlzQXJyYXlMaWtlKHNvdXJjZSkpe2NvcHlPYmplY3Qoc291cmNlLGtleXMoc291cmNlKSxvYmplY3QpO3JldHVybn1mb3IodmFyIGtleSBpbiBzb3VyY2UpaWYoaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2Usa2V5KSlhc3NpZ25WYWx1ZShvYmplY3Qsa2V5LHNvdXJjZVtrZXldKX0pO3ZhciBhc3NpZ25Jbj1jcmVhdGVBc3NpZ25lcihmdW5jdGlvbihvYmplY3Qsc291cmNlKXtjb3B5T2JqZWN0KHNvdXJjZSxrZXlzSW4oc291cmNlKSxvYmplY3QpfSk7dmFyIGFzc2lnbkluV2l0aD1jcmVhdGVBc3NpZ25lcihmdW5jdGlvbihvYmplY3QsCnNvdXJjZSxzcmNJbmRleCxjdXN0b21pemVyKXtjb3B5T2JqZWN0KHNvdXJjZSxrZXlzSW4oc291cmNlKSxvYmplY3QsY3VzdG9taXplcil9KTt2YXIgYXNzaWduV2l0aD1jcmVhdGVBc3NpZ25lcihmdW5jdGlvbihvYmplY3Qsc291cmNlLHNyY0luZGV4LGN1c3RvbWl6ZXIpe2NvcHlPYmplY3Qoc291cmNlLGtleXMoc291cmNlKSxvYmplY3QsY3VzdG9taXplcil9KTt2YXIgYXQ9ZmxhdFJlc3QoYmFzZUF0KTtmdW5jdGlvbiBjcmVhdGUocHJvdG90eXBlLHByb3BlcnRpZXMpe3ZhciByZXN1bHQ9YmFzZUNyZWF0ZShwcm90b3R5cGUpO3JldHVybiBwcm9wZXJ0aWVzPT1udWxsP3Jlc3VsdDpiYXNlQXNzaWduKHJlc3VsdCxwcm9wZXJ0aWVzKX12YXIgZGVmYXVsdHM9YmFzZVJlc3QoZnVuY3Rpb24ob2JqZWN0LHNvdXJjZXMpe29iamVjdD1PYmplY3Qob2JqZWN0KTt2YXIgaW5kZXg9LTE7dmFyIGxlbmd0aD1zb3VyY2VzLmxlbmd0aDt2YXIgZ3VhcmQ9bGVuZ3RoPjI/c291cmNlc1syXToKdW5kZWZpbmVkO2lmKGd1YXJkJiZpc0l0ZXJhdGVlQ2FsbChzb3VyY2VzWzBdLHNvdXJjZXNbMV0sZ3VhcmQpKWxlbmd0aD0xO3doaWxlKCsraW5kZXg8bGVuZ3RoKXt2YXIgc291cmNlPXNvdXJjZXNbaW5kZXhdO3ZhciBwcm9wcz1rZXlzSW4oc291cmNlKTt2YXIgcHJvcHNJbmRleD0tMTt2YXIgcHJvcHNMZW5ndGg9cHJvcHMubGVuZ3RoO3doaWxlKCsrcHJvcHNJbmRleDxwcm9wc0xlbmd0aCl7dmFyIGtleT1wcm9wc1twcm9wc0luZGV4XTt2YXIgdmFsdWU9b2JqZWN0W2tleV07aWYodmFsdWU9PT11bmRlZmluZWR8fGVxKHZhbHVlLG9iamVjdFByb3RvW2tleV0pJiYhaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3Qsa2V5KSlvYmplY3Rba2V5XT1zb3VyY2Vba2V5XX19cmV0dXJuIG9iamVjdH0pO3ZhciBkZWZhdWx0c0RlZXA9YmFzZVJlc3QoZnVuY3Rpb24oYXJncyl7YXJncy5wdXNoKHVuZGVmaW5lZCxjdXN0b21EZWZhdWx0c01lcmdlKTtyZXR1cm4gYXBwbHkobWVyZ2VXaXRoLAp1bmRlZmluZWQsYXJncyl9KTtmdW5jdGlvbiBmaW5kS2V5KG9iamVjdCxwcmVkaWNhdGUpe3JldHVybiBiYXNlRmluZEtleShvYmplY3QsZ2V0SXRlcmF0ZWUocHJlZGljYXRlLDMpLGJhc2VGb3JPd24pfWZ1bmN0aW9uIGZpbmRMYXN0S2V5KG9iamVjdCxwcmVkaWNhdGUpe3JldHVybiBiYXNlRmluZEtleShvYmplY3QsZ2V0SXRlcmF0ZWUocHJlZGljYXRlLDMpLGJhc2VGb3JPd25SaWdodCl9ZnVuY3Rpb24gZm9ySW4ob2JqZWN0LGl0ZXJhdGVlKXtyZXR1cm4gb2JqZWN0PT1udWxsP29iamVjdDpiYXNlRm9yKG9iamVjdCxnZXRJdGVyYXRlZShpdGVyYXRlZSwzKSxrZXlzSW4pfWZ1bmN0aW9uIGZvckluUmlnaHQob2JqZWN0LGl0ZXJhdGVlKXtyZXR1cm4gb2JqZWN0PT1udWxsP29iamVjdDpiYXNlRm9yUmlnaHQob2JqZWN0LGdldEl0ZXJhdGVlKGl0ZXJhdGVlLDMpLGtleXNJbil9ZnVuY3Rpb24gZm9yT3duKG9iamVjdCxpdGVyYXRlZSl7cmV0dXJuIG9iamVjdCYmYmFzZUZvck93bihvYmplY3QsCmdldEl0ZXJhdGVlKGl0ZXJhdGVlLDMpKX1mdW5jdGlvbiBmb3JPd25SaWdodChvYmplY3QsaXRlcmF0ZWUpe3JldHVybiBvYmplY3QmJmJhc2VGb3JPd25SaWdodChvYmplY3QsZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsMykpfWZ1bmN0aW9uIGZ1bmN0aW9ucyhvYmplY3Qpe3JldHVybiBvYmplY3Q9PW51bGw/W106YmFzZUZ1bmN0aW9ucyhvYmplY3Qsa2V5cyhvYmplY3QpKX1mdW5jdGlvbiBmdW5jdGlvbnNJbihvYmplY3Qpe3JldHVybiBvYmplY3Q9PW51bGw/W106YmFzZUZ1bmN0aW9ucyhvYmplY3Qsa2V5c0luKG9iamVjdCkpfWZ1bmN0aW9uIGdldChvYmplY3QscGF0aCxkZWZhdWx0VmFsdWUpe3ZhciByZXN1bHQ9b2JqZWN0PT1udWxsP3VuZGVmaW5lZDpiYXNlR2V0KG9iamVjdCxwYXRoKTtyZXR1cm4gcmVzdWx0PT09dW5kZWZpbmVkP2RlZmF1bHRWYWx1ZTpyZXN1bHR9ZnVuY3Rpb24gaGFzKG9iamVjdCxwYXRoKXtyZXR1cm4gb2JqZWN0IT1udWxsJiZoYXNQYXRoKG9iamVjdCwKcGF0aCxiYXNlSGFzKX1mdW5jdGlvbiBoYXNJbihvYmplY3QscGF0aCl7cmV0dXJuIG9iamVjdCE9bnVsbCYmaGFzUGF0aChvYmplY3QscGF0aCxiYXNlSGFzSW4pfXZhciBpbnZlcnQ9Y3JlYXRlSW52ZXJ0ZXIoZnVuY3Rpb24ocmVzdWx0LHZhbHVlLGtleSl7aWYodmFsdWUhPW51bGwmJnR5cGVvZiB2YWx1ZS50b1N0cmluZyE9ImZ1bmN0aW9uIil2YWx1ZT1uYXRpdmVPYmplY3RUb1N0cmluZy5jYWxsKHZhbHVlKTtyZXN1bHRbdmFsdWVdPWtleX0sY29uc3RhbnQoaWRlbnRpdHkpKTt2YXIgaW52ZXJ0Qnk9Y3JlYXRlSW52ZXJ0ZXIoZnVuY3Rpb24ocmVzdWx0LHZhbHVlLGtleSl7aWYodmFsdWUhPW51bGwmJnR5cGVvZiB2YWx1ZS50b1N0cmluZyE9ImZ1bmN0aW9uIil2YWx1ZT1uYXRpdmVPYmplY3RUb1N0cmluZy5jYWxsKHZhbHVlKTtpZihoYXNPd25Qcm9wZXJ0eS5jYWxsKHJlc3VsdCx2YWx1ZSkpcmVzdWx0W3ZhbHVlXS5wdXNoKGtleSk7ZWxzZSByZXN1bHRbdmFsdWVdPVtrZXldfSwKZ2V0SXRlcmF0ZWUpO3ZhciBpbnZva2U9YmFzZVJlc3QoYmFzZUludm9rZSk7ZnVuY3Rpb24ga2V5cyhvYmplY3Qpe3JldHVybiBpc0FycmF5TGlrZShvYmplY3QpP2FycmF5TGlrZUtleXMob2JqZWN0KTpiYXNlS2V5cyhvYmplY3QpfWZ1bmN0aW9uIGtleXNJbihvYmplY3Qpe3JldHVybiBpc0FycmF5TGlrZShvYmplY3QpP2FycmF5TGlrZUtleXMob2JqZWN0LHRydWUpOmJhc2VLZXlzSW4ob2JqZWN0KX1mdW5jdGlvbiBtYXBLZXlzKG9iamVjdCxpdGVyYXRlZSl7dmFyIHJlc3VsdD17fTtpdGVyYXRlZT1nZXRJdGVyYXRlZShpdGVyYXRlZSwzKTtiYXNlRm9yT3duKG9iamVjdCxmdW5jdGlvbih2YWx1ZSxrZXksb2JqZWN0KXtiYXNlQXNzaWduVmFsdWUocmVzdWx0LGl0ZXJhdGVlKHZhbHVlLGtleSxvYmplY3QpLHZhbHVlKX0pO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gbWFwVmFsdWVzKG9iamVjdCxpdGVyYXRlZSl7dmFyIHJlc3VsdD17fTtpdGVyYXRlZT1nZXRJdGVyYXRlZShpdGVyYXRlZSwKMyk7YmFzZUZvck93bihvYmplY3QsZnVuY3Rpb24odmFsdWUsa2V5LG9iamVjdCl7YmFzZUFzc2lnblZhbHVlKHJlc3VsdCxrZXksaXRlcmF0ZWUodmFsdWUsa2V5LG9iamVjdCkpfSk7cmV0dXJuIHJlc3VsdH12YXIgbWVyZ2U9Y3JlYXRlQXNzaWduZXIoZnVuY3Rpb24ob2JqZWN0LHNvdXJjZSxzcmNJbmRleCl7YmFzZU1lcmdlKG9iamVjdCxzb3VyY2Usc3JjSW5kZXgpfSk7dmFyIG1lcmdlV2l0aD1jcmVhdGVBc3NpZ25lcihmdW5jdGlvbihvYmplY3Qsc291cmNlLHNyY0luZGV4LGN1c3RvbWl6ZXIpe2Jhc2VNZXJnZShvYmplY3Qsc291cmNlLHNyY0luZGV4LGN1c3RvbWl6ZXIpfSk7dmFyIG9taXQ9ZmxhdFJlc3QoZnVuY3Rpb24ob2JqZWN0LHBhdGhzKXt2YXIgcmVzdWx0PXt9O2lmKG9iamVjdD09bnVsbClyZXR1cm4gcmVzdWx0O3ZhciBpc0RlZXA9ZmFsc2U7cGF0aHM9YXJyYXlNYXAocGF0aHMsZnVuY3Rpb24ocGF0aCl7cGF0aD1jYXN0UGF0aChwYXRoLG9iamVjdCk7aXNEZWVwfHwKKGlzRGVlcD1wYXRoLmxlbmd0aD4xKTtyZXR1cm4gcGF0aH0pO2NvcHlPYmplY3Qob2JqZWN0LGdldEFsbEtleXNJbihvYmplY3QpLHJlc3VsdCk7aWYoaXNEZWVwKXJlc3VsdD1iYXNlQ2xvbmUocmVzdWx0LENMT05FX0RFRVBfRkxBR3xDTE9ORV9GTEFUX0ZMQUd8Q0xPTkVfU1lNQk9MU19GTEFHLGN1c3RvbU9taXRDbG9uZSk7dmFyIGxlbmd0aD1wYXRocy5sZW5ndGg7d2hpbGUobGVuZ3RoLS0pYmFzZVVuc2V0KHJlc3VsdCxwYXRoc1tsZW5ndGhdKTtyZXR1cm4gcmVzdWx0fSk7ZnVuY3Rpb24gb21pdEJ5KG9iamVjdCxwcmVkaWNhdGUpe3JldHVybiBwaWNrQnkob2JqZWN0LG5lZ2F0ZShnZXRJdGVyYXRlZShwcmVkaWNhdGUpKSl9dmFyIHBpY2s9ZmxhdFJlc3QoZnVuY3Rpb24ob2JqZWN0LHBhdGhzKXtyZXR1cm4gb2JqZWN0PT1udWxsP3t9OmJhc2VQaWNrKG9iamVjdCxwYXRocyl9KTtmdW5jdGlvbiBwaWNrQnkob2JqZWN0LHByZWRpY2F0ZSl7aWYob2JqZWN0PT1udWxsKXJldHVybnt9Owp2YXIgcHJvcHM9YXJyYXlNYXAoZ2V0QWxsS2V5c0luKG9iamVjdCksZnVuY3Rpb24ocHJvcCl7cmV0dXJuW3Byb3BdfSk7cHJlZGljYXRlPWdldEl0ZXJhdGVlKHByZWRpY2F0ZSk7cmV0dXJuIGJhc2VQaWNrQnkob2JqZWN0LHByb3BzLGZ1bmN0aW9uKHZhbHVlLHBhdGgpe3JldHVybiBwcmVkaWNhdGUodmFsdWUscGF0aFswXSl9KX1mdW5jdGlvbiByZXN1bHQob2JqZWN0LHBhdGgsZGVmYXVsdFZhbHVlKXtwYXRoPWNhc3RQYXRoKHBhdGgsb2JqZWN0KTt2YXIgaW5kZXg9LTEsbGVuZ3RoPXBhdGgubGVuZ3RoO2lmKCFsZW5ndGgpe2xlbmd0aD0xO29iamVjdD11bmRlZmluZWR9d2hpbGUoKytpbmRleDxsZW5ndGgpe3ZhciB2YWx1ZT1vYmplY3Q9PW51bGw/dW5kZWZpbmVkOm9iamVjdFt0b0tleShwYXRoW2luZGV4XSldO2lmKHZhbHVlPT09dW5kZWZpbmVkKXtpbmRleD1sZW5ndGg7dmFsdWU9ZGVmYXVsdFZhbHVlfW9iamVjdD1pc0Z1bmN0aW9uKHZhbHVlKT92YWx1ZS5jYWxsKG9iamVjdCk6CnZhbHVlfXJldHVybiBvYmplY3R9ZnVuY3Rpb24gc2V0KG9iamVjdCxwYXRoLHZhbHVlKXtyZXR1cm4gb2JqZWN0PT1udWxsP29iamVjdDpiYXNlU2V0KG9iamVjdCxwYXRoLHZhbHVlKX1mdW5jdGlvbiBzZXRXaXRoKG9iamVjdCxwYXRoLHZhbHVlLGN1c3RvbWl6ZXIpe2N1c3RvbWl6ZXI9dHlwZW9mIGN1c3RvbWl6ZXI9PSJmdW5jdGlvbiI/Y3VzdG9taXplcjp1bmRlZmluZWQ7cmV0dXJuIG9iamVjdD09bnVsbD9vYmplY3Q6YmFzZVNldChvYmplY3QscGF0aCx2YWx1ZSxjdXN0b21pemVyKX12YXIgdG9QYWlycz1jcmVhdGVUb1BhaXJzKGtleXMpO3ZhciB0b1BhaXJzSW49Y3JlYXRlVG9QYWlycyhrZXlzSW4pO2Z1bmN0aW9uIHRyYW5zZm9ybShvYmplY3QsaXRlcmF0ZWUsYWNjdW11bGF0b3Ipe3ZhciBpc0Fycj1pc0FycmF5KG9iamVjdCksaXNBcnJMaWtlPWlzQXJyfHxpc0J1ZmZlcihvYmplY3QpfHxpc1R5cGVkQXJyYXkob2JqZWN0KTtpdGVyYXRlZT1nZXRJdGVyYXRlZShpdGVyYXRlZSwKNCk7aWYoYWNjdW11bGF0b3I9PW51bGwpe3ZhciBDdG9yPW9iamVjdCYmb2JqZWN0LmNvbnN0cnVjdG9yO2lmKGlzQXJyTGlrZSlhY2N1bXVsYXRvcj1pc0Fycj9uZXcgQ3RvcjpbXTtlbHNlIGlmKGlzT2JqZWN0KG9iamVjdCkpYWNjdW11bGF0b3I9aXNGdW5jdGlvbihDdG9yKT9iYXNlQ3JlYXRlKGdldFByb3RvdHlwZShvYmplY3QpKTp7fTtlbHNlIGFjY3VtdWxhdG9yPXt9fShpc0Fyckxpa2U/YXJyYXlFYWNoOmJhc2VGb3JPd24pKG9iamVjdCxmdW5jdGlvbih2YWx1ZSxpbmRleCxvYmplY3Qpe3JldHVybiBpdGVyYXRlZShhY2N1bXVsYXRvcix2YWx1ZSxpbmRleCxvYmplY3QpfSk7cmV0dXJuIGFjY3VtdWxhdG9yfWZ1bmN0aW9uIHVuc2V0KG9iamVjdCxwYXRoKXtyZXR1cm4gb2JqZWN0PT1udWxsP3RydWU6YmFzZVVuc2V0KG9iamVjdCxwYXRoKX1mdW5jdGlvbiB1cGRhdGUob2JqZWN0LHBhdGgsdXBkYXRlcil7cmV0dXJuIG9iamVjdD09bnVsbD9vYmplY3Q6YmFzZVVwZGF0ZShvYmplY3QsCnBhdGgsY2FzdEZ1bmN0aW9uKHVwZGF0ZXIpKX1mdW5jdGlvbiB1cGRhdGVXaXRoKG9iamVjdCxwYXRoLHVwZGF0ZXIsY3VzdG9taXplcil7Y3VzdG9taXplcj10eXBlb2YgY3VzdG9taXplcj09ImZ1bmN0aW9uIj9jdXN0b21pemVyOnVuZGVmaW5lZDtyZXR1cm4gb2JqZWN0PT1udWxsP29iamVjdDpiYXNlVXBkYXRlKG9iamVjdCxwYXRoLGNhc3RGdW5jdGlvbih1cGRhdGVyKSxjdXN0b21pemVyKX1mdW5jdGlvbiB2YWx1ZXMob2JqZWN0KXtyZXR1cm4gb2JqZWN0PT1udWxsP1tdOmJhc2VWYWx1ZXMob2JqZWN0LGtleXMob2JqZWN0KSl9ZnVuY3Rpb24gdmFsdWVzSW4ob2JqZWN0KXtyZXR1cm4gb2JqZWN0PT1udWxsP1tdOmJhc2VWYWx1ZXMob2JqZWN0LGtleXNJbihvYmplY3QpKX1mdW5jdGlvbiBjbGFtcChudW1iZXIsbG93ZXIsdXBwZXIpe2lmKHVwcGVyPT09dW5kZWZpbmVkKXt1cHBlcj1sb3dlcjtsb3dlcj11bmRlZmluZWR9aWYodXBwZXIhPT11bmRlZmluZWQpe3VwcGVyPQp0b051bWJlcih1cHBlcik7dXBwZXI9dXBwZXI9PT11cHBlcj91cHBlcjowfWlmKGxvd2VyIT09dW5kZWZpbmVkKXtsb3dlcj10b051bWJlcihsb3dlcik7bG93ZXI9bG93ZXI9PT1sb3dlcj9sb3dlcjowfXJldHVybiBiYXNlQ2xhbXAodG9OdW1iZXIobnVtYmVyKSxsb3dlcix1cHBlcil9ZnVuY3Rpb24gaW5SYW5nZShudW1iZXIsc3RhcnQsZW5kKXtzdGFydD10b0Zpbml0ZShzdGFydCk7aWYoZW5kPT09dW5kZWZpbmVkKXtlbmQ9c3RhcnQ7c3RhcnQ9MH1lbHNlIGVuZD10b0Zpbml0ZShlbmQpO251bWJlcj10b051bWJlcihudW1iZXIpO3JldHVybiBiYXNlSW5SYW5nZShudW1iZXIsc3RhcnQsZW5kKX1mdW5jdGlvbiByYW5kb20obG93ZXIsdXBwZXIsZmxvYXRpbmcpe2lmKGZsb2F0aW5nJiZ0eXBlb2YgZmxvYXRpbmchPSJib29sZWFuIiYmaXNJdGVyYXRlZUNhbGwobG93ZXIsdXBwZXIsZmxvYXRpbmcpKXVwcGVyPWZsb2F0aW5nPXVuZGVmaW5lZDtpZihmbG9hdGluZz09PXVuZGVmaW5lZClpZih0eXBlb2YgdXBwZXI9PQoiYm9vbGVhbiIpe2Zsb2F0aW5nPXVwcGVyO3VwcGVyPXVuZGVmaW5lZH1lbHNlIGlmKHR5cGVvZiBsb3dlcj09ImJvb2xlYW4iKXtmbG9hdGluZz1sb3dlcjtsb3dlcj11bmRlZmluZWR9aWYobG93ZXI9PT11bmRlZmluZWQmJnVwcGVyPT09dW5kZWZpbmVkKXtsb3dlcj0wO3VwcGVyPTF9ZWxzZXtsb3dlcj10b0Zpbml0ZShsb3dlcik7aWYodXBwZXI9PT11bmRlZmluZWQpe3VwcGVyPWxvd2VyO2xvd2VyPTB9ZWxzZSB1cHBlcj10b0Zpbml0ZSh1cHBlcil9aWYobG93ZXI+dXBwZXIpe3ZhciB0ZW1wPWxvd2VyO2xvd2VyPXVwcGVyO3VwcGVyPXRlbXB9aWYoZmxvYXRpbmd8fGxvd2VyJTF8fHVwcGVyJTEpe3ZhciByYW5kPW5hdGl2ZVJhbmRvbSgpO3JldHVybiBuYXRpdmVNaW4obG93ZXIrcmFuZCoodXBwZXItbG93ZXIrZnJlZVBhcnNlRmxvYXQoIjFlLSIrKChyYW5kKyIiKS5sZW5ndGgtMSkpKSx1cHBlcil9cmV0dXJuIGJhc2VSYW5kb20obG93ZXIsdXBwZXIpfXZhciBjYW1lbENhc2U9CmNyZWF0ZUNvbXBvdW5kZXIoZnVuY3Rpb24ocmVzdWx0LHdvcmQsaW5kZXgpe3dvcmQ9d29yZC50b0xvd2VyQ2FzZSgpO3JldHVybiByZXN1bHQrKGluZGV4P2NhcGl0YWxpemUod29yZCk6d29yZCl9KTtmdW5jdGlvbiBjYXBpdGFsaXplKHN0cmluZyl7cmV0dXJuIHVwcGVyRmlyc3QodG9TdHJpbmcoc3RyaW5nKS50b0xvd2VyQ2FzZSgpKX1mdW5jdGlvbiBkZWJ1cnIoc3RyaW5nKXtzdHJpbmc9dG9TdHJpbmcoc3RyaW5nKTtyZXR1cm4gc3RyaW5nJiZzdHJpbmcucmVwbGFjZShyZUxhdGluLGRlYnVyckxldHRlcikucmVwbGFjZShyZUNvbWJvTWFyaywiIil9ZnVuY3Rpb24gZW5kc1dpdGgoc3RyaW5nLHRhcmdldCxwb3NpdGlvbil7c3RyaW5nPXRvU3RyaW5nKHN0cmluZyk7dGFyZ2V0PWJhc2VUb1N0cmluZyh0YXJnZXQpO3ZhciBsZW5ndGg9c3RyaW5nLmxlbmd0aDtwb3NpdGlvbj1wb3NpdGlvbj09PXVuZGVmaW5lZD9sZW5ndGg6YmFzZUNsYW1wKHRvSW50ZWdlcihwb3NpdGlvbiksCjAsbGVuZ3RoKTt2YXIgZW5kPXBvc2l0aW9uO3Bvc2l0aW9uLT10YXJnZXQubGVuZ3RoO3JldHVybiBwb3NpdGlvbj49MCYmc3RyaW5nLnNsaWNlKHBvc2l0aW9uLGVuZCk9PXRhcmdldH1mdW5jdGlvbiBlc2NhcGUoc3RyaW5nKXtzdHJpbmc9dG9TdHJpbmcoc3RyaW5nKTtyZXR1cm4gc3RyaW5nJiZyZUhhc1VuZXNjYXBlZEh0bWwudGVzdChzdHJpbmcpP3N0cmluZy5yZXBsYWNlKHJlVW5lc2NhcGVkSHRtbCxlc2NhcGVIdG1sQ2hhcik6c3RyaW5nfWZ1bmN0aW9uIGVzY2FwZVJlZ0V4cChzdHJpbmcpe3N0cmluZz10b1N0cmluZyhzdHJpbmcpO3JldHVybiBzdHJpbmcmJnJlSGFzUmVnRXhwQ2hhci50ZXN0KHN0cmluZyk/c3RyaW5nLnJlcGxhY2UocmVSZWdFeHBDaGFyLCJcXCRceDI2Iik6c3RyaW5nfXZhciBrZWJhYkNhc2U9Y3JlYXRlQ29tcG91bmRlcihmdW5jdGlvbihyZXN1bHQsd29yZCxpbmRleCl7cmV0dXJuIHJlc3VsdCsoaW5kZXg/Ii0iOiIiKSt3b3JkLnRvTG93ZXJDYXNlKCl9KTsKdmFyIGxvd2VyQ2FzZT1jcmVhdGVDb21wb3VuZGVyKGZ1bmN0aW9uKHJlc3VsdCx3b3JkLGluZGV4KXtyZXR1cm4gcmVzdWx0KyhpbmRleD8iICI6IiIpK3dvcmQudG9Mb3dlckNhc2UoKX0pO3ZhciBsb3dlckZpcnN0PWNyZWF0ZUNhc2VGaXJzdCgidG9Mb3dlckNhc2UiKTtmdW5jdGlvbiBwYWQoc3RyaW5nLGxlbmd0aCxjaGFycyl7c3RyaW5nPXRvU3RyaW5nKHN0cmluZyk7bGVuZ3RoPXRvSW50ZWdlcihsZW5ndGgpO3ZhciBzdHJMZW5ndGg9bGVuZ3RoP3N0cmluZ1NpemUoc3RyaW5nKTowO2lmKCFsZW5ndGh8fHN0ckxlbmd0aD49bGVuZ3RoKXJldHVybiBzdHJpbmc7dmFyIG1pZD0obGVuZ3RoLXN0ckxlbmd0aCkvMjtyZXR1cm4gY3JlYXRlUGFkZGluZyhuYXRpdmVGbG9vcihtaWQpLGNoYXJzKStzdHJpbmcrY3JlYXRlUGFkZGluZyhuYXRpdmVDZWlsKG1pZCksY2hhcnMpfWZ1bmN0aW9uIHBhZEVuZChzdHJpbmcsbGVuZ3RoLGNoYXJzKXtzdHJpbmc9dG9TdHJpbmcoc3RyaW5nKTsKbGVuZ3RoPXRvSW50ZWdlcihsZW5ndGgpO3ZhciBzdHJMZW5ndGg9bGVuZ3RoP3N0cmluZ1NpemUoc3RyaW5nKTowO3JldHVybiBsZW5ndGgmJnN0ckxlbmd0aDxsZW5ndGg/c3RyaW5nK2NyZWF0ZVBhZGRpbmcobGVuZ3RoLXN0ckxlbmd0aCxjaGFycyk6c3RyaW5nfWZ1bmN0aW9uIHBhZFN0YXJ0KHN0cmluZyxsZW5ndGgsY2hhcnMpe3N0cmluZz10b1N0cmluZyhzdHJpbmcpO2xlbmd0aD10b0ludGVnZXIobGVuZ3RoKTt2YXIgc3RyTGVuZ3RoPWxlbmd0aD9zdHJpbmdTaXplKHN0cmluZyk6MDtyZXR1cm4gbGVuZ3RoJiZzdHJMZW5ndGg8bGVuZ3RoP2NyZWF0ZVBhZGRpbmcobGVuZ3RoLXN0ckxlbmd0aCxjaGFycykrc3RyaW5nOnN0cmluZ31mdW5jdGlvbiBwYXJzZUludChzdHJpbmcscmFkaXgsZ3VhcmQpe2lmKGd1YXJkfHxyYWRpeD09bnVsbClyYWRpeD0wO2Vsc2UgaWYocmFkaXgpcmFkaXg9K3JhZGl4O3JldHVybiBuYXRpdmVQYXJzZUludCh0b1N0cmluZyhzdHJpbmcpLnJlcGxhY2UocmVUcmltU3RhcnQsCiIiKSxyYWRpeHx8MCl9ZnVuY3Rpb24gcmVwZWF0KHN0cmluZyxuLGd1YXJkKXtpZihndWFyZD9pc0l0ZXJhdGVlQ2FsbChzdHJpbmcsbixndWFyZCk6bj09PXVuZGVmaW5lZCluPTE7ZWxzZSBuPXRvSW50ZWdlcihuKTtyZXR1cm4gYmFzZVJlcGVhdCh0b1N0cmluZyhzdHJpbmcpLG4pfWZ1bmN0aW9uIHJlcGxhY2UoKXt2YXIgYXJncz1hcmd1bWVudHMsc3RyaW5nPXRvU3RyaW5nKGFyZ3NbMF0pO3JldHVybiBhcmdzLmxlbmd0aDwzP3N0cmluZzpzdHJpbmcucmVwbGFjZShhcmdzWzFdLGFyZ3NbMl0pfXZhciBzbmFrZUNhc2U9Y3JlYXRlQ29tcG91bmRlcihmdW5jdGlvbihyZXN1bHQsd29yZCxpbmRleCl7cmV0dXJuIHJlc3VsdCsoaW5kZXg/Il8iOiIiKSt3b3JkLnRvTG93ZXJDYXNlKCl9KTtmdW5jdGlvbiBzcGxpdChzdHJpbmcsc2VwYXJhdG9yLGxpbWl0KXtpZihsaW1pdCYmdHlwZW9mIGxpbWl0IT0ibnVtYmVyIiYmaXNJdGVyYXRlZUNhbGwoc3RyaW5nLHNlcGFyYXRvcixsaW1pdCkpc2VwYXJhdG9yPQpsaW1pdD11bmRlZmluZWQ7bGltaXQ9bGltaXQ9PT11bmRlZmluZWQ/TUFYX0FSUkFZX0xFTkdUSDpsaW1pdD4+PjA7aWYoIWxpbWl0KXJldHVybltdO3N0cmluZz10b1N0cmluZyhzdHJpbmcpO2lmKHN0cmluZyYmKHR5cGVvZiBzZXBhcmF0b3I9PSJzdHJpbmcifHxzZXBhcmF0b3IhPW51bGwmJiFpc1JlZ0V4cChzZXBhcmF0b3IpKSl7c2VwYXJhdG9yPWJhc2VUb1N0cmluZyhzZXBhcmF0b3IpO2lmKCFzZXBhcmF0b3ImJmhhc1VuaWNvZGUoc3RyaW5nKSlyZXR1cm4gY2FzdFNsaWNlKHN0cmluZ1RvQXJyYXkoc3RyaW5nKSwwLGxpbWl0KX1yZXR1cm4gc3RyaW5nLnNwbGl0KHNlcGFyYXRvcixsaW1pdCl9dmFyIHN0YXJ0Q2FzZT1jcmVhdGVDb21wb3VuZGVyKGZ1bmN0aW9uKHJlc3VsdCx3b3JkLGluZGV4KXtyZXR1cm4gcmVzdWx0KyhpbmRleD8iICI6IiIpK3VwcGVyRmlyc3Qod29yZCl9KTtmdW5jdGlvbiBzdGFydHNXaXRoKHN0cmluZyx0YXJnZXQscG9zaXRpb24pe3N0cmluZz0KdG9TdHJpbmcoc3RyaW5nKTtwb3NpdGlvbj1wb3NpdGlvbj09bnVsbD8wOmJhc2VDbGFtcCh0b0ludGVnZXIocG9zaXRpb24pLDAsc3RyaW5nLmxlbmd0aCk7dGFyZ2V0PWJhc2VUb1N0cmluZyh0YXJnZXQpO3JldHVybiBzdHJpbmcuc2xpY2UocG9zaXRpb24scG9zaXRpb24rdGFyZ2V0Lmxlbmd0aCk9PXRhcmdldH1mdW5jdGlvbiB0ZW1wbGF0ZShzdHJpbmcsb3B0aW9ucyxndWFyZCl7dmFyIHNldHRpbmdzPWxvZGFzaC50ZW1wbGF0ZVNldHRpbmdzO2lmKGd1YXJkJiZpc0l0ZXJhdGVlQ2FsbChzdHJpbmcsb3B0aW9ucyxndWFyZCkpb3B0aW9ucz11bmRlZmluZWQ7c3RyaW5nPXRvU3RyaW5nKHN0cmluZyk7b3B0aW9ucz1hc3NpZ25JbldpdGgoe30sb3B0aW9ucyxzZXR0aW5ncyxjdXN0b21EZWZhdWx0c0Fzc2lnbkluKTt2YXIgaW1wb3J0cz1hc3NpZ25JbldpdGgoe30sb3B0aW9ucy5pbXBvcnRzLHNldHRpbmdzLmltcG9ydHMsY3VzdG9tRGVmYXVsdHNBc3NpZ25JbiksaW1wb3J0c0tleXM9CmtleXMoaW1wb3J0cyksaW1wb3J0c1ZhbHVlcz1iYXNlVmFsdWVzKGltcG9ydHMsaW1wb3J0c0tleXMpO3ZhciBpc0VzY2FwaW5nLGlzRXZhbHVhdGluZyxpbmRleD0wLGludGVycG9sYXRlPW9wdGlvbnMuaW50ZXJwb2xhdGV8fHJlTm9NYXRjaCxzb3VyY2U9Il9fcCArXHgzZCAnIjt2YXIgcmVEZWxpbWl0ZXJzPVJlZ0V4cCgob3B0aW9ucy5lc2NhcGV8fHJlTm9NYXRjaCkuc291cmNlKyJ8IitpbnRlcnBvbGF0ZS5zb3VyY2UrInwiKyhpbnRlcnBvbGF0ZT09PXJlSW50ZXJwb2xhdGU/cmVFc1RlbXBsYXRlOnJlTm9NYXRjaCkuc291cmNlKyJ8Iisob3B0aW9ucy5ldmFsdWF0ZXx8cmVOb01hdGNoKS5zb3VyY2UrInwkIiwiZyIpO3ZhciBzb3VyY2VVUkw9Ii8vIyBzb3VyY2VVUkxceDNkIisoInNvdXJjZVVSTCJpbiBvcHRpb25zP29wdGlvbnMuc291cmNlVVJMOiJsb2Rhc2gudGVtcGxhdGVTb3VyY2VzWyIrICsrdGVtcGxhdGVDb3VudGVyKyJdIikrIlxuIjtzdHJpbmcucmVwbGFjZShyZURlbGltaXRlcnMsCmZ1bmN0aW9uKG1hdGNoLGVzY2FwZVZhbHVlLGludGVycG9sYXRlVmFsdWUsZXNUZW1wbGF0ZVZhbHVlLGV2YWx1YXRlVmFsdWUsb2Zmc2V0KXtpbnRlcnBvbGF0ZVZhbHVlfHwoaW50ZXJwb2xhdGVWYWx1ZT1lc1RlbXBsYXRlVmFsdWUpO3NvdXJjZSs9c3RyaW5nLnNsaWNlKGluZGV4LG9mZnNldCkucmVwbGFjZShyZVVuZXNjYXBlZFN0cmluZyxlc2NhcGVTdHJpbmdDaGFyKTtpZihlc2NhcGVWYWx1ZSl7aXNFc2NhcGluZz10cnVlO3NvdXJjZSs9IicgK1xuX19lKCIrZXNjYXBlVmFsdWUrIikgK1xuJyJ9aWYoZXZhbHVhdGVWYWx1ZSl7aXNFdmFsdWF0aW5nPXRydWU7c291cmNlKz0iJztcbiIrZXZhbHVhdGVWYWx1ZSsiO1xuX19wICtceDNkICcifWlmKGludGVycG9sYXRlVmFsdWUpc291cmNlKz0iJyArXG4oKF9fdCBceDNkICgiK2ludGVycG9sYXRlVmFsdWUrIikpIFx4M2RceDNkIG51bGwgPyAnJyA6IF9fdCkgK1xuJyI7aW5kZXg9b2Zmc2V0K21hdGNoLmxlbmd0aDtyZXR1cm4gbWF0Y2h9KTsKc291cmNlKz0iJztcbiI7dmFyIHZhcmlhYmxlPW9wdGlvbnMudmFyaWFibGU7aWYoIXZhcmlhYmxlKXNvdXJjZT0id2l0aCAob2JqKSB7XG4iK3NvdXJjZSsiXG59XG4iO3NvdXJjZT0oaXNFdmFsdWF0aW5nP3NvdXJjZS5yZXBsYWNlKHJlRW1wdHlTdHJpbmdMZWFkaW5nLCIiKTpzb3VyY2UpLnJlcGxhY2UocmVFbXB0eVN0cmluZ01pZGRsZSwiJDEiKS5yZXBsYWNlKHJlRW1wdHlTdHJpbmdUcmFpbGluZywiJDE7Iik7c291cmNlPSJmdW5jdGlvbigiKyh2YXJpYWJsZXx8Im9iaiIpKyIpIHtcbiIrKHZhcmlhYmxlPyIiOiJvYmogfHwgKG9iaiBceDNkIHt9KTtcbiIpKyJ2YXIgX190LCBfX3AgXHgzZCAnJyIrKGlzRXNjYXBpbmc/IiwgX19lIFx4M2QgXy5lc2NhcGUiOiIiKSsoaXNFdmFsdWF0aW5nPyIsIF9faiBceDNkIEFycmF5LnByb3RvdHlwZS5qb2luO1xuIisiZnVuY3Rpb24gcHJpbnQoKSB7IF9fcCArXHgzZCBfX2ouY2FsbChhcmd1bWVudHMsICcnKSB9XG4iOiI7XG4iKStzb3VyY2UrCiJyZXR1cm4gX19wXG59Ijt2YXIgcmVzdWx0PWF0dGVtcHQoZnVuY3Rpb24oKXtyZXR1cm4gRnVuY3Rpb24oaW1wb3J0c0tleXMsc291cmNlVVJMKyJyZXR1cm4gIitzb3VyY2UpLmFwcGx5KHVuZGVmaW5lZCxpbXBvcnRzVmFsdWVzKX0pO3Jlc3VsdC5zb3VyY2U9c291cmNlO2lmKGlzRXJyb3IocmVzdWx0KSl0aHJvdyByZXN1bHQ7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiB0b0xvd2VyKHZhbHVlKXtyZXR1cm4gdG9TdHJpbmcodmFsdWUpLnRvTG93ZXJDYXNlKCl9ZnVuY3Rpb24gdG9VcHBlcih2YWx1ZSl7cmV0dXJuIHRvU3RyaW5nKHZhbHVlKS50b1VwcGVyQ2FzZSgpfWZ1bmN0aW9uIHRyaW0oc3RyaW5nLGNoYXJzLGd1YXJkKXtzdHJpbmc9dG9TdHJpbmcoc3RyaW5nKTtpZihzdHJpbmcmJihndWFyZHx8Y2hhcnM9PT11bmRlZmluZWQpKXJldHVybiBzdHJpbmcucmVwbGFjZShyZVRyaW0sIiIpO2lmKCFzdHJpbmd8fCEoY2hhcnM9YmFzZVRvU3RyaW5nKGNoYXJzKSkpcmV0dXJuIHN0cmluZzsKdmFyIHN0clN5bWJvbHM9c3RyaW5nVG9BcnJheShzdHJpbmcpLGNoclN5bWJvbHM9c3RyaW5nVG9BcnJheShjaGFycyksc3RhcnQ9Y2hhcnNTdGFydEluZGV4KHN0clN5bWJvbHMsY2hyU3ltYm9scyksZW5kPWNoYXJzRW5kSW5kZXgoc3RyU3ltYm9scyxjaHJTeW1ib2xzKSsxO3JldHVybiBjYXN0U2xpY2Uoc3RyU3ltYm9scyxzdGFydCxlbmQpLmpvaW4oIiIpfWZ1bmN0aW9uIHRyaW1FbmQoc3RyaW5nLGNoYXJzLGd1YXJkKXtzdHJpbmc9dG9TdHJpbmcoc3RyaW5nKTtpZihzdHJpbmcmJihndWFyZHx8Y2hhcnM9PT11bmRlZmluZWQpKXJldHVybiBzdHJpbmcucmVwbGFjZShyZVRyaW1FbmQsIiIpO2lmKCFzdHJpbmd8fCEoY2hhcnM9YmFzZVRvU3RyaW5nKGNoYXJzKSkpcmV0dXJuIHN0cmluZzt2YXIgc3RyU3ltYm9scz1zdHJpbmdUb0FycmF5KHN0cmluZyksZW5kPWNoYXJzRW5kSW5kZXgoc3RyU3ltYm9scyxzdHJpbmdUb0FycmF5KGNoYXJzKSkrMTtyZXR1cm4gY2FzdFNsaWNlKHN0clN5bWJvbHMsCjAsZW5kKS5qb2luKCIiKX1mdW5jdGlvbiB0cmltU3RhcnQoc3RyaW5nLGNoYXJzLGd1YXJkKXtzdHJpbmc9dG9TdHJpbmcoc3RyaW5nKTtpZihzdHJpbmcmJihndWFyZHx8Y2hhcnM9PT11bmRlZmluZWQpKXJldHVybiBzdHJpbmcucmVwbGFjZShyZVRyaW1TdGFydCwiIik7aWYoIXN0cmluZ3x8IShjaGFycz1iYXNlVG9TdHJpbmcoY2hhcnMpKSlyZXR1cm4gc3RyaW5nO3ZhciBzdHJTeW1ib2xzPXN0cmluZ1RvQXJyYXkoc3RyaW5nKSxzdGFydD1jaGFyc1N0YXJ0SW5kZXgoc3RyU3ltYm9scyxzdHJpbmdUb0FycmF5KGNoYXJzKSk7cmV0dXJuIGNhc3RTbGljZShzdHJTeW1ib2xzLHN0YXJ0KS5qb2luKCIiKX1mdW5jdGlvbiB0cnVuY2F0ZShzdHJpbmcsb3B0aW9ucyl7dmFyIGxlbmd0aD1ERUZBVUxUX1RSVU5DX0xFTkdUSCxvbWlzc2lvbj1ERUZBVUxUX1RSVU5DX09NSVNTSU9OO2lmKGlzT2JqZWN0KG9wdGlvbnMpKXt2YXIgc2VwYXJhdG9yPSJzZXBhcmF0b3IiaW4gb3B0aW9ucz8Kb3B0aW9ucy5zZXBhcmF0b3I6c2VwYXJhdG9yO2xlbmd0aD0ibGVuZ3RoImluIG9wdGlvbnM/dG9JbnRlZ2VyKG9wdGlvbnMubGVuZ3RoKTpsZW5ndGg7b21pc3Npb249Im9taXNzaW9uImluIG9wdGlvbnM/YmFzZVRvU3RyaW5nKG9wdGlvbnMub21pc3Npb24pOm9taXNzaW9ufXN0cmluZz10b1N0cmluZyhzdHJpbmcpO3ZhciBzdHJMZW5ndGg9c3RyaW5nLmxlbmd0aDtpZihoYXNVbmljb2RlKHN0cmluZykpe3ZhciBzdHJTeW1ib2xzPXN0cmluZ1RvQXJyYXkoc3RyaW5nKTtzdHJMZW5ndGg9c3RyU3ltYm9scy5sZW5ndGh9aWYobGVuZ3RoPj1zdHJMZW5ndGgpcmV0dXJuIHN0cmluZzt2YXIgZW5kPWxlbmd0aC1zdHJpbmdTaXplKG9taXNzaW9uKTtpZihlbmQ8MSlyZXR1cm4gb21pc3Npb247dmFyIHJlc3VsdD1zdHJTeW1ib2xzP2Nhc3RTbGljZShzdHJTeW1ib2xzLDAsZW5kKS5qb2luKCIiKTpzdHJpbmcuc2xpY2UoMCxlbmQpO2lmKHNlcGFyYXRvcj09PXVuZGVmaW5lZClyZXR1cm4gcmVzdWx0KwpvbWlzc2lvbjtpZihzdHJTeW1ib2xzKWVuZCs9cmVzdWx0Lmxlbmd0aC1lbmQ7aWYoaXNSZWdFeHAoc2VwYXJhdG9yKSl7aWYoc3RyaW5nLnNsaWNlKGVuZCkuc2VhcmNoKHNlcGFyYXRvcikpe3ZhciBtYXRjaCxzdWJzdHJpbmc9cmVzdWx0O2lmKCFzZXBhcmF0b3IuZ2xvYmFsKXNlcGFyYXRvcj1SZWdFeHAoc2VwYXJhdG9yLnNvdXJjZSx0b1N0cmluZyhyZUZsYWdzLmV4ZWMoc2VwYXJhdG9yKSkrImciKTtzZXBhcmF0b3IubGFzdEluZGV4PTA7d2hpbGUobWF0Y2g9c2VwYXJhdG9yLmV4ZWMoc3Vic3RyaW5nKSl2YXIgbmV3RW5kPW1hdGNoLmluZGV4O3Jlc3VsdD1yZXN1bHQuc2xpY2UoMCxuZXdFbmQ9PT11bmRlZmluZWQ/ZW5kOm5ld0VuZCl9fWVsc2UgaWYoc3RyaW5nLmluZGV4T2YoYmFzZVRvU3RyaW5nKHNlcGFyYXRvciksZW5kKSE9ZW5kKXt2YXIgaW5kZXg9cmVzdWx0Lmxhc3RJbmRleE9mKHNlcGFyYXRvcik7aWYoaW5kZXg+LTEpcmVzdWx0PXJlc3VsdC5zbGljZSgwLGluZGV4KX1yZXR1cm4gcmVzdWx0KwpvbWlzc2lvbn1mdW5jdGlvbiB1bmVzY2FwZShzdHJpbmcpe3N0cmluZz10b1N0cmluZyhzdHJpbmcpO3JldHVybiBzdHJpbmcmJnJlSGFzRXNjYXBlZEh0bWwudGVzdChzdHJpbmcpP3N0cmluZy5yZXBsYWNlKHJlRXNjYXBlZEh0bWwsdW5lc2NhcGVIdG1sQ2hhcik6c3RyaW5nfXZhciB1cHBlckNhc2U9Y3JlYXRlQ29tcG91bmRlcihmdW5jdGlvbihyZXN1bHQsd29yZCxpbmRleCl7cmV0dXJuIHJlc3VsdCsoaW5kZXg/IiAiOiIiKSt3b3JkLnRvVXBwZXJDYXNlKCl9KTt2YXIgdXBwZXJGaXJzdD1jcmVhdGVDYXNlRmlyc3QoInRvVXBwZXJDYXNlIik7ZnVuY3Rpb24gd29yZHMoc3RyaW5nLHBhdHRlcm4sZ3VhcmQpe3N0cmluZz10b1N0cmluZyhzdHJpbmcpO3BhdHRlcm49Z3VhcmQ/dW5kZWZpbmVkOnBhdHRlcm47aWYocGF0dGVybj09PXVuZGVmaW5lZClyZXR1cm4gaGFzVW5pY29kZVdvcmQoc3RyaW5nKT91bmljb2RlV29yZHMoc3RyaW5nKTphc2NpaVdvcmRzKHN0cmluZyk7cmV0dXJuIHN0cmluZy5tYXRjaChwYXR0ZXJuKXx8CltdfXZhciBhdHRlbXB0PWJhc2VSZXN0KGZ1bmN0aW9uKGZ1bmMsYXJncyl7dHJ5e3JldHVybiBhcHBseShmdW5jLHVuZGVmaW5lZCxhcmdzKX1jYXRjaChlKXtyZXR1cm4gaXNFcnJvcihlKT9lOm5ldyBFcnJvcihlKX19KTt2YXIgYmluZEFsbD1mbGF0UmVzdChmdW5jdGlvbihvYmplY3QsbWV0aG9kTmFtZXMpe2FycmF5RWFjaChtZXRob2ROYW1lcyxmdW5jdGlvbihrZXkpe2tleT10b0tleShrZXkpO2Jhc2VBc3NpZ25WYWx1ZShvYmplY3Qsa2V5LGJpbmQob2JqZWN0W2tleV0sb2JqZWN0KSl9KTtyZXR1cm4gb2JqZWN0fSk7ZnVuY3Rpb24gY29uZChwYWlycyl7dmFyIGxlbmd0aD1wYWlycz09bnVsbD8wOnBhaXJzLmxlbmd0aCx0b0l0ZXJhdGVlPWdldEl0ZXJhdGVlKCk7cGFpcnM9IWxlbmd0aD9bXTphcnJheU1hcChwYWlycyxmdW5jdGlvbihwYWlyKXtpZih0eXBlb2YgcGFpclsxXSE9ImZ1bmN0aW9uIil0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7cmV0dXJuW3RvSXRlcmF0ZWUocGFpclswXSksCnBhaXJbMV1dfSk7cmV0dXJuIGJhc2VSZXN0KGZ1bmN0aW9uKGFyZ3Mpe3ZhciBpbmRleD0tMTt3aGlsZSgrK2luZGV4PGxlbmd0aCl7dmFyIHBhaXI9cGFpcnNbaW5kZXhdO2lmKGFwcGx5KHBhaXJbMF0sdGhpcyxhcmdzKSlyZXR1cm4gYXBwbHkocGFpclsxXSx0aGlzLGFyZ3MpfX0pfWZ1bmN0aW9uIGNvbmZvcm1zKHNvdXJjZSl7cmV0dXJuIGJhc2VDb25mb3JtcyhiYXNlQ2xvbmUoc291cmNlLENMT05FX0RFRVBfRkxBRykpfWZ1bmN0aW9uIGNvbnN0YW50KHZhbHVlKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdmFsdWV9fWZ1bmN0aW9uIGRlZmF1bHRUbyh2YWx1ZSxkZWZhdWx0VmFsdWUpe3JldHVybiB2YWx1ZT09bnVsbHx8dmFsdWUhPT12YWx1ZT9kZWZhdWx0VmFsdWU6dmFsdWV9dmFyIGZsb3c9Y3JlYXRlRmxvdygpO3ZhciBmbG93UmlnaHQ9Y3JlYXRlRmxvdyh0cnVlKTtmdW5jdGlvbiBpZGVudGl0eSh2YWx1ZSl7cmV0dXJuIHZhbHVlfWZ1bmN0aW9uIGl0ZXJhdGVlKGZ1bmMpe3JldHVybiBiYXNlSXRlcmF0ZWUodHlwZW9mIGZ1bmM9PQoiZnVuY3Rpb24iP2Z1bmM6YmFzZUNsb25lKGZ1bmMsQ0xPTkVfREVFUF9GTEFHKSl9ZnVuY3Rpb24gbWF0Y2hlcyhzb3VyY2Upe3JldHVybiBiYXNlTWF0Y2hlcyhiYXNlQ2xvbmUoc291cmNlLENMT05FX0RFRVBfRkxBRykpfWZ1bmN0aW9uIG1hdGNoZXNQcm9wZXJ0eShwYXRoLHNyY1ZhbHVlKXtyZXR1cm4gYmFzZU1hdGNoZXNQcm9wZXJ0eShwYXRoLGJhc2VDbG9uZShzcmNWYWx1ZSxDTE9ORV9ERUVQX0ZMQUcpKX12YXIgbWV0aG9kPWJhc2VSZXN0KGZ1bmN0aW9uKHBhdGgsYXJncyl7cmV0dXJuIGZ1bmN0aW9uKG9iamVjdCl7cmV0dXJuIGJhc2VJbnZva2Uob2JqZWN0LHBhdGgsYXJncyl9fSk7dmFyIG1ldGhvZE9mPWJhc2VSZXN0KGZ1bmN0aW9uKG9iamVjdCxhcmdzKXtyZXR1cm4gZnVuY3Rpb24ocGF0aCl7cmV0dXJuIGJhc2VJbnZva2Uob2JqZWN0LHBhdGgsYXJncyl9fSk7ZnVuY3Rpb24gbWl4aW4ob2JqZWN0LHNvdXJjZSxvcHRpb25zKXt2YXIgcHJvcHM9a2V5cyhzb3VyY2UpLAptZXRob2ROYW1lcz1iYXNlRnVuY3Rpb25zKHNvdXJjZSxwcm9wcyk7aWYob3B0aW9ucz09bnVsbCYmIShpc09iamVjdChzb3VyY2UpJiYobWV0aG9kTmFtZXMubGVuZ3RofHwhcHJvcHMubGVuZ3RoKSkpe29wdGlvbnM9c291cmNlO3NvdXJjZT1vYmplY3Q7b2JqZWN0PXRoaXM7bWV0aG9kTmFtZXM9YmFzZUZ1bmN0aW9ucyhzb3VyY2Usa2V5cyhzb3VyY2UpKX12YXIgY2hhaW49IShpc09iamVjdChvcHRpb25zKSYmImNoYWluImluIG9wdGlvbnMpfHwhIW9wdGlvbnMuY2hhaW4saXNGdW5jPWlzRnVuY3Rpb24ob2JqZWN0KTthcnJheUVhY2gobWV0aG9kTmFtZXMsZnVuY3Rpb24obWV0aG9kTmFtZSl7dmFyIGZ1bmM9c291cmNlW21ldGhvZE5hbWVdO29iamVjdFttZXRob2ROYW1lXT1mdW5jO2lmKGlzRnVuYylvYmplY3QucHJvdG90eXBlW21ldGhvZE5hbWVdPWZ1bmN0aW9uKCl7dmFyIGNoYWluQWxsPXRoaXMuX19jaGFpbl9fO2lmKGNoYWlufHxjaGFpbkFsbCl7dmFyIHJlc3VsdD0Kb2JqZWN0KHRoaXMuX193cmFwcGVkX18pLGFjdGlvbnM9cmVzdWx0Ll9fYWN0aW9uc19fPWNvcHlBcnJheSh0aGlzLl9fYWN0aW9uc19fKTthY3Rpb25zLnB1c2goeyJmdW5jIjpmdW5jLCJhcmdzIjphcmd1bWVudHMsInRoaXNBcmciOm9iamVjdH0pO3Jlc3VsdC5fX2NoYWluX189Y2hhaW5BbGw7cmV0dXJuIHJlc3VsdH1yZXR1cm4gZnVuYy5hcHBseShvYmplY3QsYXJyYXlQdXNoKFt0aGlzLnZhbHVlKCldLGFyZ3VtZW50cykpfX0pO3JldHVybiBvYmplY3R9ZnVuY3Rpb24gbm9Db25mbGljdCgpe2lmKHJvb3QuXz09PXRoaXMpcm9vdC5fPW9sZERhc2g7cmV0dXJuIHRoaXN9ZnVuY3Rpb24gbm9vcCgpe31mdW5jdGlvbiBudGhBcmcobil7bj10b0ludGVnZXIobik7cmV0dXJuIGJhc2VSZXN0KGZ1bmN0aW9uKGFyZ3Mpe3JldHVybiBiYXNlTnRoKGFyZ3Msbil9KX12YXIgb3Zlcj1jcmVhdGVPdmVyKGFycmF5TWFwKTt2YXIgb3ZlckV2ZXJ5PWNyZWF0ZU92ZXIoYXJyYXlFdmVyeSk7CnZhciBvdmVyU29tZT1jcmVhdGVPdmVyKGFycmF5U29tZSk7ZnVuY3Rpb24gcHJvcGVydHkocGF0aCl7cmV0dXJuIGlzS2V5KHBhdGgpP2Jhc2VQcm9wZXJ0eSh0b0tleShwYXRoKSk6YmFzZVByb3BlcnR5RGVlcChwYXRoKX1mdW5jdGlvbiBwcm9wZXJ0eU9mKG9iamVjdCl7cmV0dXJuIGZ1bmN0aW9uKHBhdGgpe3JldHVybiBvYmplY3Q9PW51bGw/dW5kZWZpbmVkOmJhc2VHZXQob2JqZWN0LHBhdGgpfX12YXIgcmFuZ2U9Y3JlYXRlUmFuZ2UoKTt2YXIgcmFuZ2VSaWdodD1jcmVhdGVSYW5nZSh0cnVlKTtmdW5jdGlvbiBzdHViQXJyYXkoKXtyZXR1cm5bXX1mdW5jdGlvbiBzdHViRmFsc2UoKXtyZXR1cm4gZmFsc2V9ZnVuY3Rpb24gc3R1Yk9iamVjdCgpe3JldHVybnt9fWZ1bmN0aW9uIHN0dWJTdHJpbmcoKXtyZXR1cm4iIn1mdW5jdGlvbiBzdHViVHJ1ZSgpe3JldHVybiB0cnVlfWZ1bmN0aW9uIHRpbWVzKG4saXRlcmF0ZWUpe249dG9JbnRlZ2VyKG4pO2lmKG48MXx8bj5NQVhfU0FGRV9JTlRFR0VSKXJldHVybltdOwp2YXIgaW5kZXg9TUFYX0FSUkFZX0xFTkdUSCxsZW5ndGg9bmF0aXZlTWluKG4sTUFYX0FSUkFZX0xFTkdUSCk7aXRlcmF0ZWU9Z2V0SXRlcmF0ZWUoaXRlcmF0ZWUpO24tPU1BWF9BUlJBWV9MRU5HVEg7dmFyIHJlc3VsdD1iYXNlVGltZXMobGVuZ3RoLGl0ZXJhdGVlKTt3aGlsZSgrK2luZGV4PG4paXRlcmF0ZWUoaW5kZXgpO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gdG9QYXRoKHZhbHVlKXtpZihpc0FycmF5KHZhbHVlKSlyZXR1cm4gYXJyYXlNYXAodmFsdWUsdG9LZXkpO3JldHVybiBpc1N5bWJvbCh2YWx1ZSk/W3ZhbHVlXTpjb3B5QXJyYXkoc3RyaW5nVG9QYXRoKHRvU3RyaW5nKHZhbHVlKSkpfWZ1bmN0aW9uIHVuaXF1ZUlkKHByZWZpeCl7dmFyIGlkPSsraWRDb3VudGVyO3JldHVybiB0b1N0cmluZyhwcmVmaXgpK2lkfXZhciBhZGQ9Y3JlYXRlTWF0aE9wZXJhdGlvbihmdW5jdGlvbihhdWdlbmQsYWRkZW5kKXtyZXR1cm4gYXVnZW5kK2FkZGVuZH0sMCk7dmFyIGNlaWw9Y3JlYXRlUm91bmQoImNlaWwiKTsKdmFyIGRpdmlkZT1jcmVhdGVNYXRoT3BlcmF0aW9uKGZ1bmN0aW9uKGRpdmlkZW5kLGRpdmlzb3Ipe3JldHVybiBkaXZpZGVuZC9kaXZpc29yfSwxKTt2YXIgZmxvb3I9Y3JlYXRlUm91bmQoImZsb29yIik7ZnVuY3Rpb24gbWF4KGFycmF5KXtyZXR1cm4gYXJyYXkmJmFycmF5Lmxlbmd0aD9iYXNlRXh0cmVtdW0oYXJyYXksaWRlbnRpdHksYmFzZUd0KTp1bmRlZmluZWR9ZnVuY3Rpb24gbWF4QnkoYXJyYXksaXRlcmF0ZWUpe3JldHVybiBhcnJheSYmYXJyYXkubGVuZ3RoP2Jhc2VFeHRyZW11bShhcnJheSxnZXRJdGVyYXRlZShpdGVyYXRlZSwyKSxiYXNlR3QpOnVuZGVmaW5lZH1mdW5jdGlvbiBtZWFuKGFycmF5KXtyZXR1cm4gYmFzZU1lYW4oYXJyYXksaWRlbnRpdHkpfWZ1bmN0aW9uIG1lYW5CeShhcnJheSxpdGVyYXRlZSl7cmV0dXJuIGJhc2VNZWFuKGFycmF5LGdldEl0ZXJhdGVlKGl0ZXJhdGVlLDIpKX1mdW5jdGlvbiBtaW4oYXJyYXkpe3JldHVybiBhcnJheSYmYXJyYXkubGVuZ3RoPwpiYXNlRXh0cmVtdW0oYXJyYXksaWRlbnRpdHksYmFzZUx0KTp1bmRlZmluZWR9ZnVuY3Rpb24gbWluQnkoYXJyYXksaXRlcmF0ZWUpe3JldHVybiBhcnJheSYmYXJyYXkubGVuZ3RoP2Jhc2VFeHRyZW11bShhcnJheSxnZXRJdGVyYXRlZShpdGVyYXRlZSwyKSxiYXNlTHQpOnVuZGVmaW5lZH12YXIgbXVsdGlwbHk9Y3JlYXRlTWF0aE9wZXJhdGlvbihmdW5jdGlvbihtdWx0aXBsaWVyLG11bHRpcGxpY2FuZCl7cmV0dXJuIG11bHRpcGxpZXIqbXVsdGlwbGljYW5kfSwxKTt2YXIgcm91bmQ9Y3JlYXRlUm91bmQoInJvdW5kIik7dmFyIHN1YnRyYWN0PWNyZWF0ZU1hdGhPcGVyYXRpb24oZnVuY3Rpb24obWludWVuZCxzdWJ0cmFoZW5kKXtyZXR1cm4gbWludWVuZC1zdWJ0cmFoZW5kfSwwKTtmdW5jdGlvbiBzdW0oYXJyYXkpe3JldHVybiBhcnJheSYmYXJyYXkubGVuZ3RoP2Jhc2VTdW0oYXJyYXksaWRlbnRpdHkpOjB9ZnVuY3Rpb24gc3VtQnkoYXJyYXksaXRlcmF0ZWUpe3JldHVybiBhcnJheSYmCmFycmF5Lmxlbmd0aD9iYXNlU3VtKGFycmF5LGdldEl0ZXJhdGVlKGl0ZXJhdGVlLDIpKTowfWxvZGFzaC5hZnRlcj1hZnRlcjtsb2Rhc2guYXJ5PWFyeTtsb2Rhc2guYXNzaWduPWFzc2lnbjtsb2Rhc2guYXNzaWduSW49YXNzaWduSW47bG9kYXNoLmFzc2lnbkluV2l0aD1hc3NpZ25JbldpdGg7bG9kYXNoLmFzc2lnbldpdGg9YXNzaWduV2l0aDtsb2Rhc2guYXQ9YXQ7bG9kYXNoLmJlZm9yZT1iZWZvcmU7bG9kYXNoLmJpbmQ9YmluZDtsb2Rhc2guYmluZEFsbD1iaW5kQWxsO2xvZGFzaC5iaW5kS2V5PWJpbmRLZXk7bG9kYXNoLmNhc3RBcnJheT1jYXN0QXJyYXk7bG9kYXNoLmNoYWluPWNoYWluO2xvZGFzaC5jaHVuaz1jaHVuaztsb2Rhc2guY29tcGFjdD1jb21wYWN0O2xvZGFzaC5jb25jYXQ9Y29uY2F0O2xvZGFzaC5jb25kPWNvbmQ7bG9kYXNoLmNvbmZvcm1zPWNvbmZvcm1zO2xvZGFzaC5jb25zdGFudD1jb25zdGFudDtsb2Rhc2guY291bnRCeT1jb3VudEJ5O2xvZGFzaC5jcmVhdGU9CmNyZWF0ZTtsb2Rhc2guY3Vycnk9Y3Vycnk7bG9kYXNoLmN1cnJ5UmlnaHQ9Y3VycnlSaWdodDtsb2Rhc2guZGVib3VuY2U9ZGVib3VuY2U7bG9kYXNoLmRlZmF1bHRzPWRlZmF1bHRzO2xvZGFzaC5kZWZhdWx0c0RlZXA9ZGVmYXVsdHNEZWVwO2xvZGFzaC5kZWZlcj1kZWZlcjtsb2Rhc2guZGVsYXk9ZGVsYXk7bG9kYXNoLmRpZmZlcmVuY2U9ZGlmZmVyZW5jZTtsb2Rhc2guZGlmZmVyZW5jZUJ5PWRpZmZlcmVuY2VCeTtsb2Rhc2guZGlmZmVyZW5jZVdpdGg9ZGlmZmVyZW5jZVdpdGg7bG9kYXNoLmRyb3A9ZHJvcDtsb2Rhc2guZHJvcFJpZ2h0PWRyb3BSaWdodDtsb2Rhc2guZHJvcFJpZ2h0V2hpbGU9ZHJvcFJpZ2h0V2hpbGU7bG9kYXNoLmRyb3BXaGlsZT1kcm9wV2hpbGU7bG9kYXNoLmZpbGw9ZmlsbDtsb2Rhc2guZmlsdGVyPWZpbHRlcjtsb2Rhc2guZmxhdE1hcD1mbGF0TWFwO2xvZGFzaC5mbGF0TWFwRGVlcD1mbGF0TWFwRGVlcDtsb2Rhc2guZmxhdE1hcERlcHRoPWZsYXRNYXBEZXB0aDsKbG9kYXNoLmZsYXR0ZW49ZmxhdHRlbjtsb2Rhc2guZmxhdHRlbkRlZXA9ZmxhdHRlbkRlZXA7bG9kYXNoLmZsYXR0ZW5EZXB0aD1mbGF0dGVuRGVwdGg7bG9kYXNoLmZsaXA9ZmxpcDtsb2Rhc2guZmxvdz1mbG93O2xvZGFzaC5mbG93UmlnaHQ9Zmxvd1JpZ2h0O2xvZGFzaC5mcm9tUGFpcnM9ZnJvbVBhaXJzO2xvZGFzaC5mdW5jdGlvbnM9ZnVuY3Rpb25zO2xvZGFzaC5mdW5jdGlvbnNJbj1mdW5jdGlvbnNJbjtsb2Rhc2guZ3JvdXBCeT1ncm91cEJ5O2xvZGFzaC5pbml0aWFsPWluaXRpYWw7bG9kYXNoLmludGVyc2VjdGlvbj1pbnRlcnNlY3Rpb247bG9kYXNoLmludGVyc2VjdGlvbkJ5PWludGVyc2VjdGlvbkJ5O2xvZGFzaC5pbnRlcnNlY3Rpb25XaXRoPWludGVyc2VjdGlvbldpdGg7bG9kYXNoLmludmVydD1pbnZlcnQ7bG9kYXNoLmludmVydEJ5PWludmVydEJ5O2xvZGFzaC5pbnZva2VNYXA9aW52b2tlTWFwO2xvZGFzaC5pdGVyYXRlZT1pdGVyYXRlZTtsb2Rhc2gua2V5Qnk9CmtleUJ5O2xvZGFzaC5rZXlzPWtleXM7bG9kYXNoLmtleXNJbj1rZXlzSW47bG9kYXNoLm1hcD1tYXA7bG9kYXNoLm1hcEtleXM9bWFwS2V5cztsb2Rhc2gubWFwVmFsdWVzPW1hcFZhbHVlcztsb2Rhc2gubWF0Y2hlcz1tYXRjaGVzO2xvZGFzaC5tYXRjaGVzUHJvcGVydHk9bWF0Y2hlc1Byb3BlcnR5O2xvZGFzaC5tZW1vaXplPW1lbW9pemU7bG9kYXNoLm1lcmdlPW1lcmdlO2xvZGFzaC5tZXJnZVdpdGg9bWVyZ2VXaXRoO2xvZGFzaC5tZXRob2Q9bWV0aG9kO2xvZGFzaC5tZXRob2RPZj1tZXRob2RPZjtsb2Rhc2gubWl4aW49bWl4aW47bG9kYXNoLm5lZ2F0ZT1uZWdhdGU7bG9kYXNoLm50aEFyZz1udGhBcmc7bG9kYXNoLm9taXQ9b21pdDtsb2Rhc2gub21pdEJ5PW9taXRCeTtsb2Rhc2gub25jZT1vbmNlO2xvZGFzaC5vcmRlckJ5PW9yZGVyQnk7bG9kYXNoLm92ZXI9b3Zlcjtsb2Rhc2gub3ZlckFyZ3M9b3ZlckFyZ3M7bG9kYXNoLm92ZXJFdmVyeT1vdmVyRXZlcnk7bG9kYXNoLm92ZXJTb21lPQpvdmVyU29tZTtsb2Rhc2gucGFydGlhbD1wYXJ0aWFsO2xvZGFzaC5wYXJ0aWFsUmlnaHQ9cGFydGlhbFJpZ2h0O2xvZGFzaC5wYXJ0aXRpb249cGFydGl0aW9uO2xvZGFzaC5waWNrPXBpY2s7bG9kYXNoLnBpY2tCeT1waWNrQnk7bG9kYXNoLnByb3BlcnR5PXByb3BlcnR5O2xvZGFzaC5wcm9wZXJ0eU9mPXByb3BlcnR5T2Y7bG9kYXNoLnB1bGw9cHVsbDtsb2Rhc2gucHVsbEFsbD1wdWxsQWxsO2xvZGFzaC5wdWxsQWxsQnk9cHVsbEFsbEJ5O2xvZGFzaC5wdWxsQWxsV2l0aD1wdWxsQWxsV2l0aDtsb2Rhc2gucHVsbEF0PXB1bGxBdDtsb2Rhc2gucmFuZ2U9cmFuZ2U7bG9kYXNoLnJhbmdlUmlnaHQ9cmFuZ2VSaWdodDtsb2Rhc2gucmVhcmc9cmVhcmc7bG9kYXNoLnJlamVjdD1yZWplY3Q7bG9kYXNoLnJlbW92ZT1yZW1vdmU7bG9kYXNoLnJlc3Q9cmVzdDtsb2Rhc2gucmV2ZXJzZT1yZXZlcnNlO2xvZGFzaC5zYW1wbGVTaXplPXNhbXBsZVNpemU7bG9kYXNoLnNldD1zZXQ7bG9kYXNoLnNldFdpdGg9CnNldFdpdGg7bG9kYXNoLnNodWZmbGU9c2h1ZmZsZTtsb2Rhc2guc2xpY2U9c2xpY2U7bG9kYXNoLnNvcnRCeT1zb3J0Qnk7bG9kYXNoLnNvcnRlZFVuaXE9c29ydGVkVW5pcTtsb2Rhc2guc29ydGVkVW5pcUJ5PXNvcnRlZFVuaXFCeTtsb2Rhc2guc3BsaXQ9c3BsaXQ7bG9kYXNoLnNwcmVhZD1zcHJlYWQ7bG9kYXNoLnRhaWw9dGFpbDtsb2Rhc2gudGFrZT10YWtlO2xvZGFzaC50YWtlUmlnaHQ9dGFrZVJpZ2h0O2xvZGFzaC50YWtlUmlnaHRXaGlsZT10YWtlUmlnaHRXaGlsZTtsb2Rhc2gudGFrZVdoaWxlPXRha2VXaGlsZTtsb2Rhc2gudGFwPXRhcDtsb2Rhc2gudGhyb3R0bGU9dGhyb3R0bGU7bG9kYXNoLnRocnU9dGhydTtsb2Rhc2gudG9BcnJheT10b0FycmF5O2xvZGFzaC50b1BhaXJzPXRvUGFpcnM7bG9kYXNoLnRvUGFpcnNJbj10b1BhaXJzSW47bG9kYXNoLnRvUGF0aD10b1BhdGg7bG9kYXNoLnRvUGxhaW5PYmplY3Q9dG9QbGFpbk9iamVjdDtsb2Rhc2gudHJhbnNmb3JtPQp0cmFuc2Zvcm07bG9kYXNoLnVuYXJ5PXVuYXJ5O2xvZGFzaC51bmlvbj11bmlvbjtsb2Rhc2gudW5pb25CeT11bmlvbkJ5O2xvZGFzaC51bmlvbldpdGg9dW5pb25XaXRoO2xvZGFzaC51bmlxPXVuaXE7bG9kYXNoLnVuaXFCeT11bmlxQnk7bG9kYXNoLnVuaXFXaXRoPXVuaXFXaXRoO2xvZGFzaC51bnNldD11bnNldDtsb2Rhc2gudW56aXA9dW56aXA7bG9kYXNoLnVuemlwV2l0aD11bnppcFdpdGg7bG9kYXNoLnVwZGF0ZT11cGRhdGU7bG9kYXNoLnVwZGF0ZVdpdGg9dXBkYXRlV2l0aDtsb2Rhc2gudmFsdWVzPXZhbHVlcztsb2Rhc2gudmFsdWVzSW49dmFsdWVzSW47bG9kYXNoLndpdGhvdXQ9d2l0aG91dDtsb2Rhc2gud29yZHM9d29yZHM7bG9kYXNoLndyYXA9d3JhcDtsb2Rhc2gueG9yPXhvcjtsb2Rhc2gueG9yQnk9eG9yQnk7bG9kYXNoLnhvcldpdGg9eG9yV2l0aDtsb2Rhc2guemlwPXppcDtsb2Rhc2guemlwT2JqZWN0PXppcE9iamVjdDtsb2Rhc2guemlwT2JqZWN0RGVlcD0KemlwT2JqZWN0RGVlcDtsb2Rhc2guemlwV2l0aD16aXBXaXRoO2xvZGFzaC5lbnRyaWVzPXRvUGFpcnM7bG9kYXNoLmVudHJpZXNJbj10b1BhaXJzSW47bG9kYXNoLmV4dGVuZD1hc3NpZ25Jbjtsb2Rhc2guZXh0ZW5kV2l0aD1hc3NpZ25JbldpdGg7bWl4aW4obG9kYXNoLGxvZGFzaCk7bG9kYXNoLmFkZD1hZGQ7bG9kYXNoLmF0dGVtcHQ9YXR0ZW1wdDtsb2Rhc2guY2FtZWxDYXNlPWNhbWVsQ2FzZTtsb2Rhc2guY2FwaXRhbGl6ZT1jYXBpdGFsaXplO2xvZGFzaC5jZWlsPWNlaWw7bG9kYXNoLmNsYW1wPWNsYW1wO2xvZGFzaC5jbG9uZT1jbG9uZTtsb2Rhc2guY2xvbmVEZWVwPWNsb25lRGVlcDtsb2Rhc2guY2xvbmVEZWVwV2l0aD1jbG9uZURlZXBXaXRoO2xvZGFzaC5jbG9uZVdpdGg9Y2xvbmVXaXRoO2xvZGFzaC5jb25mb3Jtc1RvPWNvbmZvcm1zVG87bG9kYXNoLmRlYnVycj1kZWJ1cnI7bG9kYXNoLmRlZmF1bHRUbz1kZWZhdWx0VG87bG9kYXNoLmRpdmlkZT1kaXZpZGU7bG9kYXNoLmVuZHNXaXRoPQplbmRzV2l0aDtsb2Rhc2guZXE9ZXE7bG9kYXNoLmVzY2FwZT1lc2NhcGU7bG9kYXNoLmVzY2FwZVJlZ0V4cD1lc2NhcGVSZWdFeHA7bG9kYXNoLmV2ZXJ5PWV2ZXJ5O2xvZGFzaC5maW5kPWZpbmQ7bG9kYXNoLmZpbmRJbmRleD1maW5kSW5kZXg7bG9kYXNoLmZpbmRLZXk9ZmluZEtleTtsb2Rhc2guZmluZExhc3Q9ZmluZExhc3Q7bG9kYXNoLmZpbmRMYXN0SW5kZXg9ZmluZExhc3RJbmRleDtsb2Rhc2guZmluZExhc3RLZXk9ZmluZExhc3RLZXk7bG9kYXNoLmZsb29yPWZsb29yO2xvZGFzaC5mb3JFYWNoPWZvckVhY2g7bG9kYXNoLmZvckVhY2hSaWdodD1mb3JFYWNoUmlnaHQ7bG9kYXNoLmZvckluPWZvckluO2xvZGFzaC5mb3JJblJpZ2h0PWZvckluUmlnaHQ7bG9kYXNoLmZvck93bj1mb3JPd247bG9kYXNoLmZvck93blJpZ2h0PWZvck93blJpZ2h0O2xvZGFzaC5nZXQ9Z2V0O2xvZGFzaC5ndD1ndDtsb2Rhc2guZ3RlPWd0ZTtsb2Rhc2guaGFzPWhhcztsb2Rhc2guaGFzSW49aGFzSW47CmxvZGFzaC5oZWFkPWhlYWQ7bG9kYXNoLmlkZW50aXR5PWlkZW50aXR5O2xvZGFzaC5pbmNsdWRlcz1pbmNsdWRlcztsb2Rhc2guaW5kZXhPZj1pbmRleE9mO2xvZGFzaC5pblJhbmdlPWluUmFuZ2U7bG9kYXNoLmludm9rZT1pbnZva2U7bG9kYXNoLmlzQXJndW1lbnRzPWlzQXJndW1lbnRzO2xvZGFzaC5pc0FycmF5PWlzQXJyYXk7bG9kYXNoLmlzQXJyYXlCdWZmZXI9aXNBcnJheUJ1ZmZlcjtsb2Rhc2guaXNBcnJheUxpa2U9aXNBcnJheUxpa2U7bG9kYXNoLmlzQXJyYXlMaWtlT2JqZWN0PWlzQXJyYXlMaWtlT2JqZWN0O2xvZGFzaC5pc0Jvb2xlYW49aXNCb29sZWFuO2xvZGFzaC5pc0J1ZmZlcj1pc0J1ZmZlcjtsb2Rhc2guaXNEYXRlPWlzRGF0ZTtsb2Rhc2guaXNFbGVtZW50PWlzRWxlbWVudDtsb2Rhc2guaXNFbXB0eT1pc0VtcHR5O2xvZGFzaC5pc0VxdWFsPWlzRXF1YWw7bG9kYXNoLmlzRXF1YWxXaXRoPWlzRXF1YWxXaXRoO2xvZGFzaC5pc0Vycm9yPWlzRXJyb3I7bG9kYXNoLmlzRmluaXRlPQppc0Zpbml0ZTtsb2Rhc2guaXNGdW5jdGlvbj1pc0Z1bmN0aW9uO2xvZGFzaC5pc0ludGVnZXI9aXNJbnRlZ2VyO2xvZGFzaC5pc0xlbmd0aD1pc0xlbmd0aDtsb2Rhc2guaXNNYXA9aXNNYXA7bG9kYXNoLmlzTWF0Y2g9aXNNYXRjaDtsb2Rhc2guaXNNYXRjaFdpdGg9aXNNYXRjaFdpdGg7bG9kYXNoLmlzTmFOPWlzTmFOO2xvZGFzaC5pc05hdGl2ZT1pc05hdGl2ZTtsb2Rhc2guaXNOaWw9aXNOaWw7bG9kYXNoLmlzTnVsbD1pc051bGw7bG9kYXNoLmlzTnVtYmVyPWlzTnVtYmVyO2xvZGFzaC5pc09iamVjdD1pc09iamVjdDtsb2Rhc2guaXNPYmplY3RMaWtlPWlzT2JqZWN0TGlrZTtsb2Rhc2guaXNQbGFpbk9iamVjdD1pc1BsYWluT2JqZWN0O2xvZGFzaC5pc1JlZ0V4cD1pc1JlZ0V4cDtsb2Rhc2guaXNTYWZlSW50ZWdlcj1pc1NhZmVJbnRlZ2VyO2xvZGFzaC5pc1NldD1pc1NldDtsb2Rhc2guaXNTdHJpbmc9aXNTdHJpbmc7bG9kYXNoLmlzU3ltYm9sPWlzU3ltYm9sO2xvZGFzaC5pc1R5cGVkQXJyYXk9CmlzVHlwZWRBcnJheTtsb2Rhc2guaXNVbmRlZmluZWQ9aXNVbmRlZmluZWQ7bG9kYXNoLmlzV2Vha01hcD1pc1dlYWtNYXA7bG9kYXNoLmlzV2Vha1NldD1pc1dlYWtTZXQ7bG9kYXNoLmpvaW49am9pbjtsb2Rhc2gua2ViYWJDYXNlPWtlYmFiQ2FzZTtsb2Rhc2gubGFzdD1sYXN0O2xvZGFzaC5sYXN0SW5kZXhPZj1sYXN0SW5kZXhPZjtsb2Rhc2gubG93ZXJDYXNlPWxvd2VyQ2FzZTtsb2Rhc2gubG93ZXJGaXJzdD1sb3dlckZpcnN0O2xvZGFzaC5sdD1sdDtsb2Rhc2gubHRlPWx0ZTtsb2Rhc2gubWF4PW1heDtsb2Rhc2gubWF4Qnk9bWF4Qnk7bG9kYXNoLm1lYW49bWVhbjtsb2Rhc2gubWVhbkJ5PW1lYW5CeTtsb2Rhc2gubWluPW1pbjtsb2Rhc2gubWluQnk9bWluQnk7bG9kYXNoLnN0dWJBcnJheT1zdHViQXJyYXk7bG9kYXNoLnN0dWJGYWxzZT1zdHViRmFsc2U7bG9kYXNoLnN0dWJPYmplY3Q9c3R1Yk9iamVjdDtsb2Rhc2guc3R1YlN0cmluZz1zdHViU3RyaW5nO2xvZGFzaC5zdHViVHJ1ZT0Kc3R1YlRydWU7bG9kYXNoLm11bHRpcGx5PW11bHRpcGx5O2xvZGFzaC5udGg9bnRoO2xvZGFzaC5ub0NvbmZsaWN0PW5vQ29uZmxpY3Q7bG9kYXNoLm5vb3A9bm9vcDtsb2Rhc2gubm93PW5vdztsb2Rhc2gucGFkPXBhZDtsb2Rhc2gucGFkRW5kPXBhZEVuZDtsb2Rhc2gucGFkU3RhcnQ9cGFkU3RhcnQ7bG9kYXNoLnBhcnNlSW50PXBhcnNlSW50O2xvZGFzaC5yYW5kb209cmFuZG9tO2xvZGFzaC5yZWR1Y2U9cmVkdWNlO2xvZGFzaC5yZWR1Y2VSaWdodD1yZWR1Y2VSaWdodDtsb2Rhc2gucmVwZWF0PXJlcGVhdDtsb2Rhc2gucmVwbGFjZT1yZXBsYWNlO2xvZGFzaC5yZXN1bHQ9cmVzdWx0O2xvZGFzaC5yb3VuZD1yb3VuZDtsb2Rhc2gucnVuSW5Db250ZXh0PXJ1bkluQ29udGV4dDtsb2Rhc2guc2FtcGxlPXNhbXBsZTtsb2Rhc2guc2l6ZT1zaXplO2xvZGFzaC5zbmFrZUNhc2U9c25ha2VDYXNlO2xvZGFzaC5zb21lPXNvbWU7bG9kYXNoLnNvcnRlZEluZGV4PXNvcnRlZEluZGV4O2xvZGFzaC5zb3J0ZWRJbmRleEJ5PQpzb3J0ZWRJbmRleEJ5O2xvZGFzaC5zb3J0ZWRJbmRleE9mPXNvcnRlZEluZGV4T2Y7bG9kYXNoLnNvcnRlZExhc3RJbmRleD1zb3J0ZWRMYXN0SW5kZXg7bG9kYXNoLnNvcnRlZExhc3RJbmRleEJ5PXNvcnRlZExhc3RJbmRleEJ5O2xvZGFzaC5zb3J0ZWRMYXN0SW5kZXhPZj1zb3J0ZWRMYXN0SW5kZXhPZjtsb2Rhc2guc3RhcnRDYXNlPXN0YXJ0Q2FzZTtsb2Rhc2guc3RhcnRzV2l0aD1zdGFydHNXaXRoO2xvZGFzaC5zdWJ0cmFjdD1zdWJ0cmFjdDtsb2Rhc2guc3VtPXN1bTtsb2Rhc2guc3VtQnk9c3VtQnk7bG9kYXNoLnRlbXBsYXRlPXRlbXBsYXRlO2xvZGFzaC50aW1lcz10aW1lcztsb2Rhc2gudG9GaW5pdGU9dG9GaW5pdGU7bG9kYXNoLnRvSW50ZWdlcj10b0ludGVnZXI7bG9kYXNoLnRvTGVuZ3RoPXRvTGVuZ3RoO2xvZGFzaC50b0xvd2VyPXRvTG93ZXI7bG9kYXNoLnRvTnVtYmVyPXRvTnVtYmVyO2xvZGFzaC50b1NhZmVJbnRlZ2VyPXRvU2FmZUludGVnZXI7bG9kYXNoLnRvU3RyaW5nPQp0b1N0cmluZztsb2Rhc2gudG9VcHBlcj10b1VwcGVyO2xvZGFzaC50cmltPXRyaW07bG9kYXNoLnRyaW1FbmQ9dHJpbUVuZDtsb2Rhc2gudHJpbVN0YXJ0PXRyaW1TdGFydDtsb2Rhc2gudHJ1bmNhdGU9dHJ1bmNhdGU7bG9kYXNoLnVuZXNjYXBlPXVuZXNjYXBlO2xvZGFzaC51bmlxdWVJZD11bmlxdWVJZDtsb2Rhc2gudXBwZXJDYXNlPXVwcGVyQ2FzZTtsb2Rhc2gudXBwZXJGaXJzdD11cHBlckZpcnN0O2xvZGFzaC5lYWNoPWZvckVhY2g7bG9kYXNoLmVhY2hSaWdodD1mb3JFYWNoUmlnaHQ7bG9kYXNoLmZpcnN0PWhlYWQ7bWl4aW4obG9kYXNoLGZ1bmN0aW9uKCl7dmFyIHNvdXJjZT17fTtiYXNlRm9yT3duKGxvZGFzaCxmdW5jdGlvbihmdW5jLG1ldGhvZE5hbWUpe2lmKCFoYXNPd25Qcm9wZXJ0eS5jYWxsKGxvZGFzaC5wcm90b3R5cGUsbWV0aG9kTmFtZSkpc291cmNlW21ldGhvZE5hbWVdPWZ1bmN9KTtyZXR1cm4gc291cmNlfSgpLHsiY2hhaW4iOmZhbHNlfSk7bG9kYXNoLlZFUlNJT049ClZFUlNJT047YXJyYXlFYWNoKFsiYmluZCIsImJpbmRLZXkiLCJjdXJyeSIsImN1cnJ5UmlnaHQiLCJwYXJ0aWFsIiwicGFydGlhbFJpZ2h0Il0sZnVuY3Rpb24obWV0aG9kTmFtZSl7bG9kYXNoW21ldGhvZE5hbWVdLnBsYWNlaG9sZGVyPWxvZGFzaH0pO2FycmF5RWFjaChbImRyb3AiLCJ0YWtlIl0sZnVuY3Rpb24obWV0aG9kTmFtZSxpbmRleCl7TGF6eVdyYXBwZXIucHJvdG90eXBlW21ldGhvZE5hbWVdPWZ1bmN0aW9uKG4pe249bj09PXVuZGVmaW5lZD8xOm5hdGl2ZU1heCh0b0ludGVnZXIobiksMCk7dmFyIHJlc3VsdD10aGlzLl9fZmlsdGVyZWRfXyYmIWluZGV4P25ldyBMYXp5V3JhcHBlcih0aGlzKTp0aGlzLmNsb25lKCk7aWYocmVzdWx0Ll9fZmlsdGVyZWRfXylyZXN1bHQuX190YWtlQ291bnRfXz1uYXRpdmVNaW4obixyZXN1bHQuX190YWtlQ291bnRfXyk7ZWxzZSByZXN1bHQuX192aWV3c19fLnB1c2goeyJzaXplIjpuYXRpdmVNaW4obixNQVhfQVJSQVlfTEVOR1RIKSwKInR5cGUiOm1ldGhvZE5hbWUrKHJlc3VsdC5fX2Rpcl9fPDA/IlJpZ2h0IjoiIil9KTtyZXR1cm4gcmVzdWx0fTtMYXp5V3JhcHBlci5wcm90b3R5cGVbbWV0aG9kTmFtZSsiUmlnaHQiXT1mdW5jdGlvbihuKXtyZXR1cm4gdGhpcy5yZXZlcnNlKClbbWV0aG9kTmFtZV0obikucmV2ZXJzZSgpfX0pO2FycmF5RWFjaChbImZpbHRlciIsIm1hcCIsInRha2VXaGlsZSJdLGZ1bmN0aW9uKG1ldGhvZE5hbWUsaW5kZXgpe3ZhciB0eXBlPWluZGV4KzEsaXNGaWx0ZXI9dHlwZT09TEFaWV9GSUxURVJfRkxBR3x8dHlwZT09TEFaWV9XSElMRV9GTEFHO0xhenlXcmFwcGVyLnByb3RvdHlwZVttZXRob2ROYW1lXT1mdW5jdGlvbihpdGVyYXRlZSl7dmFyIHJlc3VsdD10aGlzLmNsb25lKCk7cmVzdWx0Ll9faXRlcmF0ZWVzX18ucHVzaCh7Iml0ZXJhdGVlIjpnZXRJdGVyYXRlZShpdGVyYXRlZSwzKSwidHlwZSI6dHlwZX0pO3Jlc3VsdC5fX2ZpbHRlcmVkX189cmVzdWx0Ll9fZmlsdGVyZWRfX3x8CmlzRmlsdGVyO3JldHVybiByZXN1bHR9fSk7YXJyYXlFYWNoKFsiaGVhZCIsImxhc3QiXSxmdW5jdGlvbihtZXRob2ROYW1lLGluZGV4KXt2YXIgdGFrZU5hbWU9InRha2UiKyhpbmRleD8iUmlnaHQiOiIiKTtMYXp5V3JhcHBlci5wcm90b3R5cGVbbWV0aG9kTmFtZV09ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc1t0YWtlTmFtZV0oMSkudmFsdWUoKVswXX19KTthcnJheUVhY2goWyJpbml0aWFsIiwidGFpbCJdLGZ1bmN0aW9uKG1ldGhvZE5hbWUsaW5kZXgpe3ZhciBkcm9wTmFtZT0iZHJvcCIrKGluZGV4PyIiOiJSaWdodCIpO0xhenlXcmFwcGVyLnByb3RvdHlwZVttZXRob2ROYW1lXT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9fZmlsdGVyZWRfXz9uZXcgTGF6eVdyYXBwZXIodGhpcyk6dGhpc1tkcm9wTmFtZV0oMSl9fSk7TGF6eVdyYXBwZXIucHJvdG90eXBlLmNvbXBhY3Q9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5maWx0ZXIoaWRlbnRpdHkpfTtMYXp5V3JhcHBlci5wcm90b3R5cGUuZmluZD0KZnVuY3Rpb24ocHJlZGljYXRlKXtyZXR1cm4gdGhpcy5maWx0ZXIocHJlZGljYXRlKS5oZWFkKCl9O0xhenlXcmFwcGVyLnByb3RvdHlwZS5maW5kTGFzdD1mdW5jdGlvbihwcmVkaWNhdGUpe3JldHVybiB0aGlzLnJldmVyc2UoKS5maW5kKHByZWRpY2F0ZSl9O0xhenlXcmFwcGVyLnByb3RvdHlwZS5pbnZva2VNYXA9YmFzZVJlc3QoZnVuY3Rpb24ocGF0aCxhcmdzKXtpZih0eXBlb2YgcGF0aD09ImZ1bmN0aW9uIilyZXR1cm4gbmV3IExhenlXcmFwcGVyKHRoaXMpO3JldHVybiB0aGlzLm1hcChmdW5jdGlvbih2YWx1ZSl7cmV0dXJuIGJhc2VJbnZva2UodmFsdWUscGF0aCxhcmdzKX0pfSk7TGF6eVdyYXBwZXIucHJvdG90eXBlLnJlamVjdD1mdW5jdGlvbihwcmVkaWNhdGUpe3JldHVybiB0aGlzLmZpbHRlcihuZWdhdGUoZ2V0SXRlcmF0ZWUocHJlZGljYXRlKSkpfTtMYXp5V3JhcHBlci5wcm90b3R5cGUuc2xpY2U9ZnVuY3Rpb24oc3RhcnQsZW5kKXtzdGFydD10b0ludGVnZXIoc3RhcnQpOwp2YXIgcmVzdWx0PXRoaXM7aWYocmVzdWx0Ll9fZmlsdGVyZWRfXyYmKHN0YXJ0PjB8fGVuZDwwKSlyZXR1cm4gbmV3IExhenlXcmFwcGVyKHJlc3VsdCk7aWYoc3RhcnQ8MClyZXN1bHQ9cmVzdWx0LnRha2VSaWdodCgtc3RhcnQpO2Vsc2UgaWYoc3RhcnQpcmVzdWx0PXJlc3VsdC5kcm9wKHN0YXJ0KTtpZihlbmQhPT11bmRlZmluZWQpe2VuZD10b0ludGVnZXIoZW5kKTtyZXN1bHQ9ZW5kPDA/cmVzdWx0LmRyb3BSaWdodCgtZW5kKTpyZXN1bHQudGFrZShlbmQtc3RhcnQpfXJldHVybiByZXN1bHR9O0xhenlXcmFwcGVyLnByb3RvdHlwZS50YWtlUmlnaHRXaGlsZT1mdW5jdGlvbihwcmVkaWNhdGUpe3JldHVybiB0aGlzLnJldmVyc2UoKS50YWtlV2hpbGUocHJlZGljYXRlKS5yZXZlcnNlKCl9O0xhenlXcmFwcGVyLnByb3RvdHlwZS50b0FycmF5PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudGFrZShNQVhfQVJSQVlfTEVOR1RIKX07YmFzZUZvck93bihMYXp5V3JhcHBlci5wcm90b3R5cGUsCmZ1bmN0aW9uKGZ1bmMsbWV0aG9kTmFtZSl7dmFyIGNoZWNrSXRlcmF0ZWU9L14oPzpmaWx0ZXJ8ZmluZHxtYXB8cmVqZWN0KXxXaGlsZSQvLnRlc3QobWV0aG9kTmFtZSksaXNUYWtlcj0vXig/OmhlYWR8bGFzdCkkLy50ZXN0KG1ldGhvZE5hbWUpLGxvZGFzaEZ1bmM9bG9kYXNoW2lzVGFrZXI/InRha2UiKyhtZXRob2ROYW1lPT0ibGFzdCI/IlJpZ2h0IjoiIik6bWV0aG9kTmFtZV0scmV0VW53cmFwcGVkPWlzVGFrZXJ8fC9eZmluZC8udGVzdChtZXRob2ROYW1lKTtpZighbG9kYXNoRnVuYylyZXR1cm47bG9kYXNoLnByb3RvdHlwZVttZXRob2ROYW1lXT1mdW5jdGlvbigpe3ZhciB2YWx1ZT10aGlzLl9fd3JhcHBlZF9fLGFyZ3M9aXNUYWtlcj9bMV06YXJndW1lbnRzLGlzTGF6eT12YWx1ZSBpbnN0YW5jZW9mIExhenlXcmFwcGVyLGl0ZXJhdGVlPWFyZ3NbMF0sdXNlTGF6eT1pc0xhenl8fGlzQXJyYXkodmFsdWUpO3ZhciBpbnRlcmNlcHRvcj1mdW5jdGlvbih2YWx1ZSl7dmFyIHJlc3VsdD0KbG9kYXNoRnVuYy5hcHBseShsb2Rhc2gsYXJyYXlQdXNoKFt2YWx1ZV0sYXJncykpO3JldHVybiBpc1Rha2VyJiZjaGFpbkFsbD9yZXN1bHRbMF06cmVzdWx0fTtpZih1c2VMYXp5JiZjaGVja0l0ZXJhdGVlJiZ0eXBlb2YgaXRlcmF0ZWU9PSJmdW5jdGlvbiImJml0ZXJhdGVlLmxlbmd0aCE9MSlpc0xhenk9dXNlTGF6eT1mYWxzZTt2YXIgY2hhaW5BbGw9dGhpcy5fX2NoYWluX18saXNIeWJyaWQ9ISF0aGlzLl9fYWN0aW9uc19fLmxlbmd0aCxpc1Vud3JhcHBlZD1yZXRVbndyYXBwZWQmJiFjaGFpbkFsbCxvbmx5TGF6eT1pc0xhenkmJiFpc0h5YnJpZDtpZighcmV0VW53cmFwcGVkJiZ1c2VMYXp5KXt2YWx1ZT1vbmx5TGF6eT92YWx1ZTpuZXcgTGF6eVdyYXBwZXIodGhpcyk7dmFyIHJlc3VsdD1mdW5jLmFwcGx5KHZhbHVlLGFyZ3MpO3Jlc3VsdC5fX2FjdGlvbnNfXy5wdXNoKHsiZnVuYyI6dGhydSwiYXJncyI6W2ludGVyY2VwdG9yXSwidGhpc0FyZyI6dW5kZWZpbmVkfSk7cmV0dXJuIG5ldyBMb2Rhc2hXcmFwcGVyKHJlc3VsdCwKY2hhaW5BbGwpfWlmKGlzVW53cmFwcGVkJiZvbmx5TGF6eSlyZXR1cm4gZnVuYy5hcHBseSh0aGlzLGFyZ3MpO3Jlc3VsdD10aGlzLnRocnUoaW50ZXJjZXB0b3IpO3JldHVybiBpc1Vud3JhcHBlZD9pc1Rha2VyP3Jlc3VsdC52YWx1ZSgpWzBdOnJlc3VsdC52YWx1ZSgpOnJlc3VsdH19KTthcnJheUVhY2goWyJwb3AiLCJwdXNoIiwic2hpZnQiLCJzb3J0Iiwic3BsaWNlIiwidW5zaGlmdCJdLGZ1bmN0aW9uKG1ldGhvZE5hbWUpe3ZhciBmdW5jPWFycmF5UHJvdG9bbWV0aG9kTmFtZV0sY2hhaW5OYW1lPS9eKD86cHVzaHxzb3J0fHVuc2hpZnQpJC8udGVzdChtZXRob2ROYW1lKT8idGFwIjoidGhydSIscmV0VW53cmFwcGVkPS9eKD86cG9wfHNoaWZ0KSQvLnRlc3QobWV0aG9kTmFtZSk7bG9kYXNoLnByb3RvdHlwZVttZXRob2ROYW1lXT1mdW5jdGlvbigpe3ZhciBhcmdzPWFyZ3VtZW50cztpZihyZXRVbndyYXBwZWQmJiF0aGlzLl9fY2hhaW5fXyl7dmFyIHZhbHVlPXRoaXMudmFsdWUoKTsKcmV0dXJuIGZ1bmMuYXBwbHkoaXNBcnJheSh2YWx1ZSk/dmFsdWU6W10sYXJncyl9cmV0dXJuIHRoaXNbY2hhaW5OYW1lXShmdW5jdGlvbih2YWx1ZSl7cmV0dXJuIGZ1bmMuYXBwbHkoaXNBcnJheSh2YWx1ZSk/dmFsdWU6W10sYXJncyl9KX19KTtiYXNlRm9yT3duKExhenlXcmFwcGVyLnByb3RvdHlwZSxmdW5jdGlvbihmdW5jLG1ldGhvZE5hbWUpe3ZhciBsb2Rhc2hGdW5jPWxvZGFzaFttZXRob2ROYW1lXTtpZihsb2Rhc2hGdW5jKXt2YXIga2V5PWxvZGFzaEZ1bmMubmFtZSsiIixuYW1lcz1yZWFsTmFtZXNba2V5XXx8KHJlYWxOYW1lc1trZXldPVtdKTtuYW1lcy5wdXNoKHsibmFtZSI6bWV0aG9kTmFtZSwiZnVuYyI6bG9kYXNoRnVuY30pfX0pO3JlYWxOYW1lc1tjcmVhdGVIeWJyaWQodW5kZWZpbmVkLFdSQVBfQklORF9LRVlfRkxBRykubmFtZV09W3sibmFtZSI6IndyYXBwZXIiLCJmdW5jIjp1bmRlZmluZWR9XTtMYXp5V3JhcHBlci5wcm90b3R5cGUuY2xvbmU9bGF6eUNsb25lOwpMYXp5V3JhcHBlci5wcm90b3R5cGUucmV2ZXJzZT1sYXp5UmV2ZXJzZTtMYXp5V3JhcHBlci5wcm90b3R5cGUudmFsdWU9bGF6eVZhbHVlO2xvZGFzaC5wcm90b3R5cGUuYXQ9d3JhcHBlckF0O2xvZGFzaC5wcm90b3R5cGUuY2hhaW49d3JhcHBlckNoYWluO2xvZGFzaC5wcm90b3R5cGUuY29tbWl0PXdyYXBwZXJDb21taXQ7bG9kYXNoLnByb3RvdHlwZS5uZXh0PXdyYXBwZXJOZXh0O2xvZGFzaC5wcm90b3R5cGUucGxhbnQ9d3JhcHBlclBsYW50O2xvZGFzaC5wcm90b3R5cGUucmV2ZXJzZT13cmFwcGVyUmV2ZXJzZTtsb2Rhc2gucHJvdG90eXBlLnRvSlNPTj1sb2Rhc2gucHJvdG90eXBlLnZhbHVlT2Y9bG9kYXNoLnByb3RvdHlwZS52YWx1ZT13cmFwcGVyVmFsdWU7bG9kYXNoLnByb3RvdHlwZS5maXJzdD1sb2Rhc2gucHJvdG90eXBlLmhlYWQ7aWYoc3ltSXRlcmF0b3IpbG9kYXNoLnByb3RvdHlwZVtzeW1JdGVyYXRvcl09d3JhcHBlclRvSXRlcmF0b3I7cmV0dXJuIGxvZGFzaH07CnZhciBfPXJ1bkluQ29udGV4dCgpO2lmKHR5cGVvZiBkZWZpbmU9PSJmdW5jdGlvbiImJnR5cGVvZiBkZWZpbmUuYW1kPT0ib2JqZWN0IiYmZGVmaW5lLmFtZCl7cm9vdC5fPV87ZGVmaW5lKGZ1bmN0aW9uKCl7cmV0dXJuIF99KX1lbHNlIGlmKGZyZWVNb2R1bGUpeyhmcmVlTW9kdWxlLmV4cG9ydHM9XykuXz1fO2ZyZWVFeHBvcnRzLl89X31lbHNlIHJvb3QuXz1ffSkuY2FsbCh0aGlzKTs8L3NjcmlwdD48c2NyaXB0PihmdW5jdGlvbihmKXtpZih0eXBlb2YgZXhwb3J0cz09PSJvYmplY3QiJiZ0eXBlb2YgbW9kdWxlIT09InVuZGVmaW5lZCIpbW9kdWxlLmV4cG9ydHM9ZigpO2Vsc2UgaWYodHlwZW9mIGRlZmluZT09PSJmdW5jdGlvbiImJmRlZmluZS5hbWQpZGVmaW5lKFtdLGYpO2Vsc2V7dmFyIGc7aWYodHlwZW9mIHdpbmRvdyE9PSJ1bmRlZmluZWQiKWc9d2luZG93O2Vsc2UgaWYodHlwZW9mIGdsb2JhbCE9PSJ1bmRlZmluZWQiKWc9Z2xvYmFsO2Vsc2UgaWYodHlwZW9mIHNlbGYhPT0idW5kZWZpbmVkIilnPXNlbGY7ZWxzZSBnPXRoaXM7Zy5ncmFwaGxpYj1mKCl9fSkoZnVuY3Rpb24oKXt2YXIgZGVmaW5lLG1vZHVsZSxleHBvcnRzO3JldHVybiBmdW5jdGlvbiBlKHQsbixyKXtmdW5jdGlvbiBzKG8sdSl7aWYoIW5bb10pe2lmKCF0W29dKXt2YXIgYT10eXBlb2YgcmVxdWlyZT09ImZ1bmN0aW9uIiYmcmVxdWlyZTtpZighdSYmYSlyZXR1cm4gYShvLCEwKTtpZihpKXJldHVybiBpKG8sITApOwp2YXIgZj1uZXcgRXJyb3IoIkNhbm5vdCBmaW5kIG1vZHVsZSAnIitvKyInIik7dGhyb3cgZi5jb2RlPSJNT0RVTEVfTk9UX0ZPVU5EIixmO312YXIgbD1uW29dPXtleHBvcnRzOnt9fTt0W29dWzBdLmNhbGwobC5leHBvcnRzLGZ1bmN0aW9uKGUpe3ZhciBuPXRbb11bMV1bZV07cmV0dXJuIHMobj9uOmUpfSxsLGwuZXhwb3J0cyxlLHQsbixyKX1yZXR1cm4gbltvXS5leHBvcnRzfXZhciBpPXR5cGVvZiByZXF1aXJlPT0iZnVuY3Rpb24iJiZyZXF1aXJlO2Zvcih2YXIgbz0wO288ci5sZW5ndGg7bysrKXMocltvXSk7cmV0dXJuIHN9KHsxOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgbGliPXJlcXVpcmUoIi4vbGliIik7bW9kdWxlLmV4cG9ydHM9e0dyYXBoOmxpYi5HcmFwaCxqc29uOnJlcXVpcmUoIi4vbGliL2pzb24iKSxhbGc6cmVxdWlyZSgiLi9saWIvYWxnIiksdmVyc2lvbjpsaWIudmVyc2lvbn19LHsiLi9saWIiOjE3LCIuL2xpYi9hbGciOjgsIi4vbGliL2pzb24iOjE4fV0sCjI6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBfPXJlcXVpcmUoIi4uL2xvZGFzaCIpO21vZHVsZS5leHBvcnRzPWNvbXBvbmVudHM7ZnVuY3Rpb24gY29tcG9uZW50cyhnKXt2YXIgdmlzaXRlZD17fSxjbXB0cz1bXSxjbXB0O2Z1bmN0aW9uIGRmcyh2KXtpZihfLmhhcyh2aXNpdGVkLHYpKXJldHVybjt2aXNpdGVkW3ZdPXRydWU7Y21wdC5wdXNoKHYpO18uZWFjaChnLnN1Y2Nlc3NvcnModiksZGZzKTtfLmVhY2goZy5wcmVkZWNlc3NvcnModiksZGZzKX1fLmVhY2goZy5ub2RlcygpLGZ1bmN0aW9uKHYpe2NtcHQ9W107ZGZzKHYpO2lmKGNtcHQubGVuZ3RoKWNtcHRzLnB1c2goY21wdCl9KTtyZXR1cm4gY21wdHN9fSx7Ii4uL2xvZGFzaCI6MTl9XSwzOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgXz1yZXF1aXJlKCIuLi9sb2Rhc2giKTttb2R1bGUuZXhwb3J0cz1kZnM7ZnVuY3Rpb24gZGZzKGcsdnMsb3JkZXIpe2lmKCFfLmlzQXJyYXkodnMpKXZzPQpbdnNdO3ZhciBuYXZpZ2F0aW9uPShnLmlzRGlyZWN0ZWQoKT9nLnN1Y2Nlc3NvcnM6Zy5uZWlnaGJvcnMpLmJpbmQoZyk7dmFyIGFjYz1bXSx2aXNpdGVkPXt9O18uZWFjaCh2cyxmdW5jdGlvbih2KXtpZighZy5oYXNOb2RlKHYpKXRocm93IG5ldyBFcnJvcigiR3JhcGggZG9lcyBub3QgaGF2ZSBub2RlOiAiK3YpO2RvRGZzKGcsdixvcmRlcj09PSJwb3N0Iix2aXNpdGVkLG5hdmlnYXRpb24sYWNjKX0pO3JldHVybiBhY2N9ZnVuY3Rpb24gZG9EZnMoZyx2LHBvc3RvcmRlcix2aXNpdGVkLG5hdmlnYXRpb24sYWNjKXtpZighXy5oYXModmlzaXRlZCx2KSl7dmlzaXRlZFt2XT10cnVlO2lmKCFwb3N0b3JkZXIpYWNjLnB1c2godik7Xy5lYWNoKG5hdmlnYXRpb24odiksZnVuY3Rpb24odyl7ZG9EZnMoZyx3LHBvc3RvcmRlcix2aXNpdGVkLG5hdmlnYXRpb24sYWNjKX0pO2lmKHBvc3RvcmRlcilhY2MucHVzaCh2KX19fSx7Ii4uL2xvZGFzaCI6MTl9XSw0OltmdW5jdGlvbihyZXF1aXJlLAptb2R1bGUsZXhwb3J0cyl7dmFyIGRpamtzdHJhPXJlcXVpcmUoIi4vZGlqa3N0cmEiKSxfPXJlcXVpcmUoIi4uL2xvZGFzaCIpO21vZHVsZS5leHBvcnRzPWRpamtzdHJhQWxsO2Z1bmN0aW9uIGRpamtzdHJhQWxsKGcsd2VpZ2h0RnVuYyxlZGdlRnVuYyl7cmV0dXJuIF8udHJhbnNmb3JtKGcubm9kZXMoKSxmdW5jdGlvbihhY2Msdil7YWNjW3ZdPWRpamtzdHJhKGcsdix3ZWlnaHRGdW5jLGVkZ2VGdW5jKX0se30pfX0seyIuLi9sb2Rhc2giOjE5LCIuL2RpamtzdHJhIjo1fV0sNTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi4vbG9kYXNoIiksUHJpb3JpdHlRdWV1ZT1yZXF1aXJlKCIuLi9kYXRhL3ByaW9yaXR5LXF1ZXVlIik7bW9kdWxlLmV4cG9ydHM9ZGlqa3N0cmE7dmFyIERFRkFVTFRfV0VJR0hUX0ZVTkM9Xy5jb25zdGFudCgxKTtmdW5jdGlvbiBkaWprc3RyYShnLHNvdXJjZSx3ZWlnaHRGbixlZGdlRm4pe3JldHVybiBydW5EaWprc3RyYShnLApTdHJpbmcoc291cmNlKSx3ZWlnaHRGbnx8REVGQVVMVF9XRUlHSFRfRlVOQyxlZGdlRm58fGZ1bmN0aW9uKHYpe3JldHVybiBnLm91dEVkZ2VzKHYpfSl9ZnVuY3Rpb24gcnVuRGlqa3N0cmEoZyxzb3VyY2Usd2VpZ2h0Rm4sZWRnZUZuKXt2YXIgcmVzdWx0cz17fSxwcT1uZXcgUHJpb3JpdHlRdWV1ZSx2LHZFbnRyeTt2YXIgdXBkYXRlTmVpZ2hib3JzPWZ1bmN0aW9uKGVkZ2Upe3ZhciB3PWVkZ2UudiE9PXY/ZWRnZS52OmVkZ2Uudyx3RW50cnk9cmVzdWx0c1t3XSx3ZWlnaHQ9d2VpZ2h0Rm4oZWRnZSksZGlzdGFuY2U9dkVudHJ5LmRpc3RhbmNlK3dlaWdodDtpZih3ZWlnaHQ8MCl0aHJvdyBuZXcgRXJyb3IoImRpamtzdHJhIGRvZXMgbm90IGFsbG93IG5lZ2F0aXZlIGVkZ2Ugd2VpZ2h0cy4gIisiQmFkIGVkZ2U6ICIrZWRnZSsiIFdlaWdodDogIit3ZWlnaHQpO2lmKGRpc3RhbmNlPHdFbnRyeS5kaXN0YW5jZSl7d0VudHJ5LmRpc3RhbmNlPWRpc3RhbmNlO3dFbnRyeS5wcmVkZWNlc3Nvcj0KdjtwcS5kZWNyZWFzZSh3LGRpc3RhbmNlKX19O2cubm9kZXMoKS5mb3JFYWNoKGZ1bmN0aW9uKHYpe3ZhciBkaXN0YW5jZT12PT09c291cmNlPzA6TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZO3Jlc3VsdHNbdl09e2Rpc3RhbmNlOmRpc3RhbmNlfTtwcS5hZGQodixkaXN0YW5jZSl9KTt3aGlsZShwcS5zaXplKCk+MCl7dj1wcS5yZW1vdmVNaW4oKTt2RW50cnk9cmVzdWx0c1t2XTtpZih2RW50cnkuZGlzdGFuY2U9PT1OdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkpYnJlYWs7ZWRnZUZuKHYpLmZvckVhY2godXBkYXRlTmVpZ2hib3JzKX1yZXR1cm4gcmVzdWx0c319LHsiLi4vZGF0YS9wcmlvcml0eS1xdWV1ZSI6MTUsIi4uL2xvZGFzaCI6MTl9XSw2OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgXz1yZXF1aXJlKCIuLi9sb2Rhc2giKSx0YXJqYW49cmVxdWlyZSgiLi90YXJqYW4iKTttb2R1bGUuZXhwb3J0cz1maW5kQ3ljbGVzO2Z1bmN0aW9uIGZpbmRDeWNsZXMoZyl7cmV0dXJuIF8uZmlsdGVyKHRhcmphbihnKSwKZnVuY3Rpb24oY21wdCl7cmV0dXJuIGNtcHQubGVuZ3RoPjF8fGNtcHQubGVuZ3RoPT09MSYmZy5oYXNFZGdlKGNtcHRbMF0sY21wdFswXSl9KX19LHsiLi4vbG9kYXNoIjoxOSwiLi90YXJqYW4iOjEzfV0sNzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi4vbG9kYXNoIik7bW9kdWxlLmV4cG9ydHM9ZmxveWRXYXJzaGFsbDt2YXIgREVGQVVMVF9XRUlHSFRfRlVOQz1fLmNvbnN0YW50KDEpO2Z1bmN0aW9uIGZsb3lkV2Fyc2hhbGwoZyx3ZWlnaHRGbixlZGdlRm4pe3JldHVybiBydW5GbG95ZFdhcnNoYWxsKGcsd2VpZ2h0Rm58fERFRkFVTFRfV0VJR0hUX0ZVTkMsZWRnZUZufHxmdW5jdGlvbih2KXtyZXR1cm4gZy5vdXRFZGdlcyh2KX0pfWZ1bmN0aW9uIHJ1bkZsb3lkV2Fyc2hhbGwoZyx3ZWlnaHRGbixlZGdlRm4pe3ZhciByZXN1bHRzPXt9LG5vZGVzPWcubm9kZXMoKTtub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uKHYpe3Jlc3VsdHNbdl09Cnt9O3Jlc3VsdHNbdl1bdl09e2Rpc3RhbmNlOjB9O25vZGVzLmZvckVhY2goZnVuY3Rpb24odyl7aWYodiE9PXcpcmVzdWx0c1t2XVt3XT17ZGlzdGFuY2U6TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZfX0pO2VkZ2VGbih2KS5mb3JFYWNoKGZ1bmN0aW9uKGVkZ2Upe3ZhciB3PWVkZ2Uudj09PXY/ZWRnZS53OmVkZ2UudixkPXdlaWdodEZuKGVkZ2UpO3Jlc3VsdHNbdl1bd109e2Rpc3RhbmNlOmQscHJlZGVjZXNzb3I6dn19KX0pO25vZGVzLmZvckVhY2goZnVuY3Rpb24oayl7dmFyIHJvd0s9cmVzdWx0c1trXTtub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uKGkpe3ZhciByb3dJPXJlc3VsdHNbaV07bm9kZXMuZm9yRWFjaChmdW5jdGlvbihqKXt2YXIgaWs9cm93SVtrXTt2YXIga2o9cm93S1tqXTt2YXIgaWo9cm93SVtqXTt2YXIgYWx0RGlzdGFuY2U9aWsuZGlzdGFuY2Ura2ouZGlzdGFuY2U7aWYoYWx0RGlzdGFuY2U8aWouZGlzdGFuY2Upe2lqLmRpc3RhbmNlPWFsdERpc3RhbmNlO2lqLnByZWRlY2Vzc29yPQprai5wcmVkZWNlc3Nvcn19KX0pfSk7cmV0dXJuIHJlc3VsdHN9fSx7Ii4uL2xvZGFzaCI6MTl9XSw4OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXttb2R1bGUuZXhwb3J0cz17Y29tcG9uZW50czpyZXF1aXJlKCIuL2NvbXBvbmVudHMiKSxkaWprc3RyYTpyZXF1aXJlKCIuL2RpamtzdHJhIiksZGlqa3N0cmFBbGw6cmVxdWlyZSgiLi9kaWprc3RyYS1hbGwiKSxmaW5kQ3ljbGVzOnJlcXVpcmUoIi4vZmluZC1jeWNsZXMiKSxmbG95ZFdhcnNoYWxsOnJlcXVpcmUoIi4vZmxveWQtd2Fyc2hhbGwiKSxpc0FjeWNsaWM6cmVxdWlyZSgiLi9pcy1hY3ljbGljIikscG9zdG9yZGVyOnJlcXVpcmUoIi4vcG9zdG9yZGVyIikscHJlb3JkZXI6cmVxdWlyZSgiLi9wcmVvcmRlciIpLHByaW06cmVxdWlyZSgiLi9wcmltIiksdGFyamFuOnJlcXVpcmUoIi4vdGFyamFuIiksdG9wc29ydDpyZXF1aXJlKCIuL3RvcHNvcnQiKX19LHsiLi9jb21wb25lbnRzIjoyLCIuL2RpamtzdHJhIjo1LAoiLi9kaWprc3RyYS1hbGwiOjQsIi4vZmluZC1jeWNsZXMiOjYsIi4vZmxveWQtd2Fyc2hhbGwiOjcsIi4vaXMtYWN5Y2xpYyI6OSwiLi9wb3N0b3JkZXIiOjEwLCIuL3ByZW9yZGVyIjoxMSwiLi9wcmltIjoxMiwiLi90YXJqYW4iOjEzLCIuL3RvcHNvcnQiOjE0fV0sOTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIHRvcHNvcnQ9cmVxdWlyZSgiLi90b3Bzb3J0Iik7bW9kdWxlLmV4cG9ydHM9aXNBY3ljbGljO2Z1bmN0aW9uIGlzQWN5Y2xpYyhnKXt0cnl7dG9wc29ydChnKX1jYXRjaChlKXtpZihlIGluc3RhbmNlb2YgdG9wc29ydC5DeWNsZUV4Y2VwdGlvbilyZXR1cm4gZmFsc2U7dGhyb3cgZTt9cmV0dXJuIHRydWV9fSx7Ii4vdG9wc29ydCI6MTR9XSwxMDpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIGRmcz1yZXF1aXJlKCIuL2RmcyIpO21vZHVsZS5leHBvcnRzPXBvc3RvcmRlcjtmdW5jdGlvbiBwb3N0b3JkZXIoZyx2cyl7cmV0dXJuIGRmcyhnLAp2cywicG9zdCIpfX0seyIuL2RmcyI6M31dLDExOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgZGZzPXJlcXVpcmUoIi4vZGZzIik7bW9kdWxlLmV4cG9ydHM9cHJlb3JkZXI7ZnVuY3Rpb24gcHJlb3JkZXIoZyx2cyl7cmV0dXJuIGRmcyhnLHZzLCJwcmUiKX19LHsiLi9kZnMiOjN9XSwxMjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi4vbG9kYXNoIiksR3JhcGg9cmVxdWlyZSgiLi4vZ3JhcGgiKSxQcmlvcml0eVF1ZXVlPXJlcXVpcmUoIi4uL2RhdGEvcHJpb3JpdHktcXVldWUiKTttb2R1bGUuZXhwb3J0cz1wcmltO2Z1bmN0aW9uIHByaW0oZyx3ZWlnaHRGdW5jKXt2YXIgcmVzdWx0PW5ldyBHcmFwaCxwYXJlbnRzPXt9LHBxPW5ldyBQcmlvcml0eVF1ZXVlLHY7ZnVuY3Rpb24gdXBkYXRlTmVpZ2hib3JzKGVkZ2Upe3ZhciB3PWVkZ2Uudj09PXY/ZWRnZS53OmVkZ2Uudixwcmk9cHEucHJpb3JpdHkodyk7aWYocHJpIT09CnVuZGVmaW5lZCl7dmFyIGVkZ2VXZWlnaHQ9d2VpZ2h0RnVuYyhlZGdlKTtpZihlZGdlV2VpZ2h0PHByaSl7cGFyZW50c1t3XT12O3BxLmRlY3JlYXNlKHcsZWRnZVdlaWdodCl9fX1pZihnLm5vZGVDb3VudCgpPT09MClyZXR1cm4gcmVzdWx0O18uZWFjaChnLm5vZGVzKCksZnVuY3Rpb24odil7cHEuYWRkKHYsTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKTtyZXN1bHQuc2V0Tm9kZSh2KX0pO3BxLmRlY3JlYXNlKGcubm9kZXMoKVswXSwwKTt2YXIgaW5pdD1mYWxzZTt3aGlsZShwcS5zaXplKCk+MCl7dj1wcS5yZW1vdmVNaW4oKTtpZihfLmhhcyhwYXJlbnRzLHYpKXJlc3VsdC5zZXRFZGdlKHYscGFyZW50c1t2XSk7ZWxzZSBpZihpbml0KXRocm93IG5ldyBFcnJvcigiSW5wdXQgZ3JhcGggaXMgbm90IGNvbm5lY3RlZDogIitnKTtlbHNlIGluaXQ9dHJ1ZTtnLm5vZGVFZGdlcyh2KS5mb3JFYWNoKHVwZGF0ZU5laWdoYm9ycyl9cmV0dXJuIHJlc3VsdH19LHsiLi4vZGF0YS9wcmlvcml0eS1xdWV1ZSI6MTUsCiIuLi9ncmFwaCI6MTYsIi4uL2xvZGFzaCI6MTl9XSwxMzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi4vbG9kYXNoIik7bW9kdWxlLmV4cG9ydHM9dGFyamFuO2Z1bmN0aW9uIHRhcmphbihnKXt2YXIgaW5kZXg9MCxzdGFjaz1bXSx2aXNpdGVkPXt9LHJlc3VsdHM9W107ZnVuY3Rpb24gZGZzKHYpe3ZhciBlbnRyeT12aXNpdGVkW3ZdPXtvblN0YWNrOnRydWUsbG93bGluazppbmRleCxpbmRleDppbmRleCsrfTtzdGFjay5wdXNoKHYpO2cuc3VjY2Vzc29ycyh2KS5mb3JFYWNoKGZ1bmN0aW9uKHcpe2lmKCFfLmhhcyh2aXNpdGVkLHcpKXtkZnModyk7ZW50cnkubG93bGluaz1NYXRoLm1pbihlbnRyeS5sb3dsaW5rLHZpc2l0ZWRbd10ubG93bGluayl9ZWxzZSBpZih2aXNpdGVkW3ddLm9uU3RhY2spZW50cnkubG93bGluaz1NYXRoLm1pbihlbnRyeS5sb3dsaW5rLHZpc2l0ZWRbd10uaW5kZXgpfSk7aWYoZW50cnkubG93bGluaz09PWVudHJ5LmluZGV4KXt2YXIgY21wdD0KW10sdztkb3t3PXN0YWNrLnBvcCgpO3Zpc2l0ZWRbd10ub25TdGFjaz1mYWxzZTtjbXB0LnB1c2godyl9d2hpbGUodiE9PXcpO3Jlc3VsdHMucHVzaChjbXB0KX19Zy5ub2RlcygpLmZvckVhY2goZnVuY3Rpb24odil7aWYoIV8uaGFzKHZpc2l0ZWQsdikpZGZzKHYpfSk7cmV0dXJuIHJlc3VsdHN9fSx7Ii4uL2xvZGFzaCI6MTl9XSwxNDpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi4vbG9kYXNoIik7bW9kdWxlLmV4cG9ydHM9dG9wc29ydDt0b3Bzb3J0LkN5Y2xlRXhjZXB0aW9uPUN5Y2xlRXhjZXB0aW9uO2Z1bmN0aW9uIHRvcHNvcnQoZyl7dmFyIHZpc2l0ZWQ9e30sc3RhY2s9e30scmVzdWx0cz1bXTtmdW5jdGlvbiB2aXNpdChub2RlKXtpZihfLmhhcyhzdGFjayxub2RlKSl0aHJvdyBuZXcgQ3ljbGVFeGNlcHRpb247aWYoIV8uaGFzKHZpc2l0ZWQsbm9kZSkpe3N0YWNrW25vZGVdPXRydWU7dmlzaXRlZFtub2RlXT10cnVlO18uZWFjaChnLnByZWRlY2Vzc29ycyhub2RlKSwKdmlzaXQpO2RlbGV0ZSBzdGFja1tub2RlXTtyZXN1bHRzLnB1c2gobm9kZSl9fV8uZWFjaChnLnNpbmtzKCksdmlzaXQpO2lmKF8uc2l6ZSh2aXNpdGVkKSE9PWcubm9kZUNvdW50KCkpdGhyb3cgbmV3IEN5Y2xlRXhjZXB0aW9uO3JldHVybiByZXN1bHRzfWZ1bmN0aW9uIEN5Y2xlRXhjZXB0aW9uKCl7fX0seyIuLi9sb2Rhc2giOjE5fV0sMTU6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBfPXJlcXVpcmUoIi4uL2xvZGFzaCIpO21vZHVsZS5leHBvcnRzPVByaW9yaXR5UXVldWU7ZnVuY3Rpb24gUHJpb3JpdHlRdWV1ZSgpe3RoaXMuX2Fycj1bXTt0aGlzLl9rZXlJbmRpY2VzPXt9fVByaW9yaXR5UXVldWUucHJvdG90eXBlLnNpemU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYXJyLmxlbmd0aH07UHJpb3JpdHlRdWV1ZS5wcm90b3R5cGUua2V5cz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9hcnIubWFwKGZ1bmN0aW9uKHgpe3JldHVybiB4LmtleX0pfTtQcmlvcml0eVF1ZXVlLnByb3RvdHlwZS5oYXM9CmZ1bmN0aW9uKGtleSl7cmV0dXJuIF8uaGFzKHRoaXMuX2tleUluZGljZXMsa2V5KX07UHJpb3JpdHlRdWV1ZS5wcm90b3R5cGUucHJpb3JpdHk9ZnVuY3Rpb24oa2V5KXt2YXIgaW5kZXg9dGhpcy5fa2V5SW5kaWNlc1trZXldO2lmKGluZGV4IT09dW5kZWZpbmVkKXJldHVybiB0aGlzLl9hcnJbaW5kZXhdLnByaW9yaXR5fTtQcmlvcml0eVF1ZXVlLnByb3RvdHlwZS5taW49ZnVuY3Rpb24oKXtpZih0aGlzLnNpemUoKT09PTApdGhyb3cgbmV3IEVycm9yKCJRdWV1ZSB1bmRlcmZsb3ciKTtyZXR1cm4gdGhpcy5fYXJyWzBdLmtleX07UHJpb3JpdHlRdWV1ZS5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKGtleSxwcmlvcml0eSl7dmFyIGtleUluZGljZXM9dGhpcy5fa2V5SW5kaWNlcztrZXk9U3RyaW5nKGtleSk7aWYoIV8uaGFzKGtleUluZGljZXMsa2V5KSl7dmFyIGFycj10aGlzLl9hcnI7dmFyIGluZGV4PWFyci5sZW5ndGg7a2V5SW5kaWNlc1trZXldPWluZGV4O2Fyci5wdXNoKHtrZXk6a2V5LApwcmlvcml0eTpwcmlvcml0eX0pO3RoaXMuX2RlY3JlYXNlKGluZGV4KTtyZXR1cm4gdHJ1ZX1yZXR1cm4gZmFsc2V9O1ByaW9yaXR5UXVldWUucHJvdG90eXBlLnJlbW92ZU1pbj1mdW5jdGlvbigpe3RoaXMuX3N3YXAoMCx0aGlzLl9hcnIubGVuZ3RoLTEpO3ZhciBtaW49dGhpcy5fYXJyLnBvcCgpO2RlbGV0ZSB0aGlzLl9rZXlJbmRpY2VzW21pbi5rZXldO3RoaXMuX2hlYXBpZnkoMCk7cmV0dXJuIG1pbi5rZXl9O1ByaW9yaXR5UXVldWUucHJvdG90eXBlLmRlY3JlYXNlPWZ1bmN0aW9uKGtleSxwcmlvcml0eSl7dmFyIGluZGV4PXRoaXMuX2tleUluZGljZXNba2V5XTtpZihwcmlvcml0eT50aGlzLl9hcnJbaW5kZXhdLnByaW9yaXR5KXRocm93IG5ldyBFcnJvcigiTmV3IHByaW9yaXR5IGlzIGdyZWF0ZXIgdGhhbiBjdXJyZW50IHByaW9yaXR5LiAiKyJLZXk6ICIra2V5KyIgT2xkOiAiK3RoaXMuX2FycltpbmRleF0ucHJpb3JpdHkrIiBOZXc6ICIrcHJpb3JpdHkpO3RoaXMuX2FycltpbmRleF0ucHJpb3JpdHk9CnByaW9yaXR5O3RoaXMuX2RlY3JlYXNlKGluZGV4KX07UHJpb3JpdHlRdWV1ZS5wcm90b3R5cGUuX2hlYXBpZnk9ZnVuY3Rpb24oaSl7dmFyIGFycj10aGlzLl9hcnI7dmFyIGw9MippLHI9bCsxLGxhcmdlc3Q9aTtpZihsPGFyci5sZW5ndGgpe2xhcmdlc3Q9YXJyW2xdLnByaW9yaXR5PGFycltsYXJnZXN0XS5wcmlvcml0eT9sOmxhcmdlc3Q7aWYocjxhcnIubGVuZ3RoKWxhcmdlc3Q9YXJyW3JdLnByaW9yaXR5PGFycltsYXJnZXN0XS5wcmlvcml0eT9yOmxhcmdlc3Q7aWYobGFyZ2VzdCE9PWkpe3RoaXMuX3N3YXAoaSxsYXJnZXN0KTt0aGlzLl9oZWFwaWZ5KGxhcmdlc3QpfX19O1ByaW9yaXR5UXVldWUucHJvdG90eXBlLl9kZWNyZWFzZT1mdW5jdGlvbihpbmRleCl7dmFyIGFycj10aGlzLl9hcnI7dmFyIHByaW9yaXR5PWFycltpbmRleF0ucHJpb3JpdHk7dmFyIHBhcmVudDt3aGlsZShpbmRleCE9PTApe3BhcmVudD1pbmRleD4+MTtpZihhcnJbcGFyZW50XS5wcmlvcml0eTxwcmlvcml0eSlicmVhazsKdGhpcy5fc3dhcChpbmRleCxwYXJlbnQpO2luZGV4PXBhcmVudH19O1ByaW9yaXR5UXVldWUucHJvdG90eXBlLl9zd2FwPWZ1bmN0aW9uKGksail7dmFyIGFycj10aGlzLl9hcnI7dmFyIGtleUluZGljZXM9dGhpcy5fa2V5SW5kaWNlczt2YXIgb3JpZ0Fyckk9YXJyW2ldO3ZhciBvcmlnQXJySj1hcnJbal07YXJyW2ldPW9yaWdBcnJKO2FycltqXT1vcmlnQXJySTtrZXlJbmRpY2VzW29yaWdBcnJKLmtleV09aTtrZXlJbmRpY2VzW29yaWdBcnJJLmtleV09an19LHsiLi4vbG9kYXNoIjoxOX1dLDE2OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgXz1yZXF1aXJlKCIuL2xvZGFzaCIpO21vZHVsZS5leHBvcnRzPUdyYXBoO3ZhciBERUZBVUxUX0VER0VfTkFNRT0iXHgwMCIsR1JBUEhfTk9ERT0iXHgwMCIsRURHRV9LRVlfREVMSU09Ilx1MDAwMSI7ZnVuY3Rpb24gR3JhcGgob3B0cyl7dGhpcy5faXNEaXJlY3RlZD1fLmhhcyhvcHRzLCJkaXJlY3RlZCIpP29wdHMuZGlyZWN0ZWQ6CnRydWU7dGhpcy5faXNNdWx0aWdyYXBoPV8uaGFzKG9wdHMsIm11bHRpZ3JhcGgiKT9vcHRzLm11bHRpZ3JhcGg6ZmFsc2U7dGhpcy5faXNDb21wb3VuZD1fLmhhcyhvcHRzLCJjb21wb3VuZCIpP29wdHMuY29tcG91bmQ6ZmFsc2U7dGhpcy5fbGFiZWw9dW5kZWZpbmVkO3RoaXMuX2RlZmF1bHROb2RlTGFiZWxGbj1fLmNvbnN0YW50KHVuZGVmaW5lZCk7dGhpcy5fZGVmYXVsdEVkZ2VMYWJlbEZuPV8uY29uc3RhbnQodW5kZWZpbmVkKTt0aGlzLl9ub2Rlcz17fTtpZih0aGlzLl9pc0NvbXBvdW5kKXt0aGlzLl9wYXJlbnQ9e307dGhpcy5fY2hpbGRyZW49e307dGhpcy5fY2hpbGRyZW5bR1JBUEhfTk9ERV09e319dGhpcy5faW49e307dGhpcy5fcHJlZHM9e307dGhpcy5fb3V0PXt9O3RoaXMuX3N1Y3M9e307dGhpcy5fZWRnZU9ianM9e307dGhpcy5fZWRnZUxhYmVscz17fX1HcmFwaC5wcm90b3R5cGUuX25vZGVDb3VudD0wO0dyYXBoLnByb3RvdHlwZS5fZWRnZUNvdW50PTA7R3JhcGgucHJvdG90eXBlLmlzRGlyZWN0ZWQ9CmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2lzRGlyZWN0ZWR9O0dyYXBoLnByb3RvdHlwZS5pc011bHRpZ3JhcGg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faXNNdWx0aWdyYXBofTtHcmFwaC5wcm90b3R5cGUuaXNDb21wb3VuZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9pc0NvbXBvdW5kfTtHcmFwaC5wcm90b3R5cGUuc2V0R3JhcGg9ZnVuY3Rpb24obGFiZWwpe3RoaXMuX2xhYmVsPWxhYmVsO3JldHVybiB0aGlzfTtHcmFwaC5wcm90b3R5cGUuZ3JhcGg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbGFiZWx9O0dyYXBoLnByb3RvdHlwZS5zZXREZWZhdWx0Tm9kZUxhYmVsPWZ1bmN0aW9uKG5ld0RlZmF1bHQpe2lmKCFfLmlzRnVuY3Rpb24obmV3RGVmYXVsdCkpbmV3RGVmYXVsdD1fLmNvbnN0YW50KG5ld0RlZmF1bHQpO3RoaXMuX2RlZmF1bHROb2RlTGFiZWxGbj1uZXdEZWZhdWx0O3JldHVybiB0aGlzfTtHcmFwaC5wcm90b3R5cGUubm9kZUNvdW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX25vZGVDb3VudH07CkdyYXBoLnByb3RvdHlwZS5ub2Rlcz1mdW5jdGlvbigpe3JldHVybiBfLmtleXModGhpcy5fbm9kZXMpfTtHcmFwaC5wcm90b3R5cGUuc291cmNlcz1mdW5jdGlvbigpe3ZhciBzZWxmPXRoaXM7cmV0dXJuIF8uZmlsdGVyKHRoaXMubm9kZXMoKSxmdW5jdGlvbih2KXtyZXR1cm4gXy5pc0VtcHR5KHNlbGYuX2luW3ZdKX0pfTtHcmFwaC5wcm90b3R5cGUuc2lua3M9ZnVuY3Rpb24oKXt2YXIgc2VsZj10aGlzO3JldHVybiBfLmZpbHRlcih0aGlzLm5vZGVzKCksZnVuY3Rpb24odil7cmV0dXJuIF8uaXNFbXB0eShzZWxmLl9vdXRbdl0pfSl9O0dyYXBoLnByb3RvdHlwZS5zZXROb2Rlcz1mdW5jdGlvbih2cyx2YWx1ZSl7dmFyIGFyZ3M9YXJndW1lbnRzO3ZhciBzZWxmPXRoaXM7Xy5lYWNoKHZzLGZ1bmN0aW9uKHYpe2lmKGFyZ3MubGVuZ3RoPjEpc2VsZi5zZXROb2RlKHYsdmFsdWUpO2Vsc2Ugc2VsZi5zZXROb2RlKHYpfSk7cmV0dXJuIHRoaXN9O0dyYXBoLnByb3RvdHlwZS5zZXROb2RlPQpmdW5jdGlvbih2LHZhbHVlKXtpZihfLmhhcyh0aGlzLl9ub2Rlcyx2KSl7aWYoYXJndW1lbnRzLmxlbmd0aD4xKXRoaXMuX25vZGVzW3ZdPXZhbHVlO3JldHVybiB0aGlzfXRoaXMuX25vZGVzW3ZdPWFyZ3VtZW50cy5sZW5ndGg+MT92YWx1ZTp0aGlzLl9kZWZhdWx0Tm9kZUxhYmVsRm4odik7aWYodGhpcy5faXNDb21wb3VuZCl7dGhpcy5fcGFyZW50W3ZdPUdSQVBIX05PREU7dGhpcy5fY2hpbGRyZW5bdl09e307dGhpcy5fY2hpbGRyZW5bR1JBUEhfTk9ERV1bdl09dHJ1ZX10aGlzLl9pblt2XT17fTt0aGlzLl9wcmVkc1t2XT17fTt0aGlzLl9vdXRbdl09e307dGhpcy5fc3Vjc1t2XT17fTsrK3RoaXMuX25vZGVDb3VudDtyZXR1cm4gdGhpc307R3JhcGgucHJvdG90eXBlLm5vZGU9ZnVuY3Rpb24odil7cmV0dXJuIHRoaXMuX25vZGVzW3ZdfTtHcmFwaC5wcm90b3R5cGUuaGFzTm9kZT1mdW5jdGlvbih2KXtyZXR1cm4gXy5oYXModGhpcy5fbm9kZXMsdil9O0dyYXBoLnByb3RvdHlwZS5yZW1vdmVOb2RlPQpmdW5jdGlvbih2KXt2YXIgc2VsZj10aGlzO2lmKF8uaGFzKHRoaXMuX25vZGVzLHYpKXt2YXIgcmVtb3ZlRWRnZT1mdW5jdGlvbihlKXtzZWxmLnJlbW92ZUVkZ2Uoc2VsZi5fZWRnZU9ianNbZV0pfTtkZWxldGUgdGhpcy5fbm9kZXNbdl07aWYodGhpcy5faXNDb21wb3VuZCl7dGhpcy5fcmVtb3ZlRnJvbVBhcmVudHNDaGlsZExpc3Qodik7ZGVsZXRlIHRoaXMuX3BhcmVudFt2XTtfLmVhY2godGhpcy5jaGlsZHJlbih2KSxmdW5jdGlvbihjaGlsZCl7c2VsZi5zZXRQYXJlbnQoY2hpbGQpfSk7ZGVsZXRlIHRoaXMuX2NoaWxkcmVuW3ZdfV8uZWFjaChfLmtleXModGhpcy5faW5bdl0pLHJlbW92ZUVkZ2UpO2RlbGV0ZSB0aGlzLl9pblt2XTtkZWxldGUgdGhpcy5fcHJlZHNbdl07Xy5lYWNoKF8ua2V5cyh0aGlzLl9vdXRbdl0pLHJlbW92ZUVkZ2UpO2RlbGV0ZSB0aGlzLl9vdXRbdl07ZGVsZXRlIHRoaXMuX3N1Y3Nbdl07LS10aGlzLl9ub2RlQ291bnR9cmV0dXJuIHRoaXN9O0dyYXBoLnByb3RvdHlwZS5zZXRQYXJlbnQ9CmZ1bmN0aW9uKHYscGFyZW50KXtpZighdGhpcy5faXNDb21wb3VuZCl0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBzZXQgcGFyZW50IGluIGEgbm9uLWNvbXBvdW5kIGdyYXBoIik7aWYoXy5pc1VuZGVmaW5lZChwYXJlbnQpKXBhcmVudD1HUkFQSF9OT0RFO2Vsc2V7cGFyZW50Kz0iIjtmb3IodmFyIGFuY2VzdG9yPXBhcmVudDshXy5pc1VuZGVmaW5lZChhbmNlc3Rvcik7YW5jZXN0b3I9dGhpcy5wYXJlbnQoYW5jZXN0b3IpKWlmKGFuY2VzdG9yPT09dil0aHJvdyBuZXcgRXJyb3IoIlNldHRpbmcgIitwYXJlbnQrIiBhcyBwYXJlbnQgb2YgIit2KyIgd291bGQgY3JlYXRlIGEgY3ljbGUiKTt0aGlzLnNldE5vZGUocGFyZW50KX10aGlzLnNldE5vZGUodik7dGhpcy5fcmVtb3ZlRnJvbVBhcmVudHNDaGlsZExpc3Qodik7dGhpcy5fcGFyZW50W3ZdPXBhcmVudDt0aGlzLl9jaGlsZHJlbltwYXJlbnRdW3ZdPXRydWU7cmV0dXJuIHRoaXN9O0dyYXBoLnByb3RvdHlwZS5fcmVtb3ZlRnJvbVBhcmVudHNDaGlsZExpc3Q9CmZ1bmN0aW9uKHYpe2RlbGV0ZSB0aGlzLl9jaGlsZHJlblt0aGlzLl9wYXJlbnRbdl1dW3ZdfTtHcmFwaC5wcm90b3R5cGUucGFyZW50PWZ1bmN0aW9uKHYpe2lmKHRoaXMuX2lzQ29tcG91bmQpe3ZhciBwYXJlbnQ9dGhpcy5fcGFyZW50W3ZdO2lmKHBhcmVudCE9PUdSQVBIX05PREUpcmV0dXJuIHBhcmVudH19O0dyYXBoLnByb3RvdHlwZS5jaGlsZHJlbj1mdW5jdGlvbih2KXtpZihfLmlzVW5kZWZpbmVkKHYpKXY9R1JBUEhfTk9ERTtpZih0aGlzLl9pc0NvbXBvdW5kKXt2YXIgY2hpbGRyZW49dGhpcy5fY2hpbGRyZW5bdl07aWYoY2hpbGRyZW4pcmV0dXJuIF8ua2V5cyhjaGlsZHJlbil9ZWxzZSBpZih2PT09R1JBUEhfTk9ERSlyZXR1cm4gdGhpcy5ub2RlcygpO2Vsc2UgaWYodGhpcy5oYXNOb2RlKHYpKXJldHVybltdfTtHcmFwaC5wcm90b3R5cGUucHJlZGVjZXNzb3JzPWZ1bmN0aW9uKHYpe3ZhciBwcmVkc1Y9dGhpcy5fcHJlZHNbdl07aWYocHJlZHNWKXJldHVybiBfLmtleXMocHJlZHNWKX07CkdyYXBoLnByb3RvdHlwZS5zdWNjZXNzb3JzPWZ1bmN0aW9uKHYpe3ZhciBzdWNzVj10aGlzLl9zdWNzW3ZdO2lmKHN1Y3NWKXJldHVybiBfLmtleXMoc3Vjc1YpfTtHcmFwaC5wcm90b3R5cGUubmVpZ2hib3JzPWZ1bmN0aW9uKHYpe3ZhciBwcmVkcz10aGlzLnByZWRlY2Vzc29ycyh2KTtpZihwcmVkcylyZXR1cm4gXy51bmlvbihwcmVkcyx0aGlzLnN1Y2Nlc3NvcnModikpfTtHcmFwaC5wcm90b3R5cGUuaXNMZWFmPWZ1bmN0aW9uKHYpe3ZhciBuZWlnaGJvcnM7aWYodGhpcy5pc0RpcmVjdGVkKCkpbmVpZ2hib3JzPXRoaXMuc3VjY2Vzc29ycyh2KTtlbHNlIG5laWdoYm9ycz10aGlzLm5laWdoYm9ycyh2KTtyZXR1cm4gbmVpZ2hib3JzLmxlbmd0aD09PTB9O0dyYXBoLnByb3RvdHlwZS5maWx0ZXJOb2Rlcz1mdW5jdGlvbihmaWx0ZXIpe3ZhciBjb3B5PW5ldyB0aGlzLmNvbnN0cnVjdG9yKHtkaXJlY3RlZDp0aGlzLl9pc0RpcmVjdGVkLG11bHRpZ3JhcGg6dGhpcy5faXNNdWx0aWdyYXBoLApjb21wb3VuZDp0aGlzLl9pc0NvbXBvdW5kfSk7Y29weS5zZXRHcmFwaCh0aGlzLmdyYXBoKCkpO3ZhciBzZWxmPXRoaXM7Xy5lYWNoKHRoaXMuX25vZGVzLGZ1bmN0aW9uKHZhbHVlLHYpe2lmKGZpbHRlcih2KSljb3B5LnNldE5vZGUodix2YWx1ZSl9KTtfLmVhY2godGhpcy5fZWRnZU9ianMsZnVuY3Rpb24oZSl7aWYoY29weS5oYXNOb2RlKGUudikmJmNvcHkuaGFzTm9kZShlLncpKWNvcHkuc2V0RWRnZShlLHNlbGYuZWRnZShlKSl9KTt2YXIgcGFyZW50cz17fTtmdW5jdGlvbiBmaW5kUGFyZW50KHYpe3ZhciBwYXJlbnQ9c2VsZi5wYXJlbnQodik7aWYocGFyZW50PT09dW5kZWZpbmVkfHxjb3B5Lmhhc05vZGUocGFyZW50KSl7cGFyZW50c1t2XT1wYXJlbnQ7cmV0dXJuIHBhcmVudH1lbHNlIGlmKHBhcmVudCBpbiBwYXJlbnRzKXJldHVybiBwYXJlbnRzW3BhcmVudF07ZWxzZSByZXR1cm4gZmluZFBhcmVudChwYXJlbnQpfWlmKHRoaXMuX2lzQ29tcG91bmQpXy5lYWNoKGNvcHkubm9kZXMoKSwKZnVuY3Rpb24odil7Y29weS5zZXRQYXJlbnQodixmaW5kUGFyZW50KHYpKX0pO3JldHVybiBjb3B5fTtHcmFwaC5wcm90b3R5cGUuc2V0RGVmYXVsdEVkZ2VMYWJlbD1mdW5jdGlvbihuZXdEZWZhdWx0KXtpZighXy5pc0Z1bmN0aW9uKG5ld0RlZmF1bHQpKW5ld0RlZmF1bHQ9Xy5jb25zdGFudChuZXdEZWZhdWx0KTt0aGlzLl9kZWZhdWx0RWRnZUxhYmVsRm49bmV3RGVmYXVsdDtyZXR1cm4gdGhpc307R3JhcGgucHJvdG90eXBlLmVkZ2VDb3VudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9lZGdlQ291bnR9O0dyYXBoLnByb3RvdHlwZS5lZGdlcz1mdW5jdGlvbigpe3JldHVybiBfLnZhbHVlcyh0aGlzLl9lZGdlT2Jqcyl9O0dyYXBoLnByb3RvdHlwZS5zZXRQYXRoPWZ1bmN0aW9uKHZzLHZhbHVlKXt2YXIgc2VsZj10aGlzLGFyZ3M9YXJndW1lbnRzO18ucmVkdWNlKHZzLGZ1bmN0aW9uKHYsdyl7aWYoYXJncy5sZW5ndGg+MSlzZWxmLnNldEVkZ2Uodix3LHZhbHVlKTtlbHNlIHNlbGYuc2V0RWRnZSh2LAp3KTtyZXR1cm4gd30pO3JldHVybiB0aGlzfTtHcmFwaC5wcm90b3R5cGUuc2V0RWRnZT1mdW5jdGlvbigpe3ZhciB2LHcsbmFtZSx2YWx1ZSx2YWx1ZVNwZWNpZmllZD1mYWxzZSxhcmcwPWFyZ3VtZW50c1swXTtpZih0eXBlb2YgYXJnMD09PSJvYmplY3QiJiZhcmcwIT09bnVsbCYmInYiaW4gYXJnMCl7dj1hcmcwLnY7dz1hcmcwLnc7bmFtZT1hcmcwLm5hbWU7aWYoYXJndW1lbnRzLmxlbmd0aD09PTIpe3ZhbHVlPWFyZ3VtZW50c1sxXTt2YWx1ZVNwZWNpZmllZD10cnVlfX1lbHNle3Y9YXJnMDt3PWFyZ3VtZW50c1sxXTtuYW1lPWFyZ3VtZW50c1szXTtpZihhcmd1bWVudHMubGVuZ3RoPjIpe3ZhbHVlPWFyZ3VtZW50c1syXTt2YWx1ZVNwZWNpZmllZD10cnVlfX12PSIiK3Y7dz0iIit3O2lmKCFfLmlzVW5kZWZpbmVkKG5hbWUpKW5hbWU9IiIrbmFtZTt2YXIgZT1lZGdlQXJnc1RvSWQodGhpcy5faXNEaXJlY3RlZCx2LHcsbmFtZSk7aWYoXy5oYXModGhpcy5fZWRnZUxhYmVscywKZSkpe2lmKHZhbHVlU3BlY2lmaWVkKXRoaXMuX2VkZ2VMYWJlbHNbZV09dmFsdWU7cmV0dXJuIHRoaXN9aWYoIV8uaXNVbmRlZmluZWQobmFtZSkmJiF0aGlzLl9pc011bHRpZ3JhcGgpdGhyb3cgbmV3IEVycm9yKCJDYW5ub3Qgc2V0IGEgbmFtZWQgZWRnZSB3aGVuIGlzTXVsdGlncmFwaCBceDNkIGZhbHNlIik7dGhpcy5zZXROb2RlKHYpO3RoaXMuc2V0Tm9kZSh3KTt0aGlzLl9lZGdlTGFiZWxzW2VdPXZhbHVlU3BlY2lmaWVkP3ZhbHVlOnRoaXMuX2RlZmF1bHRFZGdlTGFiZWxGbih2LHcsbmFtZSk7dmFyIGVkZ2VPYmo9ZWRnZUFyZ3NUb09iaih0aGlzLl9pc0RpcmVjdGVkLHYsdyxuYW1lKTt2PWVkZ2VPYmoudjt3PWVkZ2VPYmoudztPYmplY3QuZnJlZXplKGVkZ2VPYmopO3RoaXMuX2VkZ2VPYmpzW2VdPWVkZ2VPYmo7aW5jcmVtZW50T3JJbml0RW50cnkodGhpcy5fcHJlZHNbd10sdik7aW5jcmVtZW50T3JJbml0RW50cnkodGhpcy5fc3Vjc1t2XSx3KTt0aGlzLl9pblt3XVtlXT0KZWRnZU9iajt0aGlzLl9vdXRbdl1bZV09ZWRnZU9iajt0aGlzLl9lZGdlQ291bnQrKztyZXR1cm4gdGhpc307R3JhcGgucHJvdG90eXBlLmVkZ2U9ZnVuY3Rpb24odix3LG5hbWUpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg9PT0xP2VkZ2VPYmpUb0lkKHRoaXMuX2lzRGlyZWN0ZWQsYXJndW1lbnRzWzBdKTplZGdlQXJnc1RvSWQodGhpcy5faXNEaXJlY3RlZCx2LHcsbmFtZSk7cmV0dXJuIHRoaXMuX2VkZ2VMYWJlbHNbZV19O0dyYXBoLnByb3RvdHlwZS5oYXNFZGdlPWZ1bmN0aW9uKHYsdyxuYW1lKXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoPT09MT9lZGdlT2JqVG9JZCh0aGlzLl9pc0RpcmVjdGVkLGFyZ3VtZW50c1swXSk6ZWRnZUFyZ3NUb0lkKHRoaXMuX2lzRGlyZWN0ZWQsdix3LG5hbWUpO3JldHVybiBfLmhhcyh0aGlzLl9lZGdlTGFiZWxzLGUpfTtHcmFwaC5wcm90b3R5cGUucmVtb3ZlRWRnZT1mdW5jdGlvbih2LHcsbmFtZSl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD09PTE/CmVkZ2VPYmpUb0lkKHRoaXMuX2lzRGlyZWN0ZWQsYXJndW1lbnRzWzBdKTplZGdlQXJnc1RvSWQodGhpcy5faXNEaXJlY3RlZCx2LHcsbmFtZSksZWRnZT10aGlzLl9lZGdlT2Jqc1tlXTtpZihlZGdlKXt2PWVkZ2Uudjt3PWVkZ2UudztkZWxldGUgdGhpcy5fZWRnZUxhYmVsc1tlXTtkZWxldGUgdGhpcy5fZWRnZU9ianNbZV07ZGVjcmVtZW50T3JSZW1vdmVFbnRyeSh0aGlzLl9wcmVkc1t3XSx2KTtkZWNyZW1lbnRPclJlbW92ZUVudHJ5KHRoaXMuX3N1Y3Nbdl0sdyk7ZGVsZXRlIHRoaXMuX2luW3ddW2VdO2RlbGV0ZSB0aGlzLl9vdXRbdl1bZV07dGhpcy5fZWRnZUNvdW50LS19cmV0dXJuIHRoaXN9O0dyYXBoLnByb3RvdHlwZS5pbkVkZ2VzPWZ1bmN0aW9uKHYsdSl7dmFyIGluVj10aGlzLl9pblt2XTtpZihpblYpe3ZhciBlZGdlcz1fLnZhbHVlcyhpblYpO2lmKCF1KXJldHVybiBlZGdlcztyZXR1cm4gXy5maWx0ZXIoZWRnZXMsZnVuY3Rpb24oZWRnZSl7cmV0dXJuIGVkZ2Uudj09PQp1fSl9fTtHcmFwaC5wcm90b3R5cGUub3V0RWRnZXM9ZnVuY3Rpb24odix3KXt2YXIgb3V0Vj10aGlzLl9vdXRbdl07aWYob3V0Vil7dmFyIGVkZ2VzPV8udmFsdWVzKG91dFYpO2lmKCF3KXJldHVybiBlZGdlcztyZXR1cm4gXy5maWx0ZXIoZWRnZXMsZnVuY3Rpb24oZWRnZSl7cmV0dXJuIGVkZ2Uudz09PXd9KX19O0dyYXBoLnByb3RvdHlwZS5ub2RlRWRnZXM9ZnVuY3Rpb24odix3KXt2YXIgaW5FZGdlcz10aGlzLmluRWRnZXModix3KTtpZihpbkVkZ2VzKXJldHVybiBpbkVkZ2VzLmNvbmNhdCh0aGlzLm91dEVkZ2VzKHYsdykpfTtmdW5jdGlvbiBpbmNyZW1lbnRPckluaXRFbnRyeShtYXAsayl7aWYobWFwW2tdKW1hcFtrXSsrO2Vsc2UgbWFwW2tdPTF9ZnVuY3Rpb24gZGVjcmVtZW50T3JSZW1vdmVFbnRyeShtYXAsayl7aWYoIS0tbWFwW2tdKWRlbGV0ZSBtYXBba119ZnVuY3Rpb24gZWRnZUFyZ3NUb0lkKGlzRGlyZWN0ZWQsdl8sd18sbmFtZSl7dmFyIHY9IiIrdl87dmFyIHc9CiIiK3dfO2lmKCFpc0RpcmVjdGVkJiZ2Pncpe3ZhciB0bXA9djt2PXc7dz10bXB9cmV0dXJuIHYrRURHRV9LRVlfREVMSU0rdytFREdFX0tFWV9ERUxJTSsoXy5pc1VuZGVmaW5lZChuYW1lKT9ERUZBVUxUX0VER0VfTkFNRTpuYW1lKX1mdW5jdGlvbiBlZGdlQXJnc1RvT2JqKGlzRGlyZWN0ZWQsdl8sd18sbmFtZSl7dmFyIHY9IiIrdl87dmFyIHc9IiIrd187aWYoIWlzRGlyZWN0ZWQmJnY+dyl7dmFyIHRtcD12O3Y9dzt3PXRtcH12YXIgZWRnZU9iaj17djp2LHc6d307aWYobmFtZSllZGdlT2JqLm5hbWU9bmFtZTtyZXR1cm4gZWRnZU9ian1mdW5jdGlvbiBlZGdlT2JqVG9JZChpc0RpcmVjdGVkLGVkZ2VPYmope3JldHVybiBlZGdlQXJnc1RvSWQoaXNEaXJlY3RlZCxlZGdlT2JqLnYsZWRnZU9iai53LGVkZ2VPYmoubmFtZSl9fSx7Ii4vbG9kYXNoIjoxOX1dLDE3OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXttb2R1bGUuZXhwb3J0cz17R3JhcGg6cmVxdWlyZSgiLi9ncmFwaCIpLAp2ZXJzaW9uOnJlcXVpcmUoIi4vdmVyc2lvbiIpfX0seyIuL2dyYXBoIjoxNiwiLi92ZXJzaW9uIjoyMH1dLDE4OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgXz1yZXF1aXJlKCIuL2xvZGFzaCIpLEdyYXBoPXJlcXVpcmUoIi4vZ3JhcGgiKTttb2R1bGUuZXhwb3J0cz17d3JpdGU6d3JpdGUscmVhZDpyZWFkfTtmdW5jdGlvbiB3cml0ZShnKXt2YXIganNvbj17b3B0aW9uczp7ZGlyZWN0ZWQ6Zy5pc0RpcmVjdGVkKCksbXVsdGlncmFwaDpnLmlzTXVsdGlncmFwaCgpLGNvbXBvdW5kOmcuaXNDb21wb3VuZCgpfSxub2Rlczp3cml0ZU5vZGVzKGcpLGVkZ2VzOndyaXRlRWRnZXMoZyl9O2lmKCFfLmlzVW5kZWZpbmVkKGcuZ3JhcGgoKSkpanNvbi52YWx1ZT1fLmNsb25lKGcuZ3JhcGgoKSk7cmV0dXJuIGpzb259ZnVuY3Rpb24gd3JpdGVOb2RlcyhnKXtyZXR1cm4gXy5tYXAoZy5ub2RlcygpLGZ1bmN0aW9uKHYpe3ZhciBub2RlVmFsdWU9Zy5ub2RlKHYpLHBhcmVudD0KZy5wYXJlbnQodiksbm9kZT17djp2fTtpZighXy5pc1VuZGVmaW5lZChub2RlVmFsdWUpKW5vZGUudmFsdWU9bm9kZVZhbHVlO2lmKCFfLmlzVW5kZWZpbmVkKHBhcmVudCkpbm9kZS5wYXJlbnQ9cGFyZW50O3JldHVybiBub2RlfSl9ZnVuY3Rpb24gd3JpdGVFZGdlcyhnKXtyZXR1cm4gXy5tYXAoZy5lZGdlcygpLGZ1bmN0aW9uKGUpe3ZhciBlZGdlVmFsdWU9Zy5lZGdlKGUpLGVkZ2U9e3Y6ZS52LHc6ZS53fTtpZighXy5pc1VuZGVmaW5lZChlLm5hbWUpKWVkZ2UubmFtZT1lLm5hbWU7aWYoIV8uaXNVbmRlZmluZWQoZWRnZVZhbHVlKSllZGdlLnZhbHVlPWVkZ2VWYWx1ZTtyZXR1cm4gZWRnZX0pfWZ1bmN0aW9uIHJlYWQoanNvbil7dmFyIGc9KG5ldyBHcmFwaChqc29uLm9wdGlvbnMpKS5zZXRHcmFwaChqc29uLnZhbHVlKTtfLmVhY2goanNvbi5ub2RlcyxmdW5jdGlvbihlbnRyeSl7Zy5zZXROb2RlKGVudHJ5LnYsZW50cnkudmFsdWUpO2lmKGVudHJ5LnBhcmVudClnLnNldFBhcmVudChlbnRyeS52LAplbnRyeS5wYXJlbnQpfSk7Xy5lYWNoKGpzb24uZWRnZXMsZnVuY3Rpb24oZW50cnkpe2cuc2V0RWRnZSh7djplbnRyeS52LHc6ZW50cnkudyxuYW1lOmVudHJ5Lm5hbWV9LGVudHJ5LnZhbHVlKX0pO3JldHVybiBnfX0seyIuL2dyYXBoIjoxNiwiLi9sb2Rhc2giOjE5fV0sMTk6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBsb2Rhc2g7aWYodHlwZW9mIHJlcXVpcmU9PT0iZnVuY3Rpb24iKXRyeXtsb2Rhc2g9cmVxdWlyZSgibG9kYXNoIil9Y2F0Y2goZSl7fWlmKCFsb2Rhc2gpbG9kYXNoPXdpbmRvdy5fO21vZHVsZS5leHBvcnRzPWxvZGFzaH0seyJsb2Rhc2giOnVuZGVmaW5lZH1dLDIwOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXttb2R1bGUuZXhwb3J0cz0iMi4xLjUifSx7fV19LHt9LFsxXSkoMSl9KTs8L3NjcmlwdD48c2NyaXB0PihmdW5jdGlvbihmKXtpZih0eXBlb2YgZXhwb3J0cz09PSJvYmplY3QiJiZ0eXBlb2YgbW9kdWxlIT09InVuZGVmaW5lZCIpbW9kdWxlLmV4cG9ydHM9ZigpO2Vsc2UgaWYodHlwZW9mIGRlZmluZT09PSJmdW5jdGlvbiImJmRlZmluZS5hbWQpZGVmaW5lKFtdLGYpO2Vsc2V7dmFyIGc7aWYodHlwZW9mIHdpbmRvdyE9PSJ1bmRlZmluZWQiKWc9d2luZG93O2Vsc2UgaWYodHlwZW9mIGdsb2JhbCE9PSJ1bmRlZmluZWQiKWc9Z2xvYmFsO2Vsc2UgaWYodHlwZW9mIHNlbGYhPT0idW5kZWZpbmVkIilnPXNlbGY7ZWxzZSBnPXRoaXM7Zy5kYWdyZT1mKCl9fSkoZnVuY3Rpb24oKXt2YXIgZGVmaW5lLG1vZHVsZSxleHBvcnRzO3JldHVybiBmdW5jdGlvbiBlKHQsbixyKXtmdW5jdGlvbiBzKG8sdSl7aWYoIW5bb10pe2lmKCF0W29dKXt2YXIgYT10eXBlb2YgcmVxdWlyZT09ImZ1bmN0aW9uIiYmcmVxdWlyZTtpZighdSYmYSlyZXR1cm4gYShvLCEwKTtpZihpKXJldHVybiBpKG8sITApO3ZhciBmPQpuZXcgRXJyb3IoIkNhbm5vdCBmaW5kIG1vZHVsZSAnIitvKyInIik7dGhyb3cgZi5jb2RlPSJNT0RVTEVfTk9UX0ZPVU5EIixmO312YXIgbD1uW29dPXtleHBvcnRzOnt9fTt0W29dWzBdLmNhbGwobC5leHBvcnRzLGZ1bmN0aW9uKGUpe3ZhciBuPXRbb11bMV1bZV07cmV0dXJuIHMobj9uOmUpfSxsLGwuZXhwb3J0cyxlLHQsbixyKX1yZXR1cm4gbltvXS5leHBvcnRzfXZhciBpPXR5cGVvZiByZXF1aXJlPT0iZnVuY3Rpb24iJiZyZXF1aXJlO2Zvcih2YXIgbz0wO288ci5sZW5ndGg7bysrKXMocltvXSk7cmV0dXJuIHN9KHsxOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXttb2R1bGUuZXhwb3J0cz17Z3JhcGhsaWI6cmVxdWlyZSgiLi9saWIvZ3JhcGhsaWIiKSxsYXlvdXQ6cmVxdWlyZSgiLi9saWIvbGF5b3V0IiksZGVidWc6cmVxdWlyZSgiLi9saWIvZGVidWciKSx1dGlsOnt0aW1lOnJlcXVpcmUoIi4vbGliL3V0aWwiKS50aW1lLG5vdGltZTpyZXF1aXJlKCIuL2xpYi91dGlsIikubm90aW1lfSwKdmVyc2lvbjpyZXF1aXJlKCIuL2xpYi92ZXJzaW9uIil9fSx7Ii4vbGliL2RlYnVnIjo2LCIuL2xpYi9ncmFwaGxpYiI6NywiLi9saWIvbGF5b3V0Ijo5LCIuL2xpYi91dGlsIjoyOSwiLi9saWIvdmVyc2lvbiI6MzB9XSwyOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgXz1yZXF1aXJlKCIuL2xvZGFzaCIpLGdyZWVkeUZBUz1yZXF1aXJlKCIuL2dyZWVkeS1mYXMiKTttb2R1bGUuZXhwb3J0cz17cnVuOnJ1bix1bmRvOnVuZG99O2Z1bmN0aW9uIHJ1bihnKXt2YXIgZmFzPWcuZ3JhcGgoKS5hY3ljbGljZXI9PT0iZ3JlZWR5Ij9ncmVlZHlGQVMoZyx3ZWlnaHRGbihnKSk6ZGZzRkFTKGcpO18uZm9yRWFjaChmYXMsZnVuY3Rpb24oZSl7dmFyIGxhYmVsPWcuZWRnZShlKTtnLnJlbW92ZUVkZ2UoZSk7bGFiZWwuZm9yd2FyZE5hbWU9ZS5uYW1lO2xhYmVsLnJldmVyc2VkPXRydWU7Zy5zZXRFZGdlKGUudyxlLnYsbGFiZWwsXy51bmlxdWVJZCgicmV2IikpfSk7ZnVuY3Rpb24gd2VpZ2h0Rm4oZyl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiBnLmVkZ2UoZSkud2VpZ2h0fX0KfWZ1bmN0aW9uIGRmc0ZBUyhnKXt2YXIgZmFzPVtdLHN0YWNrPXt9LHZpc2l0ZWQ9e307ZnVuY3Rpb24gZGZzKHYpe2lmKF8uaGFzKHZpc2l0ZWQsdikpcmV0dXJuO3Zpc2l0ZWRbdl09dHJ1ZTtzdGFja1t2XT10cnVlO18uZm9yRWFjaChnLm91dEVkZ2VzKHYpLGZ1bmN0aW9uKGUpe2lmKF8uaGFzKHN0YWNrLGUudykpZmFzLnB1c2goZSk7ZWxzZSBkZnMoZS53KX0pO2RlbGV0ZSBzdGFja1t2XX1fLmZvckVhY2goZy5ub2RlcygpLGRmcyk7cmV0dXJuIGZhc31mdW5jdGlvbiB1bmRvKGcpe18uZm9yRWFjaChnLmVkZ2VzKCksZnVuY3Rpb24oZSl7dmFyIGxhYmVsPWcuZWRnZShlKTtpZihsYWJlbC5yZXZlcnNlZCl7Zy5yZW1vdmVFZGdlKGUpO3ZhciBmb3J3YXJkTmFtZT1sYWJlbC5mb3J3YXJkTmFtZTtkZWxldGUgbGFiZWwucmV2ZXJzZWQ7ZGVsZXRlIGxhYmVsLmZvcndhcmROYW1lO2cuc2V0RWRnZShlLncsZS52LGxhYmVsLGZvcndhcmROYW1lKX19KX19LHsiLi9ncmVlZHktZmFzIjo4LAoiLi9sb2Rhc2giOjEwfV0sMzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi9sb2Rhc2giKSx1dGlsPXJlcXVpcmUoIi4vdXRpbCIpO21vZHVsZS5leHBvcnRzPWFkZEJvcmRlclNlZ21lbnRzO2Z1bmN0aW9uIGFkZEJvcmRlclNlZ21lbnRzKGcpe2Z1bmN0aW9uIGRmcyh2KXt2YXIgY2hpbGRyZW49Zy5jaGlsZHJlbih2KSxub2RlPWcubm9kZSh2KTtpZihjaGlsZHJlbi5sZW5ndGgpXy5mb3JFYWNoKGNoaWxkcmVuLGRmcyk7aWYoXy5oYXMobm9kZSwibWluUmFuayIpKXtub2RlLmJvcmRlckxlZnQ9W107bm9kZS5ib3JkZXJSaWdodD1bXTtmb3IodmFyIHJhbms9bm9kZS5taW5SYW5rLG1heFJhbms9bm9kZS5tYXhSYW5rKzE7cmFuazxtYXhSYW5rOysrcmFuayl7YWRkQm9yZGVyTm9kZShnLCJib3JkZXJMZWZ0IiwiX2JsIix2LG5vZGUscmFuayk7YWRkQm9yZGVyTm9kZShnLCJib3JkZXJSaWdodCIsIl9iciIsdixub2RlLHJhbmspfX19Xy5mb3JFYWNoKGcuY2hpbGRyZW4oKSwKZGZzKX1mdW5jdGlvbiBhZGRCb3JkZXJOb2RlKGcscHJvcCxwcmVmaXgsc2csc2dOb2RlLHJhbmspe3ZhciBsYWJlbD17d2lkdGg6MCxoZWlnaHQ6MCxyYW5rOnJhbmssYm9yZGVyVHlwZTpwcm9wfSxwcmV2PXNnTm9kZVtwcm9wXVtyYW5rLTFdLGN1cnI9dXRpbC5hZGREdW1teU5vZGUoZywiYm9yZGVyIixsYWJlbCxwcmVmaXgpO3NnTm9kZVtwcm9wXVtyYW5rXT1jdXJyO2cuc2V0UGFyZW50KGN1cnIsc2cpO2lmKHByZXYpZy5zZXRFZGdlKHByZXYsY3Vycix7d2VpZ2h0OjF9KX19LHsiLi9sb2Rhc2giOjEwLCIuL3V0aWwiOjI5fV0sNDpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi9sb2Rhc2giKTttb2R1bGUuZXhwb3J0cz17YWRqdXN0OmFkanVzdCx1bmRvOnVuZG99O2Z1bmN0aW9uIGFkanVzdChnKXt2YXIgcmFua0Rpcj1nLmdyYXBoKCkucmFua2Rpci50b0xvd2VyQ2FzZSgpO2lmKHJhbmtEaXI9PT0ibHIifHxyYW5rRGlyPT09InJsIilzd2FwV2lkdGhIZWlnaHQoZyl9CmZ1bmN0aW9uIHVuZG8oZyl7dmFyIHJhbmtEaXI9Zy5ncmFwaCgpLnJhbmtkaXIudG9Mb3dlckNhc2UoKTtpZihyYW5rRGlyPT09ImJ0Inx8cmFua0Rpcj09PSJybCIpcmV2ZXJzZVkoZyk7aWYocmFua0Rpcj09PSJsciJ8fHJhbmtEaXI9PT0icmwiKXtzd2FwWFkoZyk7c3dhcFdpZHRoSGVpZ2h0KGcpfX1mdW5jdGlvbiBzd2FwV2lkdGhIZWlnaHQoZyl7Xy5mb3JFYWNoKGcubm9kZXMoKSxmdW5jdGlvbih2KXtzd2FwV2lkdGhIZWlnaHRPbmUoZy5ub2RlKHYpKX0pO18uZm9yRWFjaChnLmVkZ2VzKCksZnVuY3Rpb24oZSl7c3dhcFdpZHRoSGVpZ2h0T25lKGcuZWRnZShlKSl9KX1mdW5jdGlvbiBzd2FwV2lkdGhIZWlnaHRPbmUoYXR0cnMpe3ZhciB3PWF0dHJzLndpZHRoO2F0dHJzLndpZHRoPWF0dHJzLmhlaWdodDthdHRycy5oZWlnaHQ9d31mdW5jdGlvbiByZXZlcnNlWShnKXtfLmZvckVhY2goZy5ub2RlcygpLGZ1bmN0aW9uKHYpe3JldmVyc2VZT25lKGcubm9kZSh2KSl9KTtfLmZvckVhY2goZy5lZGdlcygpLApmdW5jdGlvbihlKXt2YXIgZWRnZT1nLmVkZ2UoZSk7Xy5mb3JFYWNoKGVkZ2UucG9pbnRzLHJldmVyc2VZT25lKTtpZihfLmhhcyhlZGdlLCJ5IikpcmV2ZXJzZVlPbmUoZWRnZSl9KX1mdW5jdGlvbiByZXZlcnNlWU9uZShhdHRycyl7YXR0cnMueT0tYXR0cnMueX1mdW5jdGlvbiBzd2FwWFkoZyl7Xy5mb3JFYWNoKGcubm9kZXMoKSxmdW5jdGlvbih2KXtzd2FwWFlPbmUoZy5ub2RlKHYpKX0pO18uZm9yRWFjaChnLmVkZ2VzKCksZnVuY3Rpb24oZSl7dmFyIGVkZ2U9Zy5lZGdlKGUpO18uZm9yRWFjaChlZGdlLnBvaW50cyxzd2FwWFlPbmUpO2lmKF8uaGFzKGVkZ2UsIngiKSlzd2FwWFlPbmUoZWRnZSl9KX1mdW5jdGlvbiBzd2FwWFlPbmUoYXR0cnMpe3ZhciB4PWF0dHJzLng7YXR0cnMueD1hdHRycy55O2F0dHJzLnk9eH19LHsiLi9sb2Rhc2giOjEwfV0sNTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7bW9kdWxlLmV4cG9ydHM9TGlzdDtmdW5jdGlvbiBMaXN0KCl7dmFyIHNlbnRpbmVsPQp7fTtzZW50aW5lbC5fbmV4dD1zZW50aW5lbC5fcHJldj1zZW50aW5lbDt0aGlzLl9zZW50aW5lbD1zZW50aW5lbH1MaXN0LnByb3RvdHlwZS5kZXF1ZXVlPWZ1bmN0aW9uKCl7dmFyIHNlbnRpbmVsPXRoaXMuX3NlbnRpbmVsLGVudHJ5PXNlbnRpbmVsLl9wcmV2O2lmKGVudHJ5IT09c2VudGluZWwpe3VubGluayhlbnRyeSk7cmV0dXJuIGVudHJ5fX07TGlzdC5wcm90b3R5cGUuZW5xdWV1ZT1mdW5jdGlvbihlbnRyeSl7dmFyIHNlbnRpbmVsPXRoaXMuX3NlbnRpbmVsO2lmKGVudHJ5Ll9wcmV2JiZlbnRyeS5fbmV4dCl1bmxpbmsoZW50cnkpO2VudHJ5Ll9uZXh0PXNlbnRpbmVsLl9uZXh0O3NlbnRpbmVsLl9uZXh0Ll9wcmV2PWVudHJ5O3NlbnRpbmVsLl9uZXh0PWVudHJ5O2VudHJ5Ll9wcmV2PXNlbnRpbmVsfTtMaXN0LnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3ZhciBzdHJzPVtdLHNlbnRpbmVsPXRoaXMuX3NlbnRpbmVsLGN1cnI9c2VudGluZWwuX3ByZXY7d2hpbGUoY3VyciE9PQpzZW50aW5lbCl7c3Rycy5wdXNoKEpTT04uc3RyaW5naWZ5KGN1cnIsZmlsdGVyT3V0TGlua3MpKTtjdXJyPWN1cnIuX3ByZXZ9cmV0dXJuIlsiK3N0cnMuam9pbigiLCAiKSsiXSJ9O2Z1bmN0aW9uIHVubGluayhlbnRyeSl7ZW50cnkuX3ByZXYuX25leHQ9ZW50cnkuX25leHQ7ZW50cnkuX25leHQuX3ByZXY9ZW50cnkuX3ByZXY7ZGVsZXRlIGVudHJ5Ll9uZXh0O2RlbGV0ZSBlbnRyeS5fcHJldn1mdW5jdGlvbiBmaWx0ZXJPdXRMaW5rcyhrLHYpe2lmKGshPT0iX25leHQiJiZrIT09Il9wcmV2IilyZXR1cm4gdn19LHt9XSw2OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgXz1yZXF1aXJlKCIuL2xvZGFzaCIpLHV0aWw9cmVxdWlyZSgiLi91dGlsIiksR3JhcGg9cmVxdWlyZSgiLi9ncmFwaGxpYiIpLkdyYXBoO21vZHVsZS5leHBvcnRzPXtkZWJ1Z09yZGVyaW5nOmRlYnVnT3JkZXJpbmd9O2Z1bmN0aW9uIGRlYnVnT3JkZXJpbmcoZyl7dmFyIGxheWVyTWF0cml4PQp1dGlsLmJ1aWxkTGF5ZXJNYXRyaXgoZyk7dmFyIGg9KG5ldyBHcmFwaCh7Y29tcG91bmQ6dHJ1ZSxtdWx0aWdyYXBoOnRydWV9KSkuc2V0R3JhcGgoe30pO18uZm9yRWFjaChnLm5vZGVzKCksZnVuY3Rpb24odil7aC5zZXROb2RlKHYse2xhYmVsOnZ9KTtoLnNldFBhcmVudCh2LCJsYXllciIrZy5ub2RlKHYpLnJhbmspfSk7Xy5mb3JFYWNoKGcuZWRnZXMoKSxmdW5jdGlvbihlKXtoLnNldEVkZ2UoZS52LGUudyx7fSxlLm5hbWUpfSk7Xy5mb3JFYWNoKGxheWVyTWF0cml4LGZ1bmN0aW9uKGxheWVyLGkpe3ZhciBsYXllclY9ImxheWVyIitpO2guc2V0Tm9kZShsYXllclYse3Jhbms6InNhbWUifSk7Xy5yZWR1Y2UobGF5ZXIsZnVuY3Rpb24odSx2KXtoLnNldEVkZ2UodSx2LHtzdHlsZToiaW52aXMifSk7cmV0dXJuIHZ9KX0pO3JldHVybiBofX0seyIuL2dyYXBobGliIjo3LCIuL2xvZGFzaCI6MTAsIi4vdXRpbCI6Mjl9XSw3OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgZ3JhcGhsaWI7CmlmKHR5cGVvZiByZXF1aXJlPT09ImZ1bmN0aW9uIil0cnl7Z3JhcGhsaWI9cmVxdWlyZSgiZ3JhcGhsaWIiKX1jYXRjaChlKXt9aWYoIWdyYXBobGliKWdyYXBobGliPXdpbmRvdy5ncmFwaGxpYjttb2R1bGUuZXhwb3J0cz1ncmFwaGxpYn0seyJncmFwaGxpYiI6dW5kZWZpbmVkfV0sODpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi9sb2Rhc2giKSxHcmFwaD1yZXF1aXJlKCIuL2dyYXBobGliIikuR3JhcGgsTGlzdD1yZXF1aXJlKCIuL2RhdGEvbGlzdCIpO21vZHVsZS5leHBvcnRzPWdyZWVkeUZBUzt2YXIgREVGQVVMVF9XRUlHSFRfRk49Xy5jb25zdGFudCgxKTtmdW5jdGlvbiBncmVlZHlGQVMoZyx3ZWlnaHRGbil7aWYoZy5ub2RlQ291bnQoKTw9MSlyZXR1cm5bXTt2YXIgc3RhdGU9YnVpbGRTdGF0ZShnLHdlaWdodEZufHxERUZBVUxUX1dFSUdIVF9GTik7dmFyIHJlc3VsdHM9ZG9HcmVlZHlGQVMoc3RhdGUuZ3JhcGgsc3RhdGUuYnVja2V0cywKc3RhdGUuemVyb0lkeCk7cmV0dXJuIF8uZmxhdHRlbihfLm1hcChyZXN1bHRzLGZ1bmN0aW9uKGUpe3JldHVybiBnLm91dEVkZ2VzKGUudixlLncpfSksdHJ1ZSl9ZnVuY3Rpb24gZG9HcmVlZHlGQVMoZyxidWNrZXRzLHplcm9JZHgpe3ZhciByZXN1bHRzPVtdLHNvdXJjZXM9YnVja2V0c1tidWNrZXRzLmxlbmd0aC0xXSxzaW5rcz1idWNrZXRzWzBdO3ZhciBlbnRyeTt3aGlsZShnLm5vZGVDb3VudCgpKXt3aGlsZShlbnRyeT1zaW5rcy5kZXF1ZXVlKCkpcmVtb3ZlTm9kZShnLGJ1Y2tldHMsemVyb0lkeCxlbnRyeSk7d2hpbGUoZW50cnk9c291cmNlcy5kZXF1ZXVlKCkpcmVtb3ZlTm9kZShnLGJ1Y2tldHMsemVyb0lkeCxlbnRyeSk7aWYoZy5ub2RlQ291bnQoKSlmb3IodmFyIGk9YnVja2V0cy5sZW5ndGgtMjtpPjA7LS1pKXtlbnRyeT1idWNrZXRzW2ldLmRlcXVldWUoKTtpZihlbnRyeSl7cmVzdWx0cz1yZXN1bHRzLmNvbmNhdChyZW1vdmVOb2RlKGcsYnVja2V0cyx6ZXJvSWR4LAplbnRyeSx0cnVlKSk7YnJlYWt9fX1yZXR1cm4gcmVzdWx0c31mdW5jdGlvbiByZW1vdmVOb2RlKGcsYnVja2V0cyx6ZXJvSWR4LGVudHJ5LGNvbGxlY3RQcmVkZWNlc3NvcnMpe3ZhciByZXN1bHRzPWNvbGxlY3RQcmVkZWNlc3NvcnM/W106dW5kZWZpbmVkO18uZm9yRWFjaChnLmluRWRnZXMoZW50cnkudiksZnVuY3Rpb24oZWRnZSl7dmFyIHdlaWdodD1nLmVkZ2UoZWRnZSksdUVudHJ5PWcubm9kZShlZGdlLnYpO2lmKGNvbGxlY3RQcmVkZWNlc3NvcnMpcmVzdWx0cy5wdXNoKHt2OmVkZ2Uudix3OmVkZ2Uud30pO3VFbnRyeS5vdXQtPXdlaWdodDthc3NpZ25CdWNrZXQoYnVja2V0cyx6ZXJvSWR4LHVFbnRyeSl9KTtfLmZvckVhY2goZy5vdXRFZGdlcyhlbnRyeS52KSxmdW5jdGlvbihlZGdlKXt2YXIgd2VpZ2h0PWcuZWRnZShlZGdlKSx3PWVkZ2Uudyx3RW50cnk9Zy5ub2RlKHcpO3dFbnRyeVsiaW4iXS09d2VpZ2h0O2Fzc2lnbkJ1Y2tldChidWNrZXRzLHplcm9JZHgsd0VudHJ5KX0pOwpnLnJlbW92ZU5vZGUoZW50cnkudik7cmV0dXJuIHJlc3VsdHN9ZnVuY3Rpb24gYnVpbGRTdGF0ZShnLHdlaWdodEZuKXt2YXIgZmFzR3JhcGg9bmV3IEdyYXBoLG1heEluPTAsbWF4T3V0PTA7Xy5mb3JFYWNoKGcubm9kZXMoKSxmdW5jdGlvbih2KXtmYXNHcmFwaC5zZXROb2RlKHYse3Y6diwiaW4iOjAsb3V0OjB9KX0pO18uZm9yRWFjaChnLmVkZ2VzKCksZnVuY3Rpb24oZSl7dmFyIHByZXZXZWlnaHQ9ZmFzR3JhcGguZWRnZShlLnYsZS53KXx8MCx3ZWlnaHQ9d2VpZ2h0Rm4oZSksZWRnZVdlaWdodD1wcmV2V2VpZ2h0K3dlaWdodDtmYXNHcmFwaC5zZXRFZGdlKGUudixlLncsZWRnZVdlaWdodCk7bWF4T3V0PU1hdGgubWF4KG1heE91dCxmYXNHcmFwaC5ub2RlKGUudikub3V0Kz13ZWlnaHQpO21heEluPU1hdGgubWF4KG1heEluLGZhc0dyYXBoLm5vZGUoZS53KVsiaW4iXSs9d2VpZ2h0KX0pO3ZhciBidWNrZXRzPV8ucmFuZ2UobWF4T3V0K21heEluKzMpLm1hcChmdW5jdGlvbigpe3JldHVybiBuZXcgTGlzdH0pOwp2YXIgemVyb0lkeD1tYXhJbisxO18uZm9yRWFjaChmYXNHcmFwaC5ub2RlcygpLGZ1bmN0aW9uKHYpe2Fzc2lnbkJ1Y2tldChidWNrZXRzLHplcm9JZHgsZmFzR3JhcGgubm9kZSh2KSl9KTtyZXR1cm57Z3JhcGg6ZmFzR3JhcGgsYnVja2V0czpidWNrZXRzLHplcm9JZHg6emVyb0lkeH19ZnVuY3Rpb24gYXNzaWduQnVja2V0KGJ1Y2tldHMsemVyb0lkeCxlbnRyeSl7aWYoIWVudHJ5Lm91dClidWNrZXRzWzBdLmVucXVldWUoZW50cnkpO2Vsc2UgaWYoIWVudHJ5WyJpbiJdKWJ1Y2tldHNbYnVja2V0cy5sZW5ndGgtMV0uZW5xdWV1ZShlbnRyeSk7ZWxzZSBidWNrZXRzW2VudHJ5Lm91dC1lbnRyeVsiaW4iXSt6ZXJvSWR4XS5lbnF1ZXVlKGVudHJ5KX19LHsiLi9kYXRhL2xpc3QiOjUsIi4vZ3JhcGhsaWIiOjcsIi4vbG9kYXNoIjoxMH1dLDk6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBfPXJlcXVpcmUoIi4vbG9kYXNoIiksYWN5Y2xpYz1yZXF1aXJlKCIuL2FjeWNsaWMiKSwKbm9ybWFsaXplPXJlcXVpcmUoIi4vbm9ybWFsaXplIikscmFuaz1yZXF1aXJlKCIuL3JhbmsiKSxub3JtYWxpemVSYW5rcz1yZXF1aXJlKCIuL3V0aWwiKS5ub3JtYWxpemVSYW5rcyxwYXJlbnREdW1teUNoYWlucz1yZXF1aXJlKCIuL3BhcmVudC1kdW1teS1jaGFpbnMiKSxyZW1vdmVFbXB0eVJhbmtzPXJlcXVpcmUoIi4vdXRpbCIpLnJlbW92ZUVtcHR5UmFua3MsbmVzdGluZ0dyYXBoPXJlcXVpcmUoIi4vbmVzdGluZy1ncmFwaCIpLGFkZEJvcmRlclNlZ21lbnRzPXJlcXVpcmUoIi4vYWRkLWJvcmRlci1zZWdtZW50cyIpLGNvb3JkaW5hdGVTeXN0ZW09cmVxdWlyZSgiLi9jb29yZGluYXRlLXN5c3RlbSIpLG9yZGVyPXJlcXVpcmUoIi4vb3JkZXIiKSxwb3NpdGlvbj1yZXF1aXJlKCIuL3Bvc2l0aW9uIiksdXRpbD1yZXF1aXJlKCIuL3V0aWwiKSxHcmFwaD1yZXF1aXJlKCIuL2dyYXBobGliIikuR3JhcGg7bW9kdWxlLmV4cG9ydHM9bGF5b3V0O2Z1bmN0aW9uIGxheW91dChnLG9wdHMpe3ZhciB0aW1lPQpvcHRzJiZvcHRzLmRlYnVnVGltaW5nP3V0aWwudGltZTp1dGlsLm5vdGltZTt0aW1lKCJsYXlvdXQiLGZ1bmN0aW9uKCl7dmFyIGxheW91dEdyYXBoPXRpbWUoIiAgYnVpbGRMYXlvdXRHcmFwaCIsZnVuY3Rpb24oKXtyZXR1cm4gYnVpbGRMYXlvdXRHcmFwaChnKX0pO3RpbWUoIiAgcnVuTGF5b3V0IixmdW5jdGlvbigpe3J1bkxheW91dChsYXlvdXRHcmFwaCx0aW1lKX0pO3RpbWUoIiAgdXBkYXRlSW5wdXRHcmFwaCIsZnVuY3Rpb24oKXt1cGRhdGVJbnB1dEdyYXBoKGcsbGF5b3V0R3JhcGgpfSl9KX1mdW5jdGlvbiBydW5MYXlvdXQoZyx0aW1lKXt0aW1lKCIgICAgbWFrZVNwYWNlRm9yRWRnZUxhYmVscyIsZnVuY3Rpb24oKXttYWtlU3BhY2VGb3JFZGdlTGFiZWxzKGcpfSk7dGltZSgiICAgIHJlbW92ZVNlbGZFZGdlcyIsZnVuY3Rpb24oKXtyZW1vdmVTZWxmRWRnZXMoZyl9KTt0aW1lKCIgICAgYWN5Y2xpYyIsZnVuY3Rpb24oKXthY3ljbGljLnJ1bihnKX0pO3RpbWUoIiAgICBuZXN0aW5nR3JhcGgucnVuIiwKZnVuY3Rpb24oKXtuZXN0aW5nR3JhcGgucnVuKGcpfSk7dGltZSgiICAgIHJhbmsiLGZ1bmN0aW9uKCl7cmFuayh1dGlsLmFzTm9uQ29tcG91bmRHcmFwaChnKSl9KTt0aW1lKCIgICAgaW5qZWN0RWRnZUxhYmVsUHJveGllcyIsZnVuY3Rpb24oKXtpbmplY3RFZGdlTGFiZWxQcm94aWVzKGcpfSk7dGltZSgiICAgIHJlbW92ZUVtcHR5UmFua3MiLGZ1bmN0aW9uKCl7cmVtb3ZlRW1wdHlSYW5rcyhnKX0pO3RpbWUoIiAgICBuZXN0aW5nR3JhcGguY2xlYW51cCIsZnVuY3Rpb24oKXtuZXN0aW5nR3JhcGguY2xlYW51cChnKX0pO3RpbWUoIiAgICBub3JtYWxpemVSYW5rcyIsZnVuY3Rpb24oKXtub3JtYWxpemVSYW5rcyhnKX0pO3RpbWUoIiAgICBhc3NpZ25SYW5rTWluTWF4IixmdW5jdGlvbigpe2Fzc2lnblJhbmtNaW5NYXgoZyl9KTt0aW1lKCIgICAgcmVtb3ZlRWRnZUxhYmVsUHJveGllcyIsZnVuY3Rpb24oKXtyZW1vdmVFZGdlTGFiZWxQcm94aWVzKGcpfSk7dGltZSgiICAgIG5vcm1hbGl6ZS5ydW4iLApmdW5jdGlvbigpe25vcm1hbGl6ZS5ydW4oZyl9KTt0aW1lKCIgICAgcGFyZW50RHVtbXlDaGFpbnMiLGZ1bmN0aW9uKCl7cGFyZW50RHVtbXlDaGFpbnMoZyl9KTt0aW1lKCIgICAgYWRkQm9yZGVyU2VnbWVudHMiLGZ1bmN0aW9uKCl7YWRkQm9yZGVyU2VnbWVudHMoZyl9KTt0aW1lKCIgICAgb3JkZXIiLGZ1bmN0aW9uKCl7b3JkZXIoZyl9KTt0aW1lKCIgICAgaW5zZXJ0U2VsZkVkZ2VzIixmdW5jdGlvbigpe2luc2VydFNlbGZFZGdlcyhnKX0pO3RpbWUoIiAgICBhZGp1c3RDb29yZGluYXRlU3lzdGVtIixmdW5jdGlvbigpe2Nvb3JkaW5hdGVTeXN0ZW0uYWRqdXN0KGcpfSk7dGltZSgiICAgIHBvc2l0aW9uIixmdW5jdGlvbigpe3Bvc2l0aW9uKGcpfSk7dGltZSgiICAgIHBvc2l0aW9uU2VsZkVkZ2VzIixmdW5jdGlvbigpe3Bvc2l0aW9uU2VsZkVkZ2VzKGcpfSk7dGltZSgiICAgIHJlbW92ZUJvcmRlck5vZGVzIixmdW5jdGlvbigpe3JlbW92ZUJvcmRlck5vZGVzKGcpfSk7dGltZSgiICAgIG5vcm1hbGl6ZS51bmRvIiwKZnVuY3Rpb24oKXtub3JtYWxpemUudW5kbyhnKX0pO3RpbWUoIiAgICBmaXh1cEVkZ2VMYWJlbENvb3JkcyIsZnVuY3Rpb24oKXtmaXh1cEVkZ2VMYWJlbENvb3JkcyhnKX0pO3RpbWUoIiAgICB1bmRvQ29vcmRpbmF0ZVN5c3RlbSIsZnVuY3Rpb24oKXtjb29yZGluYXRlU3lzdGVtLnVuZG8oZyl9KTt0aW1lKCIgICAgdHJhbnNsYXRlR3JhcGgiLGZ1bmN0aW9uKCl7dHJhbnNsYXRlR3JhcGgoZyl9KTt0aW1lKCIgICAgYXNzaWduTm9kZUludGVyc2VjdHMiLGZ1bmN0aW9uKCl7YXNzaWduTm9kZUludGVyc2VjdHMoZyl9KTt0aW1lKCIgICAgcmV2ZXJzZVBvaW50cyIsZnVuY3Rpb24oKXtyZXZlcnNlUG9pbnRzRm9yUmV2ZXJzZWRFZGdlcyhnKX0pO3RpbWUoIiAgICBhY3ljbGljLnVuZG8iLGZ1bmN0aW9uKCl7YWN5Y2xpYy51bmRvKGcpfSl9ZnVuY3Rpb24gdXBkYXRlSW5wdXRHcmFwaChpbnB1dEdyYXBoLGxheW91dEdyYXBoKXtfLmZvckVhY2goaW5wdXRHcmFwaC5ub2RlcygpLGZ1bmN0aW9uKHYpe3ZhciBpbnB1dExhYmVsPQppbnB1dEdyYXBoLm5vZGUodiksbGF5b3V0TGFiZWw9bGF5b3V0R3JhcGgubm9kZSh2KTtpZihpbnB1dExhYmVsKXtpbnB1dExhYmVsLng9bGF5b3V0TGFiZWwueDtpbnB1dExhYmVsLnk9bGF5b3V0TGFiZWwueTtpZihsYXlvdXRHcmFwaC5jaGlsZHJlbih2KS5sZW5ndGgpe2lucHV0TGFiZWwud2lkdGg9bGF5b3V0TGFiZWwud2lkdGg7aW5wdXRMYWJlbC5oZWlnaHQ9bGF5b3V0TGFiZWwuaGVpZ2h0fX19KTtfLmZvckVhY2goaW5wdXRHcmFwaC5lZGdlcygpLGZ1bmN0aW9uKGUpe3ZhciBpbnB1dExhYmVsPWlucHV0R3JhcGguZWRnZShlKSxsYXlvdXRMYWJlbD1sYXlvdXRHcmFwaC5lZGdlKGUpO2lucHV0TGFiZWwucG9pbnRzPWxheW91dExhYmVsLnBvaW50cztpZihfLmhhcyhsYXlvdXRMYWJlbCwieCIpKXtpbnB1dExhYmVsLng9bGF5b3V0TGFiZWwueDtpbnB1dExhYmVsLnk9bGF5b3V0TGFiZWwueX19KTtpbnB1dEdyYXBoLmdyYXBoKCkud2lkdGg9bGF5b3V0R3JhcGguZ3JhcGgoKS53aWR0aDsKaW5wdXRHcmFwaC5ncmFwaCgpLmhlaWdodD1sYXlvdXRHcmFwaC5ncmFwaCgpLmhlaWdodH12YXIgZ3JhcGhOdW1BdHRycz1bIm5vZGVzZXAiLCJlZGdlc2VwIiwicmFua3NlcCIsIm1hcmdpbngiLCJtYXJnaW55Il0sZ3JhcGhEZWZhdWx0cz17cmFua3NlcDo1MCxlZGdlc2VwOjIwLG5vZGVzZXA6NTAscmFua2RpcjoidGIifSxncmFwaEF0dHJzPVsiYWN5Y2xpY2VyIiwicmFua2VyIiwicmFua2RpciIsImFsaWduIl0sbm9kZU51bUF0dHJzPVsid2lkdGgiLCJoZWlnaHQiXSxub2RlRGVmYXVsdHM9e3dpZHRoOjAsaGVpZ2h0OjB9LGVkZ2VOdW1BdHRycz1bIm1pbmxlbiIsIndlaWdodCIsIndpZHRoIiwiaGVpZ2h0IiwibGFiZWxvZmZzZXQiXSxlZGdlRGVmYXVsdHM9e21pbmxlbjoxLHdlaWdodDoxLHdpZHRoOjAsaGVpZ2h0OjAsbGFiZWxvZmZzZXQ6MTAsbGFiZWxwb3M6InIifSxlZGdlQXR0cnM9WyJsYWJlbHBvcyJdO2Z1bmN0aW9uIGJ1aWxkTGF5b3V0R3JhcGgoaW5wdXRHcmFwaCl7dmFyIGc9Cm5ldyBHcmFwaCh7bXVsdGlncmFwaDp0cnVlLGNvbXBvdW5kOnRydWV9KSxncmFwaD1jYW5vbmljYWxpemUoaW5wdXRHcmFwaC5ncmFwaCgpKTtnLnNldEdyYXBoKF8ubWVyZ2Uoe30sZ3JhcGhEZWZhdWx0cyxzZWxlY3ROdW1iZXJBdHRycyhncmFwaCxncmFwaE51bUF0dHJzKSxfLnBpY2soZ3JhcGgsZ3JhcGhBdHRycykpKTtfLmZvckVhY2goaW5wdXRHcmFwaC5ub2RlcygpLGZ1bmN0aW9uKHYpe3ZhciBub2RlPWNhbm9uaWNhbGl6ZShpbnB1dEdyYXBoLm5vZGUodikpO2cuc2V0Tm9kZSh2LF8uZGVmYXVsdHMoc2VsZWN0TnVtYmVyQXR0cnMobm9kZSxub2RlTnVtQXR0cnMpLG5vZGVEZWZhdWx0cykpO2cuc2V0UGFyZW50KHYsaW5wdXRHcmFwaC5wYXJlbnQodikpfSk7Xy5mb3JFYWNoKGlucHV0R3JhcGguZWRnZXMoKSxmdW5jdGlvbihlKXt2YXIgZWRnZT1jYW5vbmljYWxpemUoaW5wdXRHcmFwaC5lZGdlKGUpKTtnLnNldEVkZ2UoZSxfLm1lcmdlKHt9LGVkZ2VEZWZhdWx0cyxzZWxlY3ROdW1iZXJBdHRycyhlZGdlLAplZGdlTnVtQXR0cnMpLF8ucGljayhlZGdlLGVkZ2VBdHRycykpKX0pO3JldHVybiBnfWZ1bmN0aW9uIG1ha2VTcGFjZUZvckVkZ2VMYWJlbHMoZyl7dmFyIGdyYXBoPWcuZ3JhcGgoKTtncmFwaC5yYW5rc2VwLz0yO18uZm9yRWFjaChnLmVkZ2VzKCksZnVuY3Rpb24oZSl7dmFyIGVkZ2U9Zy5lZGdlKGUpO2VkZ2UubWlubGVuKj0yO2lmKGVkZ2UubGFiZWxwb3MudG9Mb3dlckNhc2UoKSE9PSJjIilpZihncmFwaC5yYW5rZGlyPT09IlRCInx8Z3JhcGgucmFua2Rpcj09PSJCVCIpZWRnZS53aWR0aCs9ZWRnZS5sYWJlbG9mZnNldDtlbHNlIGVkZ2UuaGVpZ2h0Kz1lZGdlLmxhYmVsb2Zmc2V0fSl9ZnVuY3Rpb24gaW5qZWN0RWRnZUxhYmVsUHJveGllcyhnKXtfLmZvckVhY2goZy5lZGdlcygpLGZ1bmN0aW9uKGUpe3ZhciBlZGdlPWcuZWRnZShlKTtpZihlZGdlLndpZHRoJiZlZGdlLmhlaWdodCl7dmFyIHY9Zy5ub2RlKGUudiksdz1nLm5vZGUoZS53KSxsYWJlbD17cmFuazoody5yYW5rLQp2LnJhbmspLzIrdi5yYW5rLGU6ZX07dXRpbC5hZGREdW1teU5vZGUoZywiZWRnZS1wcm94eSIsbGFiZWwsIl9lcCIpfX0pfWZ1bmN0aW9uIGFzc2lnblJhbmtNaW5NYXgoZyl7dmFyIG1heFJhbms9MDtfLmZvckVhY2goZy5ub2RlcygpLGZ1bmN0aW9uKHYpe3ZhciBub2RlPWcubm9kZSh2KTtpZihub2RlLmJvcmRlclRvcCl7bm9kZS5taW5SYW5rPWcubm9kZShub2RlLmJvcmRlclRvcCkucmFuaztub2RlLm1heFJhbms9Zy5ub2RlKG5vZGUuYm9yZGVyQm90dG9tKS5yYW5rO21heFJhbms9Xy5tYXgobWF4UmFuayxub2RlLm1heFJhbmspfX0pO2cuZ3JhcGgoKS5tYXhSYW5rPW1heFJhbmt9ZnVuY3Rpb24gcmVtb3ZlRWRnZUxhYmVsUHJveGllcyhnKXtfLmZvckVhY2goZy5ub2RlcygpLGZ1bmN0aW9uKHYpe3ZhciBub2RlPWcubm9kZSh2KTtpZihub2RlLmR1bW15PT09ImVkZ2UtcHJveHkiKXtnLmVkZ2Uobm9kZS5lKS5sYWJlbFJhbms9bm9kZS5yYW5rO2cucmVtb3ZlTm9kZSh2KX19KX0KZnVuY3Rpb24gdHJhbnNsYXRlR3JhcGgoZyl7dmFyIG1pblg9TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLG1heFg9MCxtaW5ZPU51bWJlci5QT1NJVElWRV9JTkZJTklUWSxtYXhZPTAsZ3JhcGhMYWJlbD1nLmdyYXBoKCksbWFyZ2luWD1ncmFwaExhYmVsLm1hcmdpbnh8fDAsbWFyZ2luWT1ncmFwaExhYmVsLm1hcmdpbnl8fDA7ZnVuY3Rpb24gZ2V0RXh0cmVtZXMoYXR0cnMpe3ZhciB4PWF0dHJzLngseT1hdHRycy55LHc9YXR0cnMud2lkdGgsaD1hdHRycy5oZWlnaHQ7bWluWD1NYXRoLm1pbihtaW5YLHgtdy8yKTttYXhYPU1hdGgubWF4KG1heFgseCt3LzIpO21pblk9TWF0aC5taW4obWluWSx5LWgvMik7bWF4WT1NYXRoLm1heChtYXhZLHkraC8yKX1fLmZvckVhY2goZy5ub2RlcygpLGZ1bmN0aW9uKHYpe2dldEV4dHJlbWVzKGcubm9kZSh2KSl9KTtfLmZvckVhY2goZy5lZGdlcygpLGZ1bmN0aW9uKGUpe3ZhciBlZGdlPWcuZWRnZShlKTtpZihfLmhhcyhlZGdlLCJ4IikpZ2V0RXh0cmVtZXMoZWRnZSl9KTsKbWluWC09bWFyZ2luWDttaW5ZLT1tYXJnaW5ZO18uZm9yRWFjaChnLm5vZGVzKCksZnVuY3Rpb24odil7dmFyIG5vZGU9Zy5ub2RlKHYpO25vZGUueC09bWluWDtub2RlLnktPW1pbll9KTtfLmZvckVhY2goZy5lZGdlcygpLGZ1bmN0aW9uKGUpe3ZhciBlZGdlPWcuZWRnZShlKTtfLmZvckVhY2goZWRnZS5wb2ludHMsZnVuY3Rpb24ocCl7cC54LT1taW5YO3AueS09bWluWX0pO2lmKF8uaGFzKGVkZ2UsIngiKSllZGdlLngtPW1pblg7aWYoXy5oYXMoZWRnZSwieSIpKWVkZ2UueS09bWluWX0pO2dyYXBoTGFiZWwud2lkdGg9bWF4WC1taW5YK21hcmdpblg7Z3JhcGhMYWJlbC5oZWlnaHQ9bWF4WS1taW5ZK21hcmdpbll9ZnVuY3Rpb24gYXNzaWduTm9kZUludGVyc2VjdHMoZyl7Xy5mb3JFYWNoKGcuZWRnZXMoKSxmdW5jdGlvbihlKXt2YXIgZWRnZT1nLmVkZ2UoZSksbm9kZVY9Zy5ub2RlKGUudiksbm9kZVc9Zy5ub2RlKGUudykscDEscDI7aWYoIWVkZ2UucG9pbnRzKXtlZGdlLnBvaW50cz0KW107cDE9bm9kZVc7cDI9bm9kZVZ9ZWxzZXtwMT1lZGdlLnBvaW50c1swXTtwMj1lZGdlLnBvaW50c1tlZGdlLnBvaW50cy5sZW5ndGgtMV19ZWRnZS5wb2ludHMudW5zaGlmdCh1dGlsLmludGVyc2VjdFJlY3Qobm9kZVYscDEpKTtlZGdlLnBvaW50cy5wdXNoKHV0aWwuaW50ZXJzZWN0UmVjdChub2RlVyxwMikpfSl9ZnVuY3Rpb24gZml4dXBFZGdlTGFiZWxDb29yZHMoZyl7Xy5mb3JFYWNoKGcuZWRnZXMoKSxmdW5jdGlvbihlKXt2YXIgZWRnZT1nLmVkZ2UoZSk7aWYoXy5oYXMoZWRnZSwieCIpKXtpZihlZGdlLmxhYmVscG9zPT09ImwifHxlZGdlLmxhYmVscG9zPT09InIiKWVkZ2Uud2lkdGgtPWVkZ2UubGFiZWxvZmZzZXQ7c3dpdGNoKGVkZ2UubGFiZWxwb3Mpe2Nhc2UgImwiOmVkZ2UueC09ZWRnZS53aWR0aC8yK2VkZ2UubGFiZWxvZmZzZXQ7YnJlYWs7Y2FzZSAiciI6ZWRnZS54Kz1lZGdlLndpZHRoLzIrZWRnZS5sYWJlbG9mZnNldDticmVha319fSl9ZnVuY3Rpb24gcmV2ZXJzZVBvaW50c0ZvclJldmVyc2VkRWRnZXMoZyl7Xy5mb3JFYWNoKGcuZWRnZXMoKSwKZnVuY3Rpb24oZSl7dmFyIGVkZ2U9Zy5lZGdlKGUpO2lmKGVkZ2UucmV2ZXJzZWQpZWRnZS5wb2ludHMucmV2ZXJzZSgpfSl9ZnVuY3Rpb24gcmVtb3ZlQm9yZGVyTm9kZXMoZyl7Xy5mb3JFYWNoKGcubm9kZXMoKSxmdW5jdGlvbih2KXtpZihnLmNoaWxkcmVuKHYpLmxlbmd0aCl7dmFyIG5vZGU9Zy5ub2RlKHYpLHQ9Zy5ub2RlKG5vZGUuYm9yZGVyVG9wKSxiPWcubm9kZShub2RlLmJvcmRlckJvdHRvbSksbD1nLm5vZGUoXy5sYXN0KG5vZGUuYm9yZGVyTGVmdCkpLHI9Zy5ub2RlKF8ubGFzdChub2RlLmJvcmRlclJpZ2h0KSk7bm9kZS53aWR0aD1NYXRoLmFicyhyLngtbC54KTtub2RlLmhlaWdodD1NYXRoLmFicyhiLnktdC55KTtub2RlLng9bC54K25vZGUud2lkdGgvMjtub2RlLnk9dC55K25vZGUuaGVpZ2h0LzJ9fSk7Xy5mb3JFYWNoKGcubm9kZXMoKSxmdW5jdGlvbih2KXtpZihnLm5vZGUodikuZHVtbXk9PT0iYm9yZGVyIilnLnJlbW92ZU5vZGUodil9KX1mdW5jdGlvbiByZW1vdmVTZWxmRWRnZXMoZyl7Xy5mb3JFYWNoKGcuZWRnZXMoKSwKZnVuY3Rpb24oZSl7aWYoZS52PT09ZS53KXt2YXIgbm9kZT1nLm5vZGUoZS52KTtpZighbm9kZS5zZWxmRWRnZXMpbm9kZS5zZWxmRWRnZXM9W107bm9kZS5zZWxmRWRnZXMucHVzaCh7ZTplLGxhYmVsOmcuZWRnZShlKX0pO2cucmVtb3ZlRWRnZShlKX19KX1mdW5jdGlvbiBpbnNlcnRTZWxmRWRnZXMoZyl7dmFyIGxheWVycz11dGlsLmJ1aWxkTGF5ZXJNYXRyaXgoZyk7Xy5mb3JFYWNoKGxheWVycyxmdW5jdGlvbihsYXllcil7dmFyIG9yZGVyU2hpZnQ9MDtfLmZvckVhY2gobGF5ZXIsZnVuY3Rpb24odixpKXt2YXIgbm9kZT1nLm5vZGUodik7bm9kZS5vcmRlcj1pK29yZGVyU2hpZnQ7Xy5mb3JFYWNoKG5vZGUuc2VsZkVkZ2VzLGZ1bmN0aW9uKHNlbGZFZGdlKXt1dGlsLmFkZER1bW15Tm9kZShnLCJzZWxmZWRnZSIse3dpZHRoOnNlbGZFZGdlLmxhYmVsLndpZHRoLGhlaWdodDpzZWxmRWRnZS5sYWJlbC5oZWlnaHQscmFuazpub2RlLnJhbmssb3JkZXI6aSsgKytvcmRlclNoaWZ0LAplOnNlbGZFZGdlLmUsbGFiZWw6c2VsZkVkZ2UubGFiZWx9LCJfc2UiKX0pO2RlbGV0ZSBub2RlLnNlbGZFZGdlc30pfSl9ZnVuY3Rpb24gcG9zaXRpb25TZWxmRWRnZXMoZyl7Xy5mb3JFYWNoKGcubm9kZXMoKSxmdW5jdGlvbih2KXt2YXIgbm9kZT1nLm5vZGUodik7aWYobm9kZS5kdW1teT09PSJzZWxmZWRnZSIpe3ZhciBzZWxmTm9kZT1nLm5vZGUobm9kZS5lLnYpLHg9c2VsZk5vZGUueCtzZWxmTm9kZS53aWR0aC8yLHk9c2VsZk5vZGUueSxkeD1ub2RlLngteCxkeT1zZWxmTm9kZS5oZWlnaHQvMjtnLnNldEVkZ2Uobm9kZS5lLG5vZGUubGFiZWwpO2cucmVtb3ZlTm9kZSh2KTtub2RlLmxhYmVsLnBvaW50cz1be3g6eCsyKmR4LzMseTp5LWR5fSx7eDp4KzUqZHgvNix5OnktZHl9LHt4OngrZHgseTp5fSx7eDp4KzUqZHgvNix5OnkrZHl9LHt4OngrMipkeC8zLHk6eStkeX1dO25vZGUubGFiZWwueD1ub2RlLng7bm9kZS5sYWJlbC55PW5vZGUueX19KX1mdW5jdGlvbiBzZWxlY3ROdW1iZXJBdHRycyhvYmosCmF0dHJzKXtyZXR1cm4gXy5tYXBWYWx1ZXMoXy5waWNrKG9iaixhdHRycyksTnVtYmVyKX1mdW5jdGlvbiBjYW5vbmljYWxpemUoYXR0cnMpe3ZhciBuZXdBdHRycz17fTtfLmZvckVhY2goYXR0cnMsZnVuY3Rpb24odixrKXtuZXdBdHRyc1trLnRvTG93ZXJDYXNlKCldPXZ9KTtyZXR1cm4gbmV3QXR0cnN9fSx7Ii4vYWN5Y2xpYyI6MiwiLi9hZGQtYm9yZGVyLXNlZ21lbnRzIjozLCIuL2Nvb3JkaW5hdGUtc3lzdGVtIjo0LCIuL2dyYXBobGliIjo3LCIuL2xvZGFzaCI6MTAsIi4vbmVzdGluZy1ncmFwaCI6MTEsIi4vbm9ybWFsaXplIjoxMiwiLi9vcmRlciI6MTcsIi4vcGFyZW50LWR1bW15LWNoYWlucyI6MjIsIi4vcG9zaXRpb24iOjI0LCIuL3JhbmsiOjI2LCIuL3V0aWwiOjI5fV0sMTA6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBsb2Rhc2g7aWYodHlwZW9mIHJlcXVpcmU9PT0iZnVuY3Rpb24iKXRyeXtsb2Rhc2g9cmVxdWlyZSgibG9kYXNoIil9Y2F0Y2goZSl7fWlmKCFsb2Rhc2gpbG9kYXNoPQp3aW5kb3cuXzttb2R1bGUuZXhwb3J0cz1sb2Rhc2h9LHsibG9kYXNoIjp1bmRlZmluZWR9XSwxMTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi9sb2Rhc2giKSx1dGlsPXJlcXVpcmUoIi4vdXRpbCIpO21vZHVsZS5leHBvcnRzPXtydW46cnVuLGNsZWFudXA6Y2xlYW51cH07ZnVuY3Rpb24gcnVuKGcpe3ZhciByb290PXV0aWwuYWRkRHVtbXlOb2RlKGcsInJvb3QiLHt9LCJfcm9vdCIpO3ZhciBkZXB0aHM9dHJlZURlcHRocyhnKTt2YXIgaGVpZ2h0PV8ubWF4KF8udmFsdWVzKGRlcHRocykpLTE7dmFyIG5vZGVTZXA9MipoZWlnaHQrMTtnLmdyYXBoKCkubmVzdGluZ1Jvb3Q9cm9vdDtfLmZvckVhY2goZy5lZGdlcygpLGZ1bmN0aW9uKGUpe2cuZWRnZShlKS5taW5sZW4qPW5vZGVTZXB9KTt2YXIgd2VpZ2h0PXN1bVdlaWdodHMoZykrMTtfLmZvckVhY2goZy5jaGlsZHJlbigpLGZ1bmN0aW9uKGNoaWxkKXtkZnMoZyxyb290LG5vZGVTZXAsCndlaWdodCxoZWlnaHQsZGVwdGhzLGNoaWxkKX0pO2cuZ3JhcGgoKS5ub2RlUmFua0ZhY3Rvcj1ub2RlU2VwfWZ1bmN0aW9uIGRmcyhnLHJvb3Qsbm9kZVNlcCx3ZWlnaHQsaGVpZ2h0LGRlcHRocyx2KXt2YXIgY2hpbGRyZW49Zy5jaGlsZHJlbih2KTtpZighY2hpbGRyZW4ubGVuZ3RoKXtpZih2IT09cm9vdClnLnNldEVkZ2Uocm9vdCx2LHt3ZWlnaHQ6MCxtaW5sZW46bm9kZVNlcH0pO3JldHVybn12YXIgdG9wPXV0aWwuYWRkQm9yZGVyTm9kZShnLCJfYnQiKSxib3R0b209dXRpbC5hZGRCb3JkZXJOb2RlKGcsIl9iYiIpLGxhYmVsPWcubm9kZSh2KTtnLnNldFBhcmVudCh0b3Asdik7bGFiZWwuYm9yZGVyVG9wPXRvcDtnLnNldFBhcmVudChib3R0b20sdik7bGFiZWwuYm9yZGVyQm90dG9tPWJvdHRvbTtfLmZvckVhY2goY2hpbGRyZW4sZnVuY3Rpb24oY2hpbGQpe2RmcyhnLHJvb3Qsbm9kZVNlcCx3ZWlnaHQsaGVpZ2h0LGRlcHRocyxjaGlsZCk7dmFyIGNoaWxkTm9kZT1nLm5vZGUoY2hpbGQpLApjaGlsZFRvcD1jaGlsZE5vZGUuYm9yZGVyVG9wP2NoaWxkTm9kZS5ib3JkZXJUb3A6Y2hpbGQsY2hpbGRCb3R0b209Y2hpbGROb2RlLmJvcmRlckJvdHRvbT9jaGlsZE5vZGUuYm9yZGVyQm90dG9tOmNoaWxkLHRoaXNXZWlnaHQ9Y2hpbGROb2RlLmJvcmRlclRvcD93ZWlnaHQ6Mip3ZWlnaHQsbWlubGVuPWNoaWxkVG9wIT09Y2hpbGRCb3R0b20/MTpoZWlnaHQtZGVwdGhzW3ZdKzE7Zy5zZXRFZGdlKHRvcCxjaGlsZFRvcCx7d2VpZ2h0OnRoaXNXZWlnaHQsbWlubGVuOm1pbmxlbixuZXN0aW5nRWRnZTp0cnVlfSk7Zy5zZXRFZGdlKGNoaWxkQm90dG9tLGJvdHRvbSx7d2VpZ2h0OnRoaXNXZWlnaHQsbWlubGVuOm1pbmxlbixuZXN0aW5nRWRnZTp0cnVlfSl9KTtpZighZy5wYXJlbnQodikpZy5zZXRFZGdlKHJvb3QsdG9wLHt3ZWlnaHQ6MCxtaW5sZW46aGVpZ2h0K2RlcHRoc1t2XX0pfWZ1bmN0aW9uIHRyZWVEZXB0aHMoZyl7dmFyIGRlcHRocz17fTtmdW5jdGlvbiBkZnModixkZXB0aCl7dmFyIGNoaWxkcmVuPQpnLmNoaWxkcmVuKHYpO2lmKGNoaWxkcmVuJiZjaGlsZHJlbi5sZW5ndGgpXy5mb3JFYWNoKGNoaWxkcmVuLGZ1bmN0aW9uKGNoaWxkKXtkZnMoY2hpbGQsZGVwdGgrMSl9KTtkZXB0aHNbdl09ZGVwdGh9Xy5mb3JFYWNoKGcuY2hpbGRyZW4oKSxmdW5jdGlvbih2KXtkZnModiwxKX0pO3JldHVybiBkZXB0aHN9ZnVuY3Rpb24gc3VtV2VpZ2h0cyhnKXtyZXR1cm4gXy5yZWR1Y2UoZy5lZGdlcygpLGZ1bmN0aW9uKGFjYyxlKXtyZXR1cm4gYWNjK2cuZWRnZShlKS53ZWlnaHR9LDApfWZ1bmN0aW9uIGNsZWFudXAoZyl7dmFyIGdyYXBoTGFiZWw9Zy5ncmFwaCgpO2cucmVtb3ZlTm9kZShncmFwaExhYmVsLm5lc3RpbmdSb290KTtkZWxldGUgZ3JhcGhMYWJlbC5uZXN0aW5nUm9vdDtfLmZvckVhY2goZy5lZGdlcygpLGZ1bmN0aW9uKGUpe3ZhciBlZGdlPWcuZWRnZShlKTtpZihlZGdlLm5lc3RpbmdFZGdlKWcucmVtb3ZlRWRnZShlKX0pfX0seyIuL2xvZGFzaCI6MTAsIi4vdXRpbCI6Mjl9XSwKMTI6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBfPXJlcXVpcmUoIi4vbG9kYXNoIiksdXRpbD1yZXF1aXJlKCIuL3V0aWwiKTttb2R1bGUuZXhwb3J0cz17cnVuOnJ1bix1bmRvOnVuZG99O2Z1bmN0aW9uIHJ1bihnKXtnLmdyYXBoKCkuZHVtbXlDaGFpbnM9W107Xy5mb3JFYWNoKGcuZWRnZXMoKSxmdW5jdGlvbihlZGdlKXtub3JtYWxpemVFZGdlKGcsZWRnZSl9KX1mdW5jdGlvbiBub3JtYWxpemVFZGdlKGcsZSl7dmFyIHY9ZS52LHZSYW5rPWcubm9kZSh2KS5yYW5rLHc9ZS53LHdSYW5rPWcubm9kZSh3KS5yYW5rLG5hbWU9ZS5uYW1lLGVkZ2VMYWJlbD1nLmVkZ2UoZSksbGFiZWxSYW5rPWVkZ2VMYWJlbC5sYWJlbFJhbms7aWYod1Jhbms9PT12UmFuaysxKXJldHVybjtnLnJlbW92ZUVkZ2UoZSk7dmFyIGR1bW15LGF0dHJzLGk7Zm9yKGk9MCwrK3ZSYW5rO3ZSYW5rPHdSYW5rOysraSwrK3ZSYW5rKXtlZGdlTGFiZWwucG9pbnRzPVtdO2F0dHJzPXt3aWR0aDowLApoZWlnaHQ6MCxlZGdlTGFiZWw6ZWRnZUxhYmVsLGVkZ2VPYmo6ZSxyYW5rOnZSYW5rfTtkdW1teT11dGlsLmFkZER1bW15Tm9kZShnLCJlZGdlIixhdHRycywiX2QiKTtpZih2UmFuaz09PWxhYmVsUmFuayl7YXR0cnMud2lkdGg9ZWRnZUxhYmVsLndpZHRoO2F0dHJzLmhlaWdodD1lZGdlTGFiZWwuaGVpZ2h0O2F0dHJzLmR1bW15PSJlZGdlLWxhYmVsIjthdHRycy5sYWJlbHBvcz1lZGdlTGFiZWwubGFiZWxwb3N9Zy5zZXRFZGdlKHYsZHVtbXkse3dlaWdodDplZGdlTGFiZWwud2VpZ2h0fSxuYW1lKTtpZihpPT09MClnLmdyYXBoKCkuZHVtbXlDaGFpbnMucHVzaChkdW1teSk7dj1kdW1teX1nLnNldEVkZ2Uodix3LHt3ZWlnaHQ6ZWRnZUxhYmVsLndlaWdodH0sbmFtZSl9ZnVuY3Rpb24gdW5kbyhnKXtfLmZvckVhY2goZy5ncmFwaCgpLmR1bW15Q2hhaW5zLGZ1bmN0aW9uKHYpe3ZhciBub2RlPWcubm9kZSh2KSxvcmlnTGFiZWw9bm9kZS5lZGdlTGFiZWwsdztnLnNldEVkZ2Uobm9kZS5lZGdlT2JqLApvcmlnTGFiZWwpO3doaWxlKG5vZGUuZHVtbXkpe3c9Zy5zdWNjZXNzb3JzKHYpWzBdO2cucmVtb3ZlTm9kZSh2KTtvcmlnTGFiZWwucG9pbnRzLnB1c2goe3g6bm9kZS54LHk6bm9kZS55fSk7aWYobm9kZS5kdW1teT09PSJlZGdlLWxhYmVsIil7b3JpZ0xhYmVsLng9bm9kZS54O29yaWdMYWJlbC55PW5vZGUueTtvcmlnTGFiZWwud2lkdGg9bm9kZS53aWR0aDtvcmlnTGFiZWwuaGVpZ2h0PW5vZGUuaGVpZ2h0fXY9dztub2RlPWcubm9kZSh2KX19KX19LHsiLi9sb2Rhc2giOjEwLCIuL3V0aWwiOjI5fV0sMTM6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBfPXJlcXVpcmUoIi4uL2xvZGFzaCIpO21vZHVsZS5leHBvcnRzPWFkZFN1YmdyYXBoQ29uc3RyYWludHM7ZnVuY3Rpb24gYWRkU3ViZ3JhcGhDb25zdHJhaW50cyhnLGNnLHZzKXt2YXIgcHJldj17fSxyb290UHJldjtfLmZvckVhY2godnMsZnVuY3Rpb24odil7dmFyIGNoaWxkPWcucGFyZW50KHYpLHBhcmVudCwKcHJldkNoaWxkO3doaWxlKGNoaWxkKXtwYXJlbnQ9Zy5wYXJlbnQoY2hpbGQpO2lmKHBhcmVudCl7cHJldkNoaWxkPXByZXZbcGFyZW50XTtwcmV2W3BhcmVudF09Y2hpbGR9ZWxzZXtwcmV2Q2hpbGQ9cm9vdFByZXY7cm9vdFByZXY9Y2hpbGR9aWYocHJldkNoaWxkJiZwcmV2Q2hpbGQhPT1jaGlsZCl7Y2cuc2V0RWRnZShwcmV2Q2hpbGQsY2hpbGQpO3JldHVybn1jaGlsZD1wYXJlbnR9fSl9fSx7Ii4uL2xvZGFzaCI6MTB9XSwxNDpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi4vbG9kYXNoIik7bW9kdWxlLmV4cG9ydHM9YmFyeWNlbnRlcjtmdW5jdGlvbiBiYXJ5Y2VudGVyKGcsbW92YWJsZSl7cmV0dXJuIF8ubWFwKG1vdmFibGUsZnVuY3Rpb24odil7dmFyIGluVj1nLmluRWRnZXModik7aWYoIWluVi5sZW5ndGgpcmV0dXJue3Y6dn07ZWxzZXt2YXIgcmVzdWx0PV8ucmVkdWNlKGluVixmdW5jdGlvbihhY2MsZSl7dmFyIGVkZ2U9Zy5lZGdlKGUpLApub2RlVT1nLm5vZGUoZS52KTtyZXR1cm57c3VtOmFjYy5zdW0rZWRnZS53ZWlnaHQqbm9kZVUub3JkZXIsd2VpZ2h0OmFjYy53ZWlnaHQrZWRnZS53ZWlnaHR9fSx7c3VtOjAsd2VpZ2h0OjB9KTtyZXR1cm57djp2LGJhcnljZW50ZXI6cmVzdWx0LnN1bS9yZXN1bHQud2VpZ2h0LHdlaWdodDpyZXN1bHQud2VpZ2h0fX19KX19LHsiLi4vbG9kYXNoIjoxMH1dLDE1OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgXz1yZXF1aXJlKCIuLi9sb2Rhc2giKSxHcmFwaD1yZXF1aXJlKCIuLi9ncmFwaGxpYiIpLkdyYXBoO21vZHVsZS5leHBvcnRzPWJ1aWxkTGF5ZXJHcmFwaDtmdW5jdGlvbiBidWlsZExheWVyR3JhcGgoZyxyYW5rLHJlbGF0aW9uc2hpcCl7dmFyIHJvb3Q9Y3JlYXRlUm9vdE5vZGUoZykscmVzdWx0PShuZXcgR3JhcGgoe2NvbXBvdW5kOnRydWV9KSkuc2V0R3JhcGgoe3Jvb3Q6cm9vdH0pLnNldERlZmF1bHROb2RlTGFiZWwoZnVuY3Rpb24odil7cmV0dXJuIGcubm9kZSh2KX0pOwpfLmZvckVhY2goZy5ub2RlcygpLGZ1bmN0aW9uKHYpe3ZhciBub2RlPWcubm9kZSh2KSxwYXJlbnQ9Zy5wYXJlbnQodik7aWYobm9kZS5yYW5rPT09cmFua3x8bm9kZS5taW5SYW5rPD1yYW5rJiZyYW5rPD1ub2RlLm1heFJhbmspe3Jlc3VsdC5zZXROb2RlKHYpO3Jlc3VsdC5zZXRQYXJlbnQodixwYXJlbnR8fHJvb3QpO18uZm9yRWFjaChnW3JlbGF0aW9uc2hpcF0odiksZnVuY3Rpb24oZSl7dmFyIHU9ZS52PT09dj9lLnc6ZS52LGVkZ2U9cmVzdWx0LmVkZ2UodSx2KSx3ZWlnaHQ9IV8uaXNVbmRlZmluZWQoZWRnZSk/ZWRnZS53ZWlnaHQ6MDtyZXN1bHQuc2V0RWRnZSh1LHYse3dlaWdodDpnLmVkZ2UoZSkud2VpZ2h0K3dlaWdodH0pfSk7aWYoXy5oYXMobm9kZSwibWluUmFuayIpKXJlc3VsdC5zZXROb2RlKHYse2JvcmRlckxlZnQ6bm9kZS5ib3JkZXJMZWZ0W3JhbmtdLGJvcmRlclJpZ2h0Om5vZGUuYm9yZGVyUmlnaHRbcmFua119KX19KTtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGNyZWF0ZVJvb3ROb2RlKGcpe3ZhciB2Owp3aGlsZShnLmhhc05vZGUodj1fLnVuaXF1ZUlkKCJfcm9vdCIpKSk7cmV0dXJuIHZ9fSx7Ii4uL2dyYXBobGliIjo3LCIuLi9sb2Rhc2giOjEwfV0sMTY6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBfPXJlcXVpcmUoIi4uL2xvZGFzaCIpO21vZHVsZS5leHBvcnRzPWNyb3NzQ291bnQ7ZnVuY3Rpb24gY3Jvc3NDb3VudChnLGxheWVyaW5nKXt2YXIgY2M9MDtmb3IodmFyIGk9MTtpPGxheWVyaW5nLmxlbmd0aDsrK2kpY2MrPXR3b0xheWVyQ3Jvc3NDb3VudChnLGxheWVyaW5nW2ktMV0sbGF5ZXJpbmdbaV0pO3JldHVybiBjY31mdW5jdGlvbiB0d29MYXllckNyb3NzQ291bnQoZyxub3J0aExheWVyLHNvdXRoTGF5ZXIpe3ZhciBzb3V0aFBvcz1fLnppcE9iamVjdChzb3V0aExheWVyLF8ubWFwKHNvdXRoTGF5ZXIsZnVuY3Rpb24odixpKXtyZXR1cm4gaX0pKTt2YXIgc291dGhFbnRyaWVzPV8uZmxhdHRlbihfLm1hcChub3J0aExheWVyLGZ1bmN0aW9uKHYpe3JldHVybiBfLmNoYWluKGcub3V0RWRnZXModikpLm1hcChmdW5jdGlvbihlKXtyZXR1cm57cG9zOnNvdXRoUG9zW2Uud10sCndlaWdodDpnLmVkZ2UoZSkud2VpZ2h0fX0pLnNvcnRCeSgicG9zIikudmFsdWUoKX0pLHRydWUpO3ZhciBmaXJzdEluZGV4PTE7d2hpbGUoZmlyc3RJbmRleDxzb3V0aExheWVyLmxlbmd0aClmaXJzdEluZGV4PDw9MTt2YXIgdHJlZVNpemU9MipmaXJzdEluZGV4LTE7Zmlyc3RJbmRleC09MTt2YXIgdHJlZT1fLm1hcChuZXcgQXJyYXkodHJlZVNpemUpLGZ1bmN0aW9uKCl7cmV0dXJuIDB9KTt2YXIgY2M9MDtfLmZvckVhY2goc291dGhFbnRyaWVzLmZvckVhY2goZnVuY3Rpb24oZW50cnkpe3ZhciBpbmRleD1lbnRyeS5wb3MrZmlyc3RJbmRleDt0cmVlW2luZGV4XSs9ZW50cnkud2VpZ2h0O3ZhciB3ZWlnaHRTdW09MDt3aGlsZShpbmRleD4wKXtpZihpbmRleCUyKXdlaWdodFN1bSs9dHJlZVtpbmRleCsxXTtpbmRleD1pbmRleC0xPj4xO3RyZWVbaW5kZXhdKz1lbnRyeS53ZWlnaHR9Y2MrPWVudHJ5LndlaWdodCp3ZWlnaHRTdW19KSk7cmV0dXJuIGNjfX0seyIuLi9sb2Rhc2giOjEwfV0sCjE3OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgXz1yZXF1aXJlKCIuLi9sb2Rhc2giKSxpbml0T3JkZXI9cmVxdWlyZSgiLi9pbml0LW9yZGVyIiksY3Jvc3NDb3VudD1yZXF1aXJlKCIuL2Nyb3NzLWNvdW50Iiksc29ydFN1YmdyYXBoPXJlcXVpcmUoIi4vc29ydC1zdWJncmFwaCIpLGJ1aWxkTGF5ZXJHcmFwaD1yZXF1aXJlKCIuL2J1aWxkLWxheWVyLWdyYXBoIiksYWRkU3ViZ3JhcGhDb25zdHJhaW50cz1yZXF1aXJlKCIuL2FkZC1zdWJncmFwaC1jb25zdHJhaW50cyIpLEdyYXBoPXJlcXVpcmUoIi4uL2dyYXBobGliIikuR3JhcGgsdXRpbD1yZXF1aXJlKCIuLi91dGlsIik7bW9kdWxlLmV4cG9ydHM9b3JkZXI7ZnVuY3Rpb24gb3JkZXIoZyl7dmFyIG1heFJhbms9dXRpbC5tYXhSYW5rKGcpLGRvd25MYXllckdyYXBocz1idWlsZExheWVyR3JhcGhzKGcsXy5yYW5nZSgxLG1heFJhbmsrMSksImluRWRnZXMiKSx1cExheWVyR3JhcGhzPWJ1aWxkTGF5ZXJHcmFwaHMoZywKXy5yYW5nZShtYXhSYW5rLTEsLTEsLTEpLCJvdXRFZGdlcyIpO3ZhciBsYXllcmluZz1pbml0T3JkZXIoZyk7YXNzaWduT3JkZXIoZyxsYXllcmluZyk7dmFyIGJlc3RDQz1OdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksYmVzdDtmb3IodmFyIGk9MCxsYXN0QmVzdD0wO2xhc3RCZXN0PDQ7KytpLCsrbGFzdEJlc3Qpe3N3ZWVwTGF5ZXJHcmFwaHMoaSUyP2Rvd25MYXllckdyYXBoczp1cExheWVyR3JhcGhzLGklND49Mik7bGF5ZXJpbmc9dXRpbC5idWlsZExheWVyTWF0cml4KGcpO3ZhciBjYz1jcm9zc0NvdW50KGcsbGF5ZXJpbmcpO2lmKGNjPGJlc3RDQyl7bGFzdEJlc3Q9MDtiZXN0PV8uY2xvbmVEZWVwKGxheWVyaW5nKTtiZXN0Q0M9Y2N9fWFzc2lnbk9yZGVyKGcsYmVzdCl9ZnVuY3Rpb24gYnVpbGRMYXllckdyYXBocyhnLHJhbmtzLHJlbGF0aW9uc2hpcCl7cmV0dXJuIF8ubWFwKHJhbmtzLGZ1bmN0aW9uKHJhbmspe3JldHVybiBidWlsZExheWVyR3JhcGgoZyxyYW5rLHJlbGF0aW9uc2hpcCl9KX0KZnVuY3Rpb24gc3dlZXBMYXllckdyYXBocyhsYXllckdyYXBocyxiaWFzUmlnaHQpe3ZhciBjZz1uZXcgR3JhcGg7Xy5mb3JFYWNoKGxheWVyR3JhcGhzLGZ1bmN0aW9uKGxnKXt2YXIgcm9vdD1sZy5ncmFwaCgpLnJvb3Q7dmFyIHNvcnRlZD1zb3J0U3ViZ3JhcGgobGcscm9vdCxjZyxiaWFzUmlnaHQpO18uZm9yRWFjaChzb3J0ZWQudnMsZnVuY3Rpb24odixpKXtsZy5ub2RlKHYpLm9yZGVyPWl9KTthZGRTdWJncmFwaENvbnN0cmFpbnRzKGxnLGNnLHNvcnRlZC52cyl9KX1mdW5jdGlvbiBhc3NpZ25PcmRlcihnLGxheWVyaW5nKXtfLmZvckVhY2gobGF5ZXJpbmcsZnVuY3Rpb24obGF5ZXIpe18uZm9yRWFjaChsYXllcixmdW5jdGlvbih2LGkpe2cubm9kZSh2KS5vcmRlcj1pfSl9KX19LHsiLi4vZ3JhcGhsaWIiOjcsIi4uL2xvZGFzaCI6MTAsIi4uL3V0aWwiOjI5LCIuL2FkZC1zdWJncmFwaC1jb25zdHJhaW50cyI6MTMsIi4vYnVpbGQtbGF5ZXItZ3JhcGgiOjE1LCIuL2Nyb3NzLWNvdW50IjoxNiwKIi4vaW5pdC1vcmRlciI6MTgsIi4vc29ydC1zdWJncmFwaCI6MjB9XSwxODpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi4vbG9kYXNoIik7bW9kdWxlLmV4cG9ydHM9aW5pdE9yZGVyO2Z1bmN0aW9uIGluaXRPcmRlcihnKXt2YXIgdmlzaXRlZD17fSxzaW1wbGVOb2Rlcz1fLmZpbHRlcihnLm5vZGVzKCksZnVuY3Rpb24odil7cmV0dXJuIWcuY2hpbGRyZW4odikubGVuZ3RofSksbWF4UmFuaz1fLm1heChfLm1hcChzaW1wbGVOb2RlcyxmdW5jdGlvbih2KXtyZXR1cm4gZy5ub2RlKHYpLnJhbmt9KSksbGF5ZXJzPV8ubWFwKF8ucmFuZ2UobWF4UmFuaysxKSxmdW5jdGlvbigpe3JldHVybltdfSk7ZnVuY3Rpb24gZGZzKHYpe2lmKF8uaGFzKHZpc2l0ZWQsdikpcmV0dXJuO3Zpc2l0ZWRbdl09dHJ1ZTt2YXIgbm9kZT1nLm5vZGUodik7bGF5ZXJzW25vZGUucmFua10ucHVzaCh2KTtfLmZvckVhY2goZy5zdWNjZXNzb3JzKHYpLGRmcyl9dmFyIG9yZGVyZWRWcz0KXy5zb3J0Qnkoc2ltcGxlTm9kZXMsZnVuY3Rpb24odil7cmV0dXJuIGcubm9kZSh2KS5yYW5rfSk7Xy5mb3JFYWNoKG9yZGVyZWRWcyxkZnMpO3JldHVybiBsYXllcnN9fSx7Ii4uL2xvZGFzaCI6MTB9XSwxOTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi4vbG9kYXNoIik7bW9kdWxlLmV4cG9ydHM9cmVzb2x2ZUNvbmZsaWN0cztmdW5jdGlvbiByZXNvbHZlQ29uZmxpY3RzKGVudHJpZXMsY2cpe3ZhciBtYXBwZWRFbnRyaWVzPXt9O18uZm9yRWFjaChlbnRyaWVzLGZ1bmN0aW9uKGVudHJ5LGkpe3ZhciB0bXA9bWFwcGVkRW50cmllc1tlbnRyeS52XT17aW5kZWdyZWU6MCwiaW4iOltdLG91dDpbXSx2czpbZW50cnkudl0saTppfTtpZighXy5pc1VuZGVmaW5lZChlbnRyeS5iYXJ5Y2VudGVyKSl7dG1wLmJhcnljZW50ZXI9ZW50cnkuYmFyeWNlbnRlcjt0bXAud2VpZ2h0PWVudHJ5LndlaWdodH19KTtfLmZvckVhY2goY2cuZWRnZXMoKSxmdW5jdGlvbihlKXt2YXIgZW50cnlWPQptYXBwZWRFbnRyaWVzW2Uudl0sZW50cnlXPW1hcHBlZEVudHJpZXNbZS53XTtpZighXy5pc1VuZGVmaW5lZChlbnRyeVYpJiYhXy5pc1VuZGVmaW5lZChlbnRyeVcpKXtlbnRyeVcuaW5kZWdyZWUrKztlbnRyeVYub3V0LnB1c2gobWFwcGVkRW50cmllc1tlLnddKX19KTt2YXIgc291cmNlU2V0PV8uZmlsdGVyKG1hcHBlZEVudHJpZXMsZnVuY3Rpb24oZW50cnkpe3JldHVybiFlbnRyeS5pbmRlZ3JlZX0pO3JldHVybiBkb1Jlc29sdmVDb25mbGljdHMoc291cmNlU2V0KX1mdW5jdGlvbiBkb1Jlc29sdmVDb25mbGljdHMoc291cmNlU2V0KXt2YXIgZW50cmllcz1bXTtmdW5jdGlvbiBoYW5kbGVJbih2RW50cnkpe3JldHVybiBmdW5jdGlvbih1RW50cnkpe2lmKHVFbnRyeS5tZXJnZWQpcmV0dXJuO2lmKF8uaXNVbmRlZmluZWQodUVudHJ5LmJhcnljZW50ZXIpfHxfLmlzVW5kZWZpbmVkKHZFbnRyeS5iYXJ5Y2VudGVyKXx8dUVudHJ5LmJhcnljZW50ZXI+PXZFbnRyeS5iYXJ5Y2VudGVyKW1lcmdlRW50cmllcyh2RW50cnksCnVFbnRyeSl9fWZ1bmN0aW9uIGhhbmRsZU91dCh2RW50cnkpe3JldHVybiBmdW5jdGlvbih3RW50cnkpe3dFbnRyeVsiaW4iXS5wdXNoKHZFbnRyeSk7aWYoLS13RW50cnkuaW5kZWdyZWU9PT0wKXNvdXJjZVNldC5wdXNoKHdFbnRyeSl9fXdoaWxlKHNvdXJjZVNldC5sZW5ndGgpe3ZhciBlbnRyeT1zb3VyY2VTZXQucG9wKCk7ZW50cmllcy5wdXNoKGVudHJ5KTtfLmZvckVhY2goZW50cnlbImluIl0ucmV2ZXJzZSgpLGhhbmRsZUluKGVudHJ5KSk7Xy5mb3JFYWNoKGVudHJ5Lm91dCxoYW5kbGVPdXQoZW50cnkpKX1yZXR1cm4gXy5jaGFpbihlbnRyaWVzKS5maWx0ZXIoZnVuY3Rpb24oZW50cnkpe3JldHVybiFlbnRyeS5tZXJnZWR9KS5tYXAoZnVuY3Rpb24oZW50cnkpe3JldHVybiBfLnBpY2soZW50cnksWyJ2cyIsImkiLCJiYXJ5Y2VudGVyIiwid2VpZ2h0Il0pfSkudmFsdWUoKX1mdW5jdGlvbiBtZXJnZUVudHJpZXModGFyZ2V0LHNvdXJjZSl7dmFyIHN1bT0wLHdlaWdodD0wOwppZih0YXJnZXQud2VpZ2h0KXtzdW0rPXRhcmdldC5iYXJ5Y2VudGVyKnRhcmdldC53ZWlnaHQ7d2VpZ2h0Kz10YXJnZXQud2VpZ2h0fWlmKHNvdXJjZS53ZWlnaHQpe3N1bSs9c291cmNlLmJhcnljZW50ZXIqc291cmNlLndlaWdodDt3ZWlnaHQrPXNvdXJjZS53ZWlnaHR9dGFyZ2V0LnZzPXNvdXJjZS52cy5jb25jYXQodGFyZ2V0LnZzKTt0YXJnZXQuYmFyeWNlbnRlcj1zdW0vd2VpZ2h0O3RhcmdldC53ZWlnaHQ9d2VpZ2h0O3RhcmdldC5pPU1hdGgubWluKHNvdXJjZS5pLHRhcmdldC5pKTtzb3VyY2UubWVyZ2VkPXRydWV9fSx7Ii4uL2xvZGFzaCI6MTB9XSwyMDpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi4vbG9kYXNoIiksYmFyeWNlbnRlcj1yZXF1aXJlKCIuL2JhcnljZW50ZXIiKSxyZXNvbHZlQ29uZmxpY3RzPXJlcXVpcmUoIi4vcmVzb2x2ZS1jb25mbGljdHMiKSxzb3J0PXJlcXVpcmUoIi4vc29ydCIpO21vZHVsZS5leHBvcnRzPQpzb3J0U3ViZ3JhcGg7ZnVuY3Rpb24gc29ydFN1YmdyYXBoKGcsdixjZyxiaWFzUmlnaHQpe3ZhciBtb3ZhYmxlPWcuY2hpbGRyZW4odiksbm9kZT1nLm5vZGUodiksYmw9bm9kZT9ub2RlLmJvcmRlckxlZnQ6dW5kZWZpbmVkLGJyPW5vZGU/bm9kZS5ib3JkZXJSaWdodDp1bmRlZmluZWQsc3ViZ3JhcGhzPXt9O2lmKGJsKW1vdmFibGU9Xy5maWx0ZXIobW92YWJsZSxmdW5jdGlvbih3KXtyZXR1cm4gdyE9PWJsJiZ3IT09YnJ9KTt2YXIgYmFyeWNlbnRlcnM9YmFyeWNlbnRlcihnLG1vdmFibGUpO18uZm9yRWFjaChiYXJ5Y2VudGVycyxmdW5jdGlvbihlbnRyeSl7aWYoZy5jaGlsZHJlbihlbnRyeS52KS5sZW5ndGgpe3ZhciBzdWJncmFwaFJlc3VsdD1zb3J0U3ViZ3JhcGgoZyxlbnRyeS52LGNnLGJpYXNSaWdodCk7c3ViZ3JhcGhzW2VudHJ5LnZdPXN1YmdyYXBoUmVzdWx0O2lmKF8uaGFzKHN1YmdyYXBoUmVzdWx0LCJiYXJ5Y2VudGVyIikpbWVyZ2VCYXJ5Y2VudGVycyhlbnRyeSwKc3ViZ3JhcGhSZXN1bHQpfX0pO3ZhciBlbnRyaWVzPXJlc29sdmVDb25mbGljdHMoYmFyeWNlbnRlcnMsY2cpO2V4cGFuZFN1YmdyYXBocyhlbnRyaWVzLHN1YmdyYXBocyk7dmFyIHJlc3VsdD1zb3J0KGVudHJpZXMsYmlhc1JpZ2h0KTtpZihibCl7cmVzdWx0LnZzPV8uZmxhdHRlbihbYmwscmVzdWx0LnZzLGJyXSx0cnVlKTtpZihnLnByZWRlY2Vzc29ycyhibCkubGVuZ3RoKXt2YXIgYmxQcmVkPWcubm9kZShnLnByZWRlY2Vzc29ycyhibClbMF0pLGJyUHJlZD1nLm5vZGUoZy5wcmVkZWNlc3NvcnMoYnIpWzBdKTtpZighXy5oYXMocmVzdWx0LCJiYXJ5Y2VudGVyIikpe3Jlc3VsdC5iYXJ5Y2VudGVyPTA7cmVzdWx0LndlaWdodD0wfXJlc3VsdC5iYXJ5Y2VudGVyPShyZXN1bHQuYmFyeWNlbnRlcipyZXN1bHQud2VpZ2h0K2JsUHJlZC5vcmRlciticlByZWQub3JkZXIpLyhyZXN1bHQud2VpZ2h0KzIpO3Jlc3VsdC53ZWlnaHQrPTJ9fXJldHVybiByZXN1bHR9ZnVuY3Rpb24gZXhwYW5kU3ViZ3JhcGhzKGVudHJpZXMsCnN1YmdyYXBocyl7Xy5mb3JFYWNoKGVudHJpZXMsZnVuY3Rpb24oZW50cnkpe2VudHJ5LnZzPV8uZmxhdHRlbihlbnRyeS52cy5tYXAoZnVuY3Rpb24odil7aWYoc3ViZ3JhcGhzW3ZdKXJldHVybiBzdWJncmFwaHNbdl0udnM7cmV0dXJuIHZ9KSx0cnVlKX0pfWZ1bmN0aW9uIG1lcmdlQmFyeWNlbnRlcnModGFyZ2V0LG90aGVyKXtpZighXy5pc1VuZGVmaW5lZCh0YXJnZXQuYmFyeWNlbnRlcikpe3RhcmdldC5iYXJ5Y2VudGVyPSh0YXJnZXQuYmFyeWNlbnRlcip0YXJnZXQud2VpZ2h0K290aGVyLmJhcnljZW50ZXIqb3RoZXIud2VpZ2h0KS8odGFyZ2V0LndlaWdodCtvdGhlci53ZWlnaHQpO3RhcmdldC53ZWlnaHQrPW90aGVyLndlaWdodH1lbHNle3RhcmdldC5iYXJ5Y2VudGVyPW90aGVyLmJhcnljZW50ZXI7dGFyZ2V0LndlaWdodD1vdGhlci53ZWlnaHR9fX0seyIuLi9sb2Rhc2giOjEwLCIuL2JhcnljZW50ZXIiOjE0LCIuL3Jlc29sdmUtY29uZmxpY3RzIjoxOSwiLi9zb3J0IjoyMX1dLAoyMTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi4vbG9kYXNoIiksdXRpbD1yZXF1aXJlKCIuLi91dGlsIik7bW9kdWxlLmV4cG9ydHM9c29ydDtmdW5jdGlvbiBzb3J0KGVudHJpZXMsYmlhc1JpZ2h0KXt2YXIgcGFydHM9dXRpbC5wYXJ0aXRpb24oZW50cmllcyxmdW5jdGlvbihlbnRyeSl7cmV0dXJuIF8uaGFzKGVudHJ5LCJiYXJ5Y2VudGVyIil9KTt2YXIgc29ydGFibGU9cGFydHMubGhzLHVuc29ydGFibGU9Xy5zb3J0QnkocGFydHMucmhzLGZ1bmN0aW9uKGVudHJ5KXtyZXR1cm4tZW50cnkuaX0pLHZzPVtdLHN1bT0wLHdlaWdodD0wLHZzSW5kZXg9MDtzb3J0YWJsZS5zb3J0KGNvbXBhcmVXaXRoQmlhcyghIWJpYXNSaWdodCkpO3ZzSW5kZXg9Y29uc3VtZVVuc29ydGFibGUodnMsdW5zb3J0YWJsZSx2c0luZGV4KTtfLmZvckVhY2goc29ydGFibGUsZnVuY3Rpb24oZW50cnkpe3ZzSW5kZXgrPWVudHJ5LnZzLmxlbmd0aDt2cy5wdXNoKGVudHJ5LnZzKTsKc3VtKz1lbnRyeS5iYXJ5Y2VudGVyKmVudHJ5LndlaWdodDt3ZWlnaHQrPWVudHJ5LndlaWdodDt2c0luZGV4PWNvbnN1bWVVbnNvcnRhYmxlKHZzLHVuc29ydGFibGUsdnNJbmRleCl9KTt2YXIgcmVzdWx0PXt2czpfLmZsYXR0ZW4odnMsdHJ1ZSl9O2lmKHdlaWdodCl7cmVzdWx0LmJhcnljZW50ZXI9c3VtL3dlaWdodDtyZXN1bHQud2VpZ2h0PXdlaWdodH1yZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGNvbnN1bWVVbnNvcnRhYmxlKHZzLHVuc29ydGFibGUsaW5kZXgpe3ZhciBsYXN0O3doaWxlKHVuc29ydGFibGUubGVuZ3RoJiYobGFzdD1fLmxhc3QodW5zb3J0YWJsZSkpLmk8PWluZGV4KXt1bnNvcnRhYmxlLnBvcCgpO3ZzLnB1c2gobGFzdC52cyk7aW5kZXgrK31yZXR1cm4gaW5kZXh9ZnVuY3Rpb24gY29tcGFyZVdpdGhCaWFzKGJpYXMpe3JldHVybiBmdW5jdGlvbihlbnRyeVYsZW50cnlXKXtpZihlbnRyeVYuYmFyeWNlbnRlcjxlbnRyeVcuYmFyeWNlbnRlcilyZXR1cm4tMTtlbHNlIGlmKGVudHJ5Vi5iYXJ5Y2VudGVyPgplbnRyeVcuYmFyeWNlbnRlcilyZXR1cm4gMTtyZXR1cm4hYmlhcz9lbnRyeVYuaS1lbnRyeVcuaTplbnRyeVcuaS1lbnRyeVYuaX19fSx7Ii4uL2xvZGFzaCI6MTAsIi4uL3V0aWwiOjI5fV0sMjI6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBfPXJlcXVpcmUoIi4vbG9kYXNoIik7bW9kdWxlLmV4cG9ydHM9cGFyZW50RHVtbXlDaGFpbnM7ZnVuY3Rpb24gcGFyZW50RHVtbXlDaGFpbnMoZyl7dmFyIHBvc3RvcmRlck51bXM9cG9zdG9yZGVyKGcpO18uZm9yRWFjaChnLmdyYXBoKCkuZHVtbXlDaGFpbnMsZnVuY3Rpb24odil7dmFyIG5vZGU9Zy5ub2RlKHYpLGVkZ2VPYmo9bm9kZS5lZGdlT2JqLHBhdGhEYXRhPWZpbmRQYXRoKGcscG9zdG9yZGVyTnVtcyxlZGdlT2JqLnYsZWRnZU9iai53KSxwYXRoPXBhdGhEYXRhLnBhdGgsbGNhPXBhdGhEYXRhLmxjYSxwYXRoSWR4PTAscGF0aFY9cGF0aFtwYXRoSWR4XSxhc2NlbmRpbmc9dHJ1ZTt3aGlsZSh2IT09ZWRnZU9iai53KXtub2RlPQpnLm5vZGUodik7aWYoYXNjZW5kaW5nKXt3aGlsZSgocGF0aFY9cGF0aFtwYXRoSWR4XSkhPT1sY2EmJmcubm9kZShwYXRoVikubWF4UmFuazxub2RlLnJhbmspcGF0aElkeCsrO2lmKHBhdGhWPT09bGNhKWFzY2VuZGluZz1mYWxzZX1pZighYXNjZW5kaW5nKXt3aGlsZShwYXRoSWR4PHBhdGgubGVuZ3RoLTEmJmcubm9kZShwYXRoVj1wYXRoW3BhdGhJZHgrMV0pLm1pblJhbms8PW5vZGUucmFuaylwYXRoSWR4Kys7cGF0aFY9cGF0aFtwYXRoSWR4XX1nLnNldFBhcmVudCh2LHBhdGhWKTt2PWcuc3VjY2Vzc29ycyh2KVswXX19KX1mdW5jdGlvbiBmaW5kUGF0aChnLHBvc3RvcmRlck51bXMsdix3KXt2YXIgdlBhdGg9W10sd1BhdGg9W10sbG93PU1hdGgubWluKHBvc3RvcmRlck51bXNbdl0ubG93LHBvc3RvcmRlck51bXNbd10ubG93KSxsaW09TWF0aC5tYXgocG9zdG9yZGVyTnVtc1t2XS5saW0scG9zdG9yZGVyTnVtc1t3XS5saW0pLHBhcmVudCxsY2E7cGFyZW50PXY7ZG97cGFyZW50PQpnLnBhcmVudChwYXJlbnQpO3ZQYXRoLnB1c2gocGFyZW50KX13aGlsZShwYXJlbnQmJihwb3N0b3JkZXJOdW1zW3BhcmVudF0ubG93Pmxvd3x8bGltPnBvc3RvcmRlck51bXNbcGFyZW50XS5saW0pKTtsY2E9cGFyZW50O3BhcmVudD13O3doaWxlKChwYXJlbnQ9Zy5wYXJlbnQocGFyZW50KSkhPT1sY2Epd1BhdGgucHVzaChwYXJlbnQpO3JldHVybntwYXRoOnZQYXRoLmNvbmNhdCh3UGF0aC5yZXZlcnNlKCkpLGxjYTpsY2F9fWZ1bmN0aW9uIHBvc3RvcmRlcihnKXt2YXIgcmVzdWx0PXt9LGxpbT0wO2Z1bmN0aW9uIGRmcyh2KXt2YXIgbG93PWxpbTtfLmZvckVhY2goZy5jaGlsZHJlbih2KSxkZnMpO3Jlc3VsdFt2XT17bG93OmxvdyxsaW06bGltKyt9fV8uZm9yRWFjaChnLmNoaWxkcmVuKCksZGZzKTtyZXR1cm4gcmVzdWx0fX0seyIuL2xvZGFzaCI6MTB9XSwyMzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi4vbG9kYXNoIiksR3JhcGg9CnJlcXVpcmUoIi4uL2dyYXBobGliIikuR3JhcGgsdXRpbD1yZXF1aXJlKCIuLi91dGlsIik7bW9kdWxlLmV4cG9ydHM9e3Bvc2l0aW9uWDpwb3NpdGlvblgsZmluZFR5cGUxQ29uZmxpY3RzOmZpbmRUeXBlMUNvbmZsaWN0cyxmaW5kVHlwZTJDb25mbGljdHM6ZmluZFR5cGUyQ29uZmxpY3RzLGFkZENvbmZsaWN0OmFkZENvbmZsaWN0LGhhc0NvbmZsaWN0Omhhc0NvbmZsaWN0LHZlcnRpY2FsQWxpZ25tZW50OnZlcnRpY2FsQWxpZ25tZW50LGhvcml6b250YWxDb21wYWN0aW9uOmhvcml6b250YWxDb21wYWN0aW9uLGFsaWduQ29vcmRpbmF0ZXM6YWxpZ25Db29yZGluYXRlcyxmaW5kU21hbGxlc3RXaWR0aEFsaWdubWVudDpmaW5kU21hbGxlc3RXaWR0aEFsaWdubWVudCxiYWxhbmNlOmJhbGFuY2V9O2Z1bmN0aW9uIGZpbmRUeXBlMUNvbmZsaWN0cyhnLGxheWVyaW5nKXt2YXIgY29uZmxpY3RzPXt9O2Z1bmN0aW9uIHZpc2l0TGF5ZXIocHJldkxheWVyLGxheWVyKXt2YXIgazA9MCxzY2FuUG9zPQowLHByZXZMYXllckxlbmd0aD1wcmV2TGF5ZXIubGVuZ3RoLGxhc3ROb2RlPV8ubGFzdChsYXllcik7Xy5mb3JFYWNoKGxheWVyLGZ1bmN0aW9uKHYsaSl7dmFyIHc9ZmluZE90aGVySW5uZXJTZWdtZW50Tm9kZShnLHYpLGsxPXc/Zy5ub2RlKHcpLm9yZGVyOnByZXZMYXllckxlbmd0aDtpZih3fHx2PT09bGFzdE5vZGUpe18uZm9yRWFjaChsYXllci5zbGljZShzY2FuUG9zLGkrMSksZnVuY3Rpb24oc2Nhbk5vZGUpe18uZm9yRWFjaChnLnByZWRlY2Vzc29ycyhzY2FuTm9kZSksZnVuY3Rpb24odSl7dmFyIHVMYWJlbD1nLm5vZGUodSksdVBvcz11TGFiZWwub3JkZXI7aWYoKHVQb3M8azB8fGsxPHVQb3MpJiYhKHVMYWJlbC5kdW1teSYmZy5ub2RlKHNjYW5Ob2RlKS5kdW1teSkpYWRkQ29uZmxpY3QoY29uZmxpY3RzLHUsc2Nhbk5vZGUpfSl9KTtzY2FuUG9zPWkrMTtrMD1rMX19KTtyZXR1cm4gbGF5ZXJ9Xy5yZWR1Y2UobGF5ZXJpbmcsdmlzaXRMYXllcik7cmV0dXJuIGNvbmZsaWN0c30KZnVuY3Rpb24gZmluZFR5cGUyQ29uZmxpY3RzKGcsbGF5ZXJpbmcpe3ZhciBjb25mbGljdHM9e307ZnVuY3Rpb24gc2Nhbihzb3V0aCxzb3V0aFBvcyxzb3V0aEVuZCxwcmV2Tm9ydGhCb3JkZXIsbmV4dE5vcnRoQm9yZGVyKXt2YXIgdjtfLmZvckVhY2goXy5yYW5nZShzb3V0aFBvcyxzb3V0aEVuZCksZnVuY3Rpb24oaSl7dj1zb3V0aFtpXTtpZihnLm5vZGUodikuZHVtbXkpXy5mb3JFYWNoKGcucHJlZGVjZXNzb3JzKHYpLGZ1bmN0aW9uKHUpe3ZhciB1Tm9kZT1nLm5vZGUodSk7aWYodU5vZGUuZHVtbXkmJih1Tm9kZS5vcmRlcjxwcmV2Tm9ydGhCb3JkZXJ8fHVOb2RlLm9yZGVyPm5leHROb3J0aEJvcmRlcikpYWRkQ29uZmxpY3QoY29uZmxpY3RzLHUsdil9KX0pfWZ1bmN0aW9uIHZpc2l0TGF5ZXIobm9ydGgsc291dGgpe3ZhciBwcmV2Tm9ydGhQb3M9LTEsbmV4dE5vcnRoUG9zLHNvdXRoUG9zPTA7Xy5mb3JFYWNoKHNvdXRoLGZ1bmN0aW9uKHYsc291dGhMb29rYWhlYWQpe2lmKGcubm9kZSh2KS5kdW1teT09PQoiYm9yZGVyIil7dmFyIHByZWRlY2Vzc29ycz1nLnByZWRlY2Vzc29ycyh2KTtpZihwcmVkZWNlc3NvcnMubGVuZ3RoKXtuZXh0Tm9ydGhQb3M9Zy5ub2RlKHByZWRlY2Vzc29yc1swXSkub3JkZXI7c2Nhbihzb3V0aCxzb3V0aFBvcyxzb3V0aExvb2thaGVhZCxwcmV2Tm9ydGhQb3MsbmV4dE5vcnRoUG9zKTtzb3V0aFBvcz1zb3V0aExvb2thaGVhZDtwcmV2Tm9ydGhQb3M9bmV4dE5vcnRoUG9zfX1zY2FuKHNvdXRoLHNvdXRoUG9zLHNvdXRoLmxlbmd0aCxuZXh0Tm9ydGhQb3Msbm9ydGgubGVuZ3RoKX0pO3JldHVybiBzb3V0aH1fLnJlZHVjZShsYXllcmluZyx2aXNpdExheWVyKTtyZXR1cm4gY29uZmxpY3RzfWZ1bmN0aW9uIGZpbmRPdGhlcklubmVyU2VnbWVudE5vZGUoZyx2KXtpZihnLm5vZGUodikuZHVtbXkpcmV0dXJuIF8uZmluZChnLnByZWRlY2Vzc29ycyh2KSxmdW5jdGlvbih1KXtyZXR1cm4gZy5ub2RlKHUpLmR1bW15fSl9ZnVuY3Rpb24gYWRkQ29uZmxpY3QoY29uZmxpY3RzLAp2LHcpe2lmKHY+dyl7dmFyIHRtcD12O3Y9dzt3PXRtcH12YXIgY29uZmxpY3RzVj1jb25mbGljdHNbdl07aWYoIWNvbmZsaWN0c1YpY29uZmxpY3RzW3ZdPWNvbmZsaWN0c1Y9e307Y29uZmxpY3RzVlt3XT10cnVlfWZ1bmN0aW9uIGhhc0NvbmZsaWN0KGNvbmZsaWN0cyx2LHcpe2lmKHY+dyl7dmFyIHRtcD12O3Y9dzt3PXRtcH1yZXR1cm4gXy5oYXMoY29uZmxpY3RzW3ZdLHcpfWZ1bmN0aW9uIHZlcnRpY2FsQWxpZ25tZW50KGcsbGF5ZXJpbmcsY29uZmxpY3RzLG5laWdoYm9yRm4pe3ZhciByb290PXt9LGFsaWduPXt9LHBvcz17fTtfLmZvckVhY2gobGF5ZXJpbmcsZnVuY3Rpb24obGF5ZXIpe18uZm9yRWFjaChsYXllcixmdW5jdGlvbih2LG9yZGVyKXtyb290W3ZdPXY7YWxpZ25bdl09djtwb3Nbdl09b3JkZXJ9KX0pO18uZm9yRWFjaChsYXllcmluZyxmdW5jdGlvbihsYXllcil7dmFyIHByZXZJZHg9LTE7Xy5mb3JFYWNoKGxheWVyLGZ1bmN0aW9uKHYpe3ZhciB3cz1uZWlnaGJvckZuKHYpOwppZih3cy5sZW5ndGgpe3dzPV8uc29ydEJ5KHdzLGZ1bmN0aW9uKHcpe3JldHVybiBwb3Nbd119KTt2YXIgbXA9KHdzLmxlbmd0aC0xKS8yO2Zvcih2YXIgaT1NYXRoLmZsb29yKG1wKSxpbD1NYXRoLmNlaWwobXApO2k8PWlsOysraSl7dmFyIHc9d3NbaV07aWYoYWxpZ25bdl09PT12JiZwcmV2SWR4PHBvc1t3XSYmIWhhc0NvbmZsaWN0KGNvbmZsaWN0cyx2LHcpKXthbGlnblt3XT12O2FsaWduW3ZdPXJvb3Rbdl09cm9vdFt3XTtwcmV2SWR4PXBvc1t3XX19fX0pfSk7cmV0dXJue3Jvb3Q6cm9vdCxhbGlnbjphbGlnbn19ZnVuY3Rpb24gaG9yaXpvbnRhbENvbXBhY3Rpb24oZyxsYXllcmluZyxyb290LGFsaWduLHJldmVyc2VTZXApe3ZhciB4cz17fSxibG9ja0c9YnVpbGRCbG9ja0dyYXBoKGcsbGF5ZXJpbmcscm9vdCxyZXZlcnNlU2VwKSxib3JkZXJUeXBlPXJldmVyc2VTZXA/ImJvcmRlckxlZnQiOiJib3JkZXJSaWdodCI7ZnVuY3Rpb24gaXRlcmF0ZShzZXRYc0Z1bmMsbmV4dE5vZGVzRnVuYyl7dmFyIHN0YWNrPQpibG9ja0cubm9kZXMoKTt2YXIgZWxlbT1zdGFjay5wb3AoKTt2YXIgdmlzaXRlZD17fTt3aGlsZShlbGVtKXtpZih2aXNpdGVkW2VsZW1dKXNldFhzRnVuYyhlbGVtKTtlbHNle3Zpc2l0ZWRbZWxlbV09dHJ1ZTtzdGFjay5wdXNoKGVsZW0pO3N0YWNrPXN0YWNrLmNvbmNhdChuZXh0Tm9kZXNGdW5jKGVsZW0pKX1lbGVtPXN0YWNrLnBvcCgpfX1mdW5jdGlvbiBwYXNzMShlbGVtKXt4c1tlbGVtXT1ibG9ja0cuaW5FZGdlcyhlbGVtKS5yZWR1Y2UoZnVuY3Rpb24oYWNjLGUpe3JldHVybiBNYXRoLm1heChhY2MseHNbZS52XStibG9ja0cuZWRnZShlKSl9LDApfWZ1bmN0aW9uIHBhc3MyKGVsZW0pe3ZhciBtaW49YmxvY2tHLm91dEVkZ2VzKGVsZW0pLnJlZHVjZShmdW5jdGlvbihhY2MsZSl7cmV0dXJuIE1hdGgubWluKGFjYyx4c1tlLnddLWJsb2NrRy5lZGdlKGUpKX0sTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKTt2YXIgbm9kZT1nLm5vZGUoZWxlbSk7aWYobWluIT09TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZJiYKbm9kZS5ib3JkZXJUeXBlIT09Ym9yZGVyVHlwZSl4c1tlbGVtXT1NYXRoLm1heCh4c1tlbGVtXSxtaW4pfWl0ZXJhdGUocGFzczEsXy5iaW5kKGJsb2NrRy5wcmVkZWNlc3NvcnMsYmxvY2tHKSk7aXRlcmF0ZShwYXNzMixfLmJpbmQoYmxvY2tHLnN1Y2Nlc3NvcnMsYmxvY2tHKSk7Xy5mb3JFYWNoKGFsaWduLGZ1bmN0aW9uKHYpe3hzW3ZdPXhzW3Jvb3Rbdl1dfSk7cmV0dXJuIHhzfWZ1bmN0aW9uIGJ1aWxkQmxvY2tHcmFwaChnLGxheWVyaW5nLHJvb3QscmV2ZXJzZVNlcCl7dmFyIGJsb2NrR3JhcGg9bmV3IEdyYXBoLGdyYXBoTGFiZWw9Zy5ncmFwaCgpLHNlcEZuPXNlcChncmFwaExhYmVsLm5vZGVzZXAsZ3JhcGhMYWJlbC5lZGdlc2VwLHJldmVyc2VTZXApO18uZm9yRWFjaChsYXllcmluZyxmdW5jdGlvbihsYXllcil7dmFyIHU7Xy5mb3JFYWNoKGxheWVyLGZ1bmN0aW9uKHYpe3ZhciB2Um9vdD1yb290W3ZdO2Jsb2NrR3JhcGguc2V0Tm9kZSh2Um9vdCk7aWYodSl7dmFyIHVSb290PQpyb290W3VdLHByZXZNYXg9YmxvY2tHcmFwaC5lZGdlKHVSb290LHZSb290KTtibG9ja0dyYXBoLnNldEVkZ2UodVJvb3QsdlJvb3QsTWF0aC5tYXgoc2VwRm4oZyx2LHUpLHByZXZNYXh8fDApKX11PXZ9KX0pO3JldHVybiBibG9ja0dyYXBofWZ1bmN0aW9uIGZpbmRTbWFsbGVzdFdpZHRoQWxpZ25tZW50KGcseHNzKXtyZXR1cm4gXy5taW5CeShfLnZhbHVlcyh4c3MpLGZ1bmN0aW9uKHhzKXt2YXIgbWF4PU51bWJlci5ORUdBVElWRV9JTkZJTklUWTt2YXIgbWluPU51bWJlci5QT1NJVElWRV9JTkZJTklUWTtfLmZvckluKHhzLGZ1bmN0aW9uKHgsdil7dmFyIGhhbGZXaWR0aD13aWR0aChnLHYpLzI7bWF4PU1hdGgubWF4KHgraGFsZldpZHRoLG1heCk7bWluPU1hdGgubWluKHgtaGFsZldpZHRoLG1pbil9KTtyZXR1cm4gbWF4LW1pbn0pfWZ1bmN0aW9uIGFsaWduQ29vcmRpbmF0ZXMoeHNzLGFsaWduVG8pe3ZhciBhbGlnblRvVmFscz1fLnZhbHVlcyhhbGlnblRvKSxhbGlnblRvTWluPQpfLm1pbihhbGlnblRvVmFscyksYWxpZ25Ub01heD1fLm1heChhbGlnblRvVmFscyk7Xy5mb3JFYWNoKFsidSIsImQiXSxmdW5jdGlvbih2ZXJ0KXtfLmZvckVhY2goWyJsIiwiciJdLGZ1bmN0aW9uKGhvcml6KXt2YXIgYWxpZ25tZW50PXZlcnQraG9yaXoseHM9eHNzW2FsaWdubWVudF0sZGVsdGE7aWYoeHM9PT1hbGlnblRvKXJldHVybjt2YXIgeHNWYWxzPV8udmFsdWVzKHhzKTtkZWx0YT1ob3Jpej09PSJsIj9hbGlnblRvTWluLV8ubWluKHhzVmFscyk6YWxpZ25Ub01heC1fLm1heCh4c1ZhbHMpO2lmKGRlbHRhKXhzc1thbGlnbm1lbnRdPV8ubWFwVmFsdWVzKHhzLGZ1bmN0aW9uKHgpe3JldHVybiB4K2RlbHRhfSl9KX0pfWZ1bmN0aW9uIGJhbGFuY2UoeHNzLGFsaWduKXtyZXR1cm4gXy5tYXBWYWx1ZXMoeHNzLnVsLGZ1bmN0aW9uKGlnbm9yZSx2KXtpZihhbGlnbilyZXR1cm4geHNzW2FsaWduLnRvTG93ZXJDYXNlKCldW3ZdO2Vsc2V7dmFyIHhzPV8uc29ydEJ5KF8ubWFwKHhzcywKdikpO3JldHVybih4c1sxXSt4c1syXSkvMn19KX1mdW5jdGlvbiBwb3NpdGlvblgoZyl7dmFyIGxheWVyaW5nPXV0aWwuYnVpbGRMYXllck1hdHJpeChnKSxjb25mbGljdHM9Xy5tZXJnZShmaW5kVHlwZTFDb25mbGljdHMoZyxsYXllcmluZyksZmluZFR5cGUyQ29uZmxpY3RzKGcsbGF5ZXJpbmcpKTt2YXIgeHNzPXt9LGFkanVzdGVkTGF5ZXJpbmc7Xy5mb3JFYWNoKFsidSIsImQiXSxmdW5jdGlvbih2ZXJ0KXthZGp1c3RlZExheWVyaW5nPXZlcnQ9PT0idSI/bGF5ZXJpbmc6Xy52YWx1ZXMobGF5ZXJpbmcpLnJldmVyc2UoKTtfLmZvckVhY2goWyJsIiwiciJdLGZ1bmN0aW9uKGhvcml6KXtpZihob3Jpej09PSJyIilhZGp1c3RlZExheWVyaW5nPV8ubWFwKGFkanVzdGVkTGF5ZXJpbmcsZnVuY3Rpb24oaW5uZXIpe3JldHVybiBfLnZhbHVlcyhpbm5lcikucmV2ZXJzZSgpfSk7dmFyIG5laWdoYm9yRm49Xy5iaW5kKHZlcnQ9PT0idSI/Zy5wcmVkZWNlc3NvcnM6Zy5zdWNjZXNzb3JzLApnKTt2YXIgYWxpZ249dmVydGljYWxBbGlnbm1lbnQoZyxhZGp1c3RlZExheWVyaW5nLGNvbmZsaWN0cyxuZWlnaGJvckZuKTt2YXIgeHM9aG9yaXpvbnRhbENvbXBhY3Rpb24oZyxhZGp1c3RlZExheWVyaW5nLGFsaWduLnJvb3QsYWxpZ24uYWxpZ24saG9yaXo9PT0iciIpO2lmKGhvcml6PT09InIiKXhzPV8ubWFwVmFsdWVzKHhzLGZ1bmN0aW9uKHgpe3JldHVybi14fSk7eHNzW3ZlcnQraG9yaXpdPXhzfSl9KTt2YXIgc21hbGxlc3RXaWR0aD1maW5kU21hbGxlc3RXaWR0aEFsaWdubWVudChnLHhzcyk7YWxpZ25Db29yZGluYXRlcyh4c3Msc21hbGxlc3RXaWR0aCk7cmV0dXJuIGJhbGFuY2UoeHNzLGcuZ3JhcGgoKS5hbGlnbil9ZnVuY3Rpb24gc2VwKG5vZGVTZXAsZWRnZVNlcCxyZXZlcnNlU2VwKXtyZXR1cm4gZnVuY3Rpb24oZyx2LHcpe3ZhciB2TGFiZWw9Zy5ub2RlKHYpLHdMYWJlbD1nLm5vZGUodyksc3VtPTAsZGVsdGE7c3VtKz12TGFiZWwud2lkdGgvMjtpZihfLmhhcyh2TGFiZWwsCiJsYWJlbHBvcyIpKXN3aXRjaCh2TGFiZWwubGFiZWxwb3MudG9Mb3dlckNhc2UoKSl7Y2FzZSAibCI6ZGVsdGE9LXZMYWJlbC53aWR0aC8yO2JyZWFrO2Nhc2UgInIiOmRlbHRhPXZMYWJlbC53aWR0aC8yO2JyZWFrfWlmKGRlbHRhKXN1bSs9cmV2ZXJzZVNlcD9kZWx0YTotZGVsdGE7ZGVsdGE9MDtzdW0rPSh2TGFiZWwuZHVtbXk/ZWRnZVNlcDpub2RlU2VwKS8yO3N1bSs9KHdMYWJlbC5kdW1teT9lZGdlU2VwOm5vZGVTZXApLzI7c3VtKz13TGFiZWwud2lkdGgvMjtpZihfLmhhcyh3TGFiZWwsImxhYmVscG9zIikpc3dpdGNoKHdMYWJlbC5sYWJlbHBvcy50b0xvd2VyQ2FzZSgpKXtjYXNlICJsIjpkZWx0YT13TGFiZWwud2lkdGgvMjticmVhaztjYXNlICJyIjpkZWx0YT0td0xhYmVsLndpZHRoLzI7YnJlYWt9aWYoZGVsdGEpc3VtKz1yZXZlcnNlU2VwP2RlbHRhOi1kZWx0YTtkZWx0YT0wO3JldHVybiBzdW19fWZ1bmN0aW9uIHdpZHRoKGcsdil7cmV0dXJuIGcubm9kZSh2KS53aWR0aH0KfSx7Ii4uL2dyYXBobGliIjo3LCIuLi9sb2Rhc2giOjEwLCIuLi91dGlsIjoyOX1dLDI0OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgXz1yZXF1aXJlKCIuLi9sb2Rhc2giKSx1dGlsPXJlcXVpcmUoIi4uL3V0aWwiKSxwb3NpdGlvblg9cmVxdWlyZSgiLi9iayIpLnBvc2l0aW9uWDttb2R1bGUuZXhwb3J0cz1wb3NpdGlvbjtmdW5jdGlvbiBwb3NpdGlvbihnKXtnPXV0aWwuYXNOb25Db21wb3VuZEdyYXBoKGcpO3Bvc2l0aW9uWShnKTtfLmZvckVhY2gocG9zaXRpb25YKGcpLGZ1bmN0aW9uKHgsdil7Zy5ub2RlKHYpLng9eH0pfWZ1bmN0aW9uIHBvc2l0aW9uWShnKXt2YXIgbGF5ZXJpbmc9dXRpbC5idWlsZExheWVyTWF0cml4KGcpLHJhbmtTZXA9Zy5ncmFwaCgpLnJhbmtzZXAscHJldlk9MDtfLmZvckVhY2gobGF5ZXJpbmcsZnVuY3Rpb24obGF5ZXIpe3ZhciBtYXhIZWlnaHQ9Xy5tYXgoXy5tYXAobGF5ZXIsZnVuY3Rpb24odil7cmV0dXJuIGcubm9kZSh2KS5oZWlnaHR9KSk7Cl8uZm9yRWFjaChsYXllcixmdW5jdGlvbih2KXtnLm5vZGUodikueT1wcmV2WSttYXhIZWlnaHQvMn0pO3ByZXZZKz1tYXhIZWlnaHQrcmFua1NlcH0pfX0seyIuLi9sb2Rhc2giOjEwLCIuLi91dGlsIjoyOSwiLi9iayI6MjN9XSwyNTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi4vbG9kYXNoIiksR3JhcGg9cmVxdWlyZSgiLi4vZ3JhcGhsaWIiKS5HcmFwaCxzbGFjaz1yZXF1aXJlKCIuL3V0aWwiKS5zbGFjazttb2R1bGUuZXhwb3J0cz1mZWFzaWJsZVRyZWU7ZnVuY3Rpb24gZmVhc2libGVUcmVlKGcpe3ZhciB0PW5ldyBHcmFwaCh7ZGlyZWN0ZWQ6ZmFsc2V9KTt2YXIgc3RhcnQ9Zy5ub2RlcygpWzBdLHNpemU9Zy5ub2RlQ291bnQoKTt0LnNldE5vZGUoc3RhcnQse30pO3ZhciBlZGdlLGRlbHRhO3doaWxlKHRpZ2h0VHJlZSh0LGcpPHNpemUpe2VkZ2U9ZmluZE1pblNsYWNrRWRnZSh0LGcpO2RlbHRhPXQuaGFzTm9kZShlZGdlLnYpPwpzbGFjayhnLGVkZ2UpOi1zbGFjayhnLGVkZ2UpO3NoaWZ0UmFua3ModCxnLGRlbHRhKX1yZXR1cm4gdH1mdW5jdGlvbiB0aWdodFRyZWUodCxnKXtmdW5jdGlvbiBkZnModil7Xy5mb3JFYWNoKGcubm9kZUVkZ2VzKHYpLGZ1bmN0aW9uKGUpe3ZhciBlZGdlVj1lLnYsdz12PT09ZWRnZVY/ZS53OmVkZ2VWO2lmKCF0Lmhhc05vZGUodykmJiFzbGFjayhnLGUpKXt0LnNldE5vZGUodyx7fSk7dC5zZXRFZGdlKHYsdyx7fSk7ZGZzKHcpfX0pfV8uZm9yRWFjaCh0Lm5vZGVzKCksZGZzKTtyZXR1cm4gdC5ub2RlQ291bnQoKX1mdW5jdGlvbiBmaW5kTWluU2xhY2tFZGdlKHQsZyl7cmV0dXJuIF8ubWluQnkoZy5lZGdlcygpLGZ1bmN0aW9uKGUpe2lmKHQuaGFzTm9kZShlLnYpIT09dC5oYXNOb2RlKGUudykpcmV0dXJuIHNsYWNrKGcsZSl9KX1mdW5jdGlvbiBzaGlmdFJhbmtzKHQsZyxkZWx0YSl7Xy5mb3JFYWNoKHQubm9kZXMoKSxmdW5jdGlvbih2KXtnLm5vZGUodikucmFuays9ZGVsdGF9KX0KfSx7Ii4uL2dyYXBobGliIjo3LCIuLi9sb2Rhc2giOjEwLCIuL3V0aWwiOjI4fV0sMjY6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciByYW5rVXRpbD1yZXF1aXJlKCIuL3V0aWwiKSxsb25nZXN0UGF0aD1yYW5rVXRpbC5sb25nZXN0UGF0aCxmZWFzaWJsZVRyZWU9cmVxdWlyZSgiLi9mZWFzaWJsZS10cmVlIiksbmV0d29ya1NpbXBsZXg9cmVxdWlyZSgiLi9uZXR3b3JrLXNpbXBsZXgiKTttb2R1bGUuZXhwb3J0cz1yYW5rO2Z1bmN0aW9uIHJhbmsoZyl7c3dpdGNoKGcuZ3JhcGgoKS5yYW5rZXIpe2Nhc2UgIm5ldHdvcmstc2ltcGxleCI6bmV0d29ya1NpbXBsZXhSYW5rZXIoZyk7YnJlYWs7Y2FzZSAidGlnaHQtdHJlZSI6dGlnaHRUcmVlUmFua2VyKGcpO2JyZWFrO2Nhc2UgImxvbmdlc3QtcGF0aCI6bG9uZ2VzdFBhdGhSYW5rZXIoZyk7YnJlYWs7ZGVmYXVsdDpuZXR3b3JrU2ltcGxleFJhbmtlcihnKX19dmFyIGxvbmdlc3RQYXRoUmFua2VyPWxvbmdlc3RQYXRoOwpmdW5jdGlvbiB0aWdodFRyZWVSYW5rZXIoZyl7bG9uZ2VzdFBhdGgoZyk7ZmVhc2libGVUcmVlKGcpfWZ1bmN0aW9uIG5ldHdvcmtTaW1wbGV4UmFua2VyKGcpe25ldHdvcmtTaW1wbGV4KGcpfX0seyIuL2ZlYXNpYmxlLXRyZWUiOjI1LCIuL25ldHdvcmstc2ltcGxleCI6MjcsIi4vdXRpbCI6Mjh9XSwyNzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi4vbG9kYXNoIiksZmVhc2libGVUcmVlPXJlcXVpcmUoIi4vZmVhc2libGUtdHJlZSIpLHNsYWNrPXJlcXVpcmUoIi4vdXRpbCIpLnNsYWNrLGluaXRSYW5rPXJlcXVpcmUoIi4vdXRpbCIpLmxvbmdlc3RQYXRoLHByZW9yZGVyPXJlcXVpcmUoIi4uL2dyYXBobGliIikuYWxnLnByZW9yZGVyLHBvc3RvcmRlcj1yZXF1aXJlKCIuLi9ncmFwaGxpYiIpLmFsZy5wb3N0b3JkZXIsc2ltcGxpZnk9cmVxdWlyZSgiLi4vdXRpbCIpLnNpbXBsaWZ5O21vZHVsZS5leHBvcnRzPW5ldHdvcmtTaW1wbGV4OwpuZXR3b3JrU2ltcGxleC5pbml0TG93TGltVmFsdWVzPWluaXRMb3dMaW1WYWx1ZXM7bmV0d29ya1NpbXBsZXguaW5pdEN1dFZhbHVlcz1pbml0Q3V0VmFsdWVzO25ldHdvcmtTaW1wbGV4LmNhbGNDdXRWYWx1ZT1jYWxjQ3V0VmFsdWU7bmV0d29ya1NpbXBsZXgubGVhdmVFZGdlPWxlYXZlRWRnZTtuZXR3b3JrU2ltcGxleC5lbnRlckVkZ2U9ZW50ZXJFZGdlO25ldHdvcmtTaW1wbGV4LmV4Y2hhbmdlRWRnZXM9ZXhjaGFuZ2VFZGdlcztmdW5jdGlvbiBuZXR3b3JrU2ltcGxleChnKXtnPXNpbXBsaWZ5KGcpO2luaXRSYW5rKGcpO3ZhciB0PWZlYXNpYmxlVHJlZShnKTtpbml0TG93TGltVmFsdWVzKHQpO2luaXRDdXRWYWx1ZXModCxnKTt2YXIgZSxmO3doaWxlKGU9bGVhdmVFZGdlKHQpKXtmPWVudGVyRWRnZSh0LGcsZSk7ZXhjaGFuZ2VFZGdlcyh0LGcsZSxmKX19ZnVuY3Rpb24gaW5pdEN1dFZhbHVlcyh0LGcpe3ZhciB2cz1wb3N0b3JkZXIodCx0Lm5vZGVzKCkpO3ZzPXZzLnNsaWNlKDAsCnZzLmxlbmd0aC0xKTtfLmZvckVhY2godnMsZnVuY3Rpb24odil7YXNzaWduQ3V0VmFsdWUodCxnLHYpfSl9ZnVuY3Rpb24gYXNzaWduQ3V0VmFsdWUodCxnLGNoaWxkKXt2YXIgY2hpbGRMYWI9dC5ub2RlKGNoaWxkKSxwYXJlbnQ9Y2hpbGRMYWIucGFyZW50O3QuZWRnZShjaGlsZCxwYXJlbnQpLmN1dHZhbHVlPWNhbGNDdXRWYWx1ZSh0LGcsY2hpbGQpfWZ1bmN0aW9uIGNhbGNDdXRWYWx1ZSh0LGcsY2hpbGQpe3ZhciBjaGlsZExhYj10Lm5vZGUoY2hpbGQpLHBhcmVudD1jaGlsZExhYi5wYXJlbnQsY2hpbGRJc1RhaWw9dHJ1ZSxncmFwaEVkZ2U9Zy5lZGdlKGNoaWxkLHBhcmVudCksY3V0VmFsdWU9MDtpZighZ3JhcGhFZGdlKXtjaGlsZElzVGFpbD1mYWxzZTtncmFwaEVkZ2U9Zy5lZGdlKHBhcmVudCxjaGlsZCl9Y3V0VmFsdWU9Z3JhcGhFZGdlLndlaWdodDtfLmZvckVhY2goZy5ub2RlRWRnZXMoY2hpbGQpLGZ1bmN0aW9uKGUpe3ZhciBpc091dEVkZ2U9ZS52PT09Y2hpbGQsb3RoZXI9CmlzT3V0RWRnZT9lLnc6ZS52O2lmKG90aGVyIT09cGFyZW50KXt2YXIgcG9pbnRzVG9IZWFkPWlzT3V0RWRnZT09PWNoaWxkSXNUYWlsLG90aGVyV2VpZ2h0PWcuZWRnZShlKS53ZWlnaHQ7Y3V0VmFsdWUrPXBvaW50c1RvSGVhZD9vdGhlcldlaWdodDotb3RoZXJXZWlnaHQ7aWYoaXNUcmVlRWRnZSh0LGNoaWxkLG90aGVyKSl7dmFyIG90aGVyQ3V0VmFsdWU9dC5lZGdlKGNoaWxkLG90aGVyKS5jdXR2YWx1ZTtjdXRWYWx1ZSs9cG9pbnRzVG9IZWFkPy1vdGhlckN1dFZhbHVlOm90aGVyQ3V0VmFsdWV9fX0pO3JldHVybiBjdXRWYWx1ZX1mdW5jdGlvbiBpbml0TG93TGltVmFsdWVzKHRyZWUscm9vdCl7aWYoYXJndW1lbnRzLmxlbmd0aDwyKXJvb3Q9dHJlZS5ub2RlcygpWzBdO2Rmc0Fzc2lnbkxvd0xpbSh0cmVlLHt9LDEscm9vdCl9ZnVuY3Rpb24gZGZzQXNzaWduTG93TGltKHRyZWUsdmlzaXRlZCxuZXh0TGltLHYscGFyZW50KXt2YXIgbG93PW5leHRMaW0sbGFiZWw9dHJlZS5ub2RlKHYpOwp2aXNpdGVkW3ZdPXRydWU7Xy5mb3JFYWNoKHRyZWUubmVpZ2hib3JzKHYpLGZ1bmN0aW9uKHcpe2lmKCFfLmhhcyh2aXNpdGVkLHcpKW5leHRMaW09ZGZzQXNzaWduTG93TGltKHRyZWUsdmlzaXRlZCxuZXh0TGltLHcsdil9KTtsYWJlbC5sb3c9bG93O2xhYmVsLmxpbT1uZXh0TGltKys7aWYocGFyZW50KWxhYmVsLnBhcmVudD1wYXJlbnQ7ZWxzZSBkZWxldGUgbGFiZWwucGFyZW50O3JldHVybiBuZXh0TGltfWZ1bmN0aW9uIGxlYXZlRWRnZSh0cmVlKXtyZXR1cm4gXy5maW5kKHRyZWUuZWRnZXMoKSxmdW5jdGlvbihlKXtyZXR1cm4gdHJlZS5lZGdlKGUpLmN1dHZhbHVlPDB9KX1mdW5jdGlvbiBlbnRlckVkZ2UodCxnLGVkZ2Upe3ZhciB2PWVkZ2Uudix3PWVkZ2UudztpZighZy5oYXNFZGdlKHYsdykpe3Y9ZWRnZS53O3c9ZWRnZS52fXZhciB2TGFiZWw9dC5ub2RlKHYpLHdMYWJlbD10Lm5vZGUodyksdGFpbExhYmVsPXZMYWJlbCxmbGlwPWZhbHNlO2lmKHZMYWJlbC5saW0+d0xhYmVsLmxpbSl7dGFpbExhYmVsPQp3TGFiZWw7ZmxpcD10cnVlfXZhciBjYW5kaWRhdGVzPV8uZmlsdGVyKGcuZWRnZXMoKSxmdW5jdGlvbihlZGdlKXtyZXR1cm4gZmxpcD09PWlzRGVzY2VuZGFudCh0LHQubm9kZShlZGdlLnYpLHRhaWxMYWJlbCkmJmZsaXAhPT1pc0Rlc2NlbmRhbnQodCx0Lm5vZGUoZWRnZS53KSx0YWlsTGFiZWwpfSk7cmV0dXJuIF8ubWluQnkoY2FuZGlkYXRlcyxmdW5jdGlvbihlZGdlKXtyZXR1cm4gc2xhY2soZyxlZGdlKX0pfWZ1bmN0aW9uIGV4Y2hhbmdlRWRnZXModCxnLGUsZil7dmFyIHY9ZS52LHc9ZS53O3QucmVtb3ZlRWRnZSh2LHcpO3Quc2V0RWRnZShmLnYsZi53LHt9KTtpbml0TG93TGltVmFsdWVzKHQpO2luaXRDdXRWYWx1ZXModCxnKTt1cGRhdGVSYW5rcyh0LGcpfWZ1bmN0aW9uIHVwZGF0ZVJhbmtzKHQsZyl7dmFyIHJvb3Q9Xy5maW5kKHQubm9kZXMoKSxmdW5jdGlvbih2KXtyZXR1cm4hZy5ub2RlKHYpLnBhcmVudH0pLHZzPXByZW9yZGVyKHQscm9vdCk7dnM9dnMuc2xpY2UoMSk7Cl8uZm9yRWFjaCh2cyxmdW5jdGlvbih2KXt2YXIgcGFyZW50PXQubm9kZSh2KS5wYXJlbnQsZWRnZT1nLmVkZ2UodixwYXJlbnQpLGZsaXBwZWQ9ZmFsc2U7aWYoIWVkZ2Upe2VkZ2U9Zy5lZGdlKHBhcmVudCx2KTtmbGlwcGVkPXRydWV9Zy5ub2RlKHYpLnJhbms9Zy5ub2RlKHBhcmVudCkucmFuaysoZmxpcHBlZD9lZGdlLm1pbmxlbjotZWRnZS5taW5sZW4pfSl9ZnVuY3Rpb24gaXNUcmVlRWRnZSh0cmVlLHUsdil7cmV0dXJuIHRyZWUuaGFzRWRnZSh1LHYpfWZ1bmN0aW9uIGlzRGVzY2VuZGFudCh0cmVlLHZMYWJlbCxyb290TGFiZWwpe3JldHVybiByb290TGFiZWwubG93PD12TGFiZWwubGltJiZ2TGFiZWwubGltPD1yb290TGFiZWwubGltfX0seyIuLi9ncmFwaGxpYiI6NywiLi4vbG9kYXNoIjoxMCwiLi4vdXRpbCI6MjksIi4vZmVhc2libGUtdHJlZSI6MjUsIi4vdXRpbCI6Mjh9XSwyODpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi4vbG9kYXNoIik7Cm1vZHVsZS5leHBvcnRzPXtsb25nZXN0UGF0aDpsb25nZXN0UGF0aCxzbGFjazpzbGFja307ZnVuY3Rpb24gbG9uZ2VzdFBhdGgoZyl7dmFyIHZpc2l0ZWQ9e307ZnVuY3Rpb24gZGZzKHYpe3ZhciBsYWJlbD1nLm5vZGUodik7aWYoXy5oYXModmlzaXRlZCx2KSlyZXR1cm4gbGFiZWwucmFuazt2aXNpdGVkW3ZdPXRydWU7dmFyIHJhbms9Xy5taW5CeShfLm1hcChnLm91dEVkZ2VzKHYpLGZ1bmN0aW9uKGUpe3JldHVybiBkZnMoZS53KS1nLmVkZ2UoZSkubWlubGVufSkpO2lmKHJhbms9PT1OdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFl8fHJhbms9PT11bmRlZmluZWR8fHJhbms9PT1udWxsKXJhbms9MDtyZXR1cm4gbGFiZWwucmFuaz1yYW5rfV8uZm9yRWFjaChnLnNvdXJjZXMoKSxkZnMpfWZ1bmN0aW9uIHNsYWNrKGcsZSl7cmV0dXJuIGcubm9kZShlLncpLnJhbmstZy5ub2RlKGUudikucmFuay1nLmVkZ2UoZSkubWlubGVufX0seyIuLi9sb2Rhc2giOjEwfV0sMjk6W2Z1bmN0aW9uKHJlcXVpcmUsCm1vZHVsZSxleHBvcnRzKXt2YXIgXz1yZXF1aXJlKCIuL2xvZGFzaCIpLEdyYXBoPXJlcXVpcmUoIi4vZ3JhcGhsaWIiKS5HcmFwaDttb2R1bGUuZXhwb3J0cz17YWRkRHVtbXlOb2RlOmFkZER1bW15Tm9kZSxzaW1wbGlmeTpzaW1wbGlmeSxhc05vbkNvbXBvdW5kR3JhcGg6YXNOb25Db21wb3VuZEdyYXBoLHN1Y2Nlc3NvcldlaWdodHM6c3VjY2Vzc29yV2VpZ2h0cyxwcmVkZWNlc3NvcldlaWdodHM6cHJlZGVjZXNzb3JXZWlnaHRzLGludGVyc2VjdFJlY3Q6aW50ZXJzZWN0UmVjdCxidWlsZExheWVyTWF0cml4OmJ1aWxkTGF5ZXJNYXRyaXgsbm9ybWFsaXplUmFua3M6bm9ybWFsaXplUmFua3MscmVtb3ZlRW1wdHlSYW5rczpyZW1vdmVFbXB0eVJhbmtzLGFkZEJvcmRlck5vZGU6YWRkQm9yZGVyTm9kZSxtYXhSYW5rOm1heFJhbmsscGFydGl0aW9uOnBhcnRpdGlvbix0aW1lOnRpbWUsbm90aW1lOm5vdGltZX07ZnVuY3Rpb24gYWRkRHVtbXlOb2RlKGcsdHlwZSxhdHRycyxuYW1lKXt2YXIgdjsKZG8gdj1fLnVuaXF1ZUlkKG5hbWUpO3doaWxlKGcuaGFzTm9kZSh2KSk7YXR0cnMuZHVtbXk9dHlwZTtnLnNldE5vZGUodixhdHRycyk7cmV0dXJuIHZ9ZnVuY3Rpb24gc2ltcGxpZnkoZyl7dmFyIHNpbXBsaWZpZWQ9KG5ldyBHcmFwaCkuc2V0R3JhcGgoZy5ncmFwaCgpKTtfLmZvckVhY2goZy5ub2RlcygpLGZ1bmN0aW9uKHYpe3NpbXBsaWZpZWQuc2V0Tm9kZSh2LGcubm9kZSh2KSl9KTtfLmZvckVhY2goZy5lZGdlcygpLGZ1bmN0aW9uKGUpe3ZhciBzaW1wbGVMYWJlbD1zaW1wbGlmaWVkLmVkZ2UoZS52LGUudyl8fHt3ZWlnaHQ6MCxtaW5sZW46MX0sbGFiZWw9Zy5lZGdlKGUpO3NpbXBsaWZpZWQuc2V0RWRnZShlLnYsZS53LHt3ZWlnaHQ6c2ltcGxlTGFiZWwud2VpZ2h0K2xhYmVsLndlaWdodCxtaW5sZW46TWF0aC5tYXgoc2ltcGxlTGFiZWwubWlubGVuLGxhYmVsLm1pbmxlbil9KX0pO3JldHVybiBzaW1wbGlmaWVkfWZ1bmN0aW9uIGFzTm9uQ29tcG91bmRHcmFwaChnKXt2YXIgc2ltcGxpZmllZD0KKG5ldyBHcmFwaCh7bXVsdGlncmFwaDpnLmlzTXVsdGlncmFwaCgpfSkpLnNldEdyYXBoKGcuZ3JhcGgoKSk7Xy5mb3JFYWNoKGcubm9kZXMoKSxmdW5jdGlvbih2KXtpZighZy5jaGlsZHJlbih2KS5sZW5ndGgpc2ltcGxpZmllZC5zZXROb2RlKHYsZy5ub2RlKHYpKX0pO18uZm9yRWFjaChnLmVkZ2VzKCksZnVuY3Rpb24oZSl7c2ltcGxpZmllZC5zZXRFZGdlKGUsZy5lZGdlKGUpKX0pO3JldHVybiBzaW1wbGlmaWVkfWZ1bmN0aW9uIHN1Y2Nlc3NvcldlaWdodHMoZyl7dmFyIHdlaWdodE1hcD1fLm1hcChnLm5vZGVzKCksZnVuY3Rpb24odil7dmFyIHN1Y3M9e307Xy5mb3JFYWNoKGcub3V0RWRnZXModiksZnVuY3Rpb24oZSl7c3Vjc1tlLnddPShzdWNzW2Uud118fDApK2cuZWRnZShlKS53ZWlnaHR9KTtyZXR1cm4gc3Vjc30pO3JldHVybiBfLnppcE9iamVjdChnLm5vZGVzKCksd2VpZ2h0TWFwKX1mdW5jdGlvbiBwcmVkZWNlc3NvcldlaWdodHMoZyl7dmFyIHdlaWdodE1hcD1fLm1hcChnLm5vZGVzKCksCmZ1bmN0aW9uKHYpe3ZhciBwcmVkcz17fTtfLmZvckVhY2goZy5pbkVkZ2VzKHYpLGZ1bmN0aW9uKGUpe3ByZWRzW2Uudl09KHByZWRzW2Uudl18fDApK2cuZWRnZShlKS53ZWlnaHR9KTtyZXR1cm4gcHJlZHN9KTtyZXR1cm4gXy56aXBPYmplY3QoZy5ub2RlcygpLHdlaWdodE1hcCl9ZnVuY3Rpb24gaW50ZXJzZWN0UmVjdChyZWN0LHBvaW50KXt2YXIgeD1yZWN0Lng7dmFyIHk9cmVjdC55O3ZhciBkeD1wb2ludC54LXg7dmFyIGR5PXBvaW50LnkteTt2YXIgdz1yZWN0LndpZHRoLzI7dmFyIGg9cmVjdC5oZWlnaHQvMjtpZighZHgmJiFkeSl0aHJvdyBuZXcgRXJyb3IoIk5vdCBwb3NzaWJsZSB0byBmaW5kIGludGVyc2VjdGlvbiBpbnNpZGUgb2YgdGhlIHJlY3RhbmdsZSIpO3ZhciBzeCxzeTtpZihNYXRoLmFicyhkeSkqdz5NYXRoLmFicyhkeCkqaCl7aWYoZHk8MCloPS1oO3N4PWgqZHgvZHk7c3k9aH1lbHNle2lmKGR4PDApdz0tdztzeD13O3N5PXcqZHkvZHh9cmV0dXJue3g6eCsKc3gseTp5K3N5fX1mdW5jdGlvbiBidWlsZExheWVyTWF0cml4KGcpe3ZhciBsYXllcmluZz1fLm1hcChfLnJhbmdlKG1heFJhbmsoZykrMSksZnVuY3Rpb24oKXtyZXR1cm5bXX0pO18uZm9yRWFjaChnLm5vZGVzKCksZnVuY3Rpb24odil7dmFyIG5vZGU9Zy5ub2RlKHYpLHJhbms9bm9kZS5yYW5rO2lmKCFfLmlzVW5kZWZpbmVkKHJhbmspKWxheWVyaW5nW3JhbmtdW25vZGUub3JkZXJdPXZ9KTtyZXR1cm4gbGF5ZXJpbmd9ZnVuY3Rpb24gbm9ybWFsaXplUmFua3MoZyl7dmFyIG1pbj1fLm1pbkJ5KF8ubWFwKGcubm9kZXMoKSxmdW5jdGlvbih2KXtyZXR1cm4gZy5ub2RlKHYpLnJhbmt9KSk7Xy5mb3JFYWNoKGcubm9kZXMoKSxmdW5jdGlvbih2KXt2YXIgbm9kZT1nLm5vZGUodik7aWYoXy5oYXMobm9kZSwicmFuayIpKW5vZGUucmFuay09bWlufSl9ZnVuY3Rpb24gcmVtb3ZlRW1wdHlSYW5rcyhnKXt2YXIgb2Zmc2V0PV8ubWluQnkoXy5tYXAoZy5ub2RlcygpLGZ1bmN0aW9uKHYpe3JldHVybiBnLm5vZGUodikucmFua30pKTsKdmFyIGxheWVycz1bXTtfLmZvckVhY2goZy5ub2RlcygpLGZ1bmN0aW9uKHYpe3ZhciByYW5rPWcubm9kZSh2KS5yYW5rLW9mZnNldDtpZighbGF5ZXJzW3JhbmtdKWxheWVyc1tyYW5rXT1bXTtsYXllcnNbcmFua10ucHVzaCh2KX0pO3ZhciBkZWx0YT0wLG5vZGVSYW5rRmFjdG9yPWcuZ3JhcGgoKS5ub2RlUmFua0ZhY3RvcjtfLmZvckVhY2gobGF5ZXJzLGZ1bmN0aW9uKHZzLGkpe2lmKF8uaXNVbmRlZmluZWQodnMpJiZpJW5vZGVSYW5rRmFjdG9yIT09MCktLWRlbHRhO2Vsc2UgaWYoZGVsdGEpXy5mb3JFYWNoKHZzLGZ1bmN0aW9uKHYpe2cubm9kZSh2KS5yYW5rKz1kZWx0YX0pfSl9ZnVuY3Rpb24gYWRkQm9yZGVyTm9kZShnLHByZWZpeCxyYW5rLG9yZGVyKXt2YXIgbm9kZT17d2lkdGg6MCxoZWlnaHQ6MH07aWYoYXJndW1lbnRzLmxlbmd0aD49NCl7bm9kZS5yYW5rPXJhbms7bm9kZS5vcmRlcj1vcmRlcn1yZXR1cm4gYWRkRHVtbXlOb2RlKGcsImJvcmRlciIsbm9kZSxwcmVmaXgpfQpmdW5jdGlvbiBtYXhSYW5rKGcpe3JldHVybiBfLm1heChfLm1hcChnLm5vZGVzKCksZnVuY3Rpb24odil7dmFyIHJhbms9Zy5ub2RlKHYpLnJhbms7aWYoIV8uaXNVbmRlZmluZWQocmFuaykpcmV0dXJuIHJhbmt9KSl9ZnVuY3Rpb24gcGFydGl0aW9uKGNvbGxlY3Rpb24sZm4pe3ZhciByZXN1bHQ9e2xoczpbXSxyaHM6W119O18uZm9yRWFjaChjb2xsZWN0aW9uLGZ1bmN0aW9uKHZhbHVlKXtpZihmbih2YWx1ZSkpcmVzdWx0Lmxocy5wdXNoKHZhbHVlKTtlbHNlIHJlc3VsdC5yaHMucHVzaCh2YWx1ZSl9KTtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIHRpbWUobmFtZSxmbil7dmFyIHN0YXJ0PV8ubm93KCk7dHJ5e3JldHVybiBmbigpfWZpbmFsbHl7Y29uc29sZS5sb2cobmFtZSsiIHRpbWU6ICIrKF8ubm93KCktc3RhcnQpKyJtcyIpfX1mdW5jdGlvbiBub3RpbWUobmFtZSxmbil7cmV0dXJuIGZuKCl9fSx7Ii4vZ3JhcGhsaWIiOjcsIi4vbG9kYXNoIjoxMH1dLDMwOltmdW5jdGlvbihyZXF1aXJlLAptb2R1bGUsZXhwb3J0cyl7bW9kdWxlLmV4cG9ydHM9IjAuOC4yIn0se31dfSx7fSxbMV0pKDEpfSk7PC9zY3JpcHQ+PHNjcmlwdD52YXIgbnVtZXJpYz10eXBlb2YgZXhwb3J0cz09PSJ1bmRlZmluZWQiP2Z1bmN0aW9uIG51bWVyaWMoKXt9OmV4cG9ydHM7aWYodHlwZW9mIGdsb2JhbCE9PSJ1bmRlZmluZWQiKWdsb2JhbC5udW1lcmljPW51bWVyaWM7bnVtZXJpYy52ZXJzaW9uPSIxLjIuNiI7bnVtZXJpYy5iZW5jaD1mdW5jdGlvbiBiZW5jaChmLGludGVydmFsKXt2YXIgdDEsdDIsbixpO2lmKHR5cGVvZiBpbnRlcnZhbD09PSJ1bmRlZmluZWQiKWludGVydmFsPTE1O249LjU7dDE9bmV3IERhdGU7d2hpbGUoMSl7bio9Mjtmb3IoaT1uO2k+MztpLT00KXtmKCk7ZigpO2YoKTtmKCl9d2hpbGUoaT4wKXtmKCk7aS0tfXQyPW5ldyBEYXRlO2lmKHQyLXQxPmludGVydmFsKWJyZWFrfWZvcihpPW47aT4zO2ktPTQpe2YoKTtmKCk7ZigpO2YoKX13aGlsZShpPjApe2YoKTtpLS19dDI9bmV3IERhdGU7cmV0dXJuIDFFMyooMypuLTEpLyh0Mi10MSl9OwpudW1lcmljLl9teUluZGV4T2Y9ZnVuY3Rpb24gX215SW5kZXhPZih3KXt2YXIgbj10aGlzLmxlbmd0aCxrO2ZvcihrPTA7azxuOysraylpZih0aGlzW2tdPT09dylyZXR1cm4gaztyZXR1cm4tMX07bnVtZXJpYy5teUluZGV4T2Y9QXJyYXkucHJvdG90eXBlLmluZGV4T2Y/QXJyYXkucHJvdG90eXBlLmluZGV4T2Y6bnVtZXJpYy5fbXlJbmRleE9mO251bWVyaWMuRnVuY3Rpb249RnVuY3Rpb247bnVtZXJpYy5wcmVjaXNpb249NDtudW1lcmljLmxhcmdlQXJyYXk9NTA7Cm51bWVyaWMucHJldHR5UHJpbnQ9ZnVuY3Rpb24gcHJldHR5UHJpbnQoeCl7ZnVuY3Rpb24gZm10bnVtKHgpe2lmKHg9PT0wKXJldHVybiIwIjtpZihpc05hTih4KSlyZXR1cm4iTmFOIjtpZih4PDApcmV0dXJuIi0iK2ZtdG51bSgteCk7aWYoaXNGaW5pdGUoeCkpe3ZhciBzY2FsZT1NYXRoLmZsb29yKE1hdGgubG9nKHgpL01hdGgubG9nKDEwKSk7dmFyIG5vcm1hbGl6ZWQ9eC9NYXRoLnBvdygxMCxzY2FsZSk7dmFyIGJhc2ljPW5vcm1hbGl6ZWQudG9QcmVjaXNpb24obnVtZXJpYy5wcmVjaXNpb24pO2lmKHBhcnNlRmxvYXQoYmFzaWMpPT09MTApe3NjYWxlKys7bm9ybWFsaXplZD0xO2Jhc2ljPW5vcm1hbGl6ZWQudG9QcmVjaXNpb24obnVtZXJpYy5wcmVjaXNpb24pfXJldHVybiBwYXJzZUZsb2F0KGJhc2ljKS50b1N0cmluZygpKyJlIitzY2FsZS50b1N0cmluZygpfXJldHVybiJJbmZpbml0eSJ9dmFyIHJldD1bXTtmdW5jdGlvbiBmb28oeCl7dmFyIGs7aWYodHlwZW9mIHg9PT0KInVuZGVmaW5lZCIpe3JldC5wdXNoKEFycmF5KG51bWVyaWMucHJlY2lzaW9uKzgpLmpvaW4oIiAiKSk7cmV0dXJuIGZhbHNlfWlmKHR5cGVvZiB4PT09InN0cmluZyIpe3JldC5wdXNoKCciJyt4KyciJyk7cmV0dXJuIGZhbHNlfWlmKHR5cGVvZiB4PT09ImJvb2xlYW4iKXtyZXQucHVzaCh4LnRvU3RyaW5nKCkpO3JldHVybiBmYWxzZX1pZih0eXBlb2YgeD09PSJudW1iZXIiKXt2YXIgYT1mbXRudW0oeCk7dmFyIGI9eC50b1ByZWNpc2lvbihudW1lcmljLnByZWNpc2lvbik7dmFyIGM9cGFyc2VGbG9hdCh4LnRvU3RyaW5nKCkpLnRvU3RyaW5nKCk7dmFyIGQ9W2EsYixjLHBhcnNlRmxvYXQoYikudG9TdHJpbmcoKSxwYXJzZUZsb2F0KGMpLnRvU3RyaW5nKCldO2ZvcihrPTE7azxkLmxlbmd0aDtrKyspaWYoZFtrXS5sZW5ndGg8YS5sZW5ndGgpYT1kW2tdO3JldC5wdXNoKEFycmF5KG51bWVyaWMucHJlY2lzaW9uKzgtYS5sZW5ndGgpLmpvaW4oIiAiKSthKTtyZXR1cm4gZmFsc2V9aWYoeD09PQpudWxsKXtyZXQucHVzaCgibnVsbCIpO3JldHVybiBmYWxzZX1pZih0eXBlb2YgeD09PSJmdW5jdGlvbiIpe3JldC5wdXNoKHgudG9TdHJpbmcoKSk7dmFyIGZsYWc9ZmFsc2U7Zm9yKGsgaW4geClpZih4Lmhhc093blByb3BlcnR5KGspKXtpZihmbGFnKXJldC5wdXNoKCIsXG4iKTtlbHNlIHJldC5wdXNoKCJcbnsiKTtmbGFnPXRydWU7cmV0LnB1c2goayk7cmV0LnB1c2goIjogXG4iKTtmb28oeFtrXSl9aWYoZmxhZylyZXQucHVzaCgifVxuIik7cmV0dXJuIHRydWV9aWYoeCBpbnN0YW5jZW9mIEFycmF5KXtpZih4Lmxlbmd0aD5udW1lcmljLmxhcmdlQXJyYXkpe3JldC5wdXNoKCIuLi5MYXJnZSBBcnJheS4uLiIpO3JldHVybiB0cnVlfXZhciBmbGFnPWZhbHNlO3JldC5wdXNoKCJbIik7Zm9yKGs9MDtrPHgubGVuZ3RoO2srKyl7aWYoaz4wKXtyZXQucHVzaCgiLCIpO2lmKGZsYWcpcmV0LnB1c2goIlxuICIpfWZsYWc9Zm9vKHhba10pfXJldC5wdXNoKCJdIik7cmV0dXJuIHRydWV9cmV0LnB1c2goInsiKTsKdmFyIGZsYWc9ZmFsc2U7Zm9yKGsgaW4geClpZih4Lmhhc093blByb3BlcnR5KGspKXtpZihmbGFnKXJldC5wdXNoKCIsXG4iKTtmbGFnPXRydWU7cmV0LnB1c2goayk7cmV0LnB1c2goIjogXG4iKTtmb28oeFtrXSl9cmV0LnB1c2goIn0iKTtyZXR1cm4gdHJ1ZX1mb28oeCk7cmV0dXJuIHJldC5qb2luKCIiKX07bnVtZXJpYy5wYXJzZURhdGU9ZnVuY3Rpb24gcGFyc2VEYXRlKGQpe2Z1bmN0aW9uIGZvbyhkKXtpZih0eXBlb2YgZD09PSJzdHJpbmciKXJldHVybiBEYXRlLnBhcnNlKGQucmVwbGFjZSgvLS9nLCIvIikpO2lmKCEoZCBpbnN0YW5jZW9mIEFycmF5KSl0aHJvdyBuZXcgRXJyb3IoInBhcnNlRGF0ZTogcGFyYW1ldGVyIG11c3QgYmUgYXJyYXlzIG9mIHN0cmluZ3MiKTt2YXIgcmV0PVtdLGs7Zm9yKGs9MDtrPGQubGVuZ3RoO2srKylyZXRba109Zm9vKGRba10pO3JldHVybiByZXR9cmV0dXJuIGZvbyhkKX07Cm51bWVyaWMucGFyc2VGbG9hdD1mdW5jdGlvbiBwYXJzZUZsb2F0XyhkKXtmdW5jdGlvbiBmb28oZCl7aWYodHlwZW9mIGQ9PT0ic3RyaW5nIilyZXR1cm4gcGFyc2VGbG9hdChkKTtpZighKGQgaW5zdGFuY2VvZiBBcnJheSkpdGhyb3cgbmV3IEVycm9yKCJwYXJzZUZsb2F0OiBwYXJhbWV0ZXIgbXVzdCBiZSBhcnJheXMgb2Ygc3RyaW5ncyIpO3ZhciByZXQ9W10saztmb3Ioaz0wO2s8ZC5sZW5ndGg7aysrKXJldFtrXT1mb28oZFtrXSk7cmV0dXJuIHJldH1yZXR1cm4gZm9vKGQpfTsKbnVtZXJpYy5wYXJzZUNTVj1mdW5jdGlvbiBwYXJzZUNTVih0KXt2YXIgZm9vPXQuc3BsaXQoIlxuIik7dmFyIGosazt2YXIgcmV0PVtdO3ZhciBwYXQ9LygoW14nIixdKil8KCdbXiddKicpfCgiW14iXSoiKSksL2c7dmFyIHBhdG51bT0vXlxzKigoWystXT9bMC05XSsoXC5bMC05XSopPyhlWystXT9bMC05XSspPyl8KFsrLV0/WzAtOV0qKFwuWzAtOV0rKT8oZVsrLV0/WzAtOV0rKT8pKVxzKiQvO3ZhciBzdHJpcHBlcj1mdW5jdGlvbihuKXtyZXR1cm4gbi5zdWJzdHIoMCxuLmxlbmd0aC0xKX07dmFyIGNvdW50PTA7Zm9yKGs9MDtrPGZvby5sZW5ndGg7aysrKXt2YXIgYmFyPShmb29ba10rIiwiKS5tYXRjaChwYXQpLGJhejtpZihiYXIubGVuZ3RoPjApe3JldFtjb3VudF09W107Zm9yKGo9MDtqPGJhci5sZW5ndGg7aisrKXtiYXo9c3RyaXBwZXIoYmFyW2pdKTtpZihwYXRudW0udGVzdChiYXopKXJldFtjb3VudF1bal09cGFyc2VGbG9hdChiYXopO2Vsc2UgcmV0W2NvdW50XVtqXT0KYmF6fWNvdW50Kyt9fXJldHVybiByZXR9O251bWVyaWMudG9DU1Y9ZnVuY3Rpb24gdG9DU1YoQSl7dmFyIHM9bnVtZXJpYy5kaW0oQSk7dmFyIGksaixtLG4scm93LHJldDttPXNbMF07bj1zWzFdO3JldD1bXTtmb3IoaT0wO2k8bTtpKyspe3Jvdz1bXTtmb3Ioaj0wO2o8bTtqKyspcm93W2pdPUFbaV1bal0udG9TdHJpbmcoKTtyZXRbaV09cm93LmpvaW4oIiwgIil9cmV0dXJuIHJldC5qb2luKCJcbiIpKyJcbiJ9O251bWVyaWMuZ2V0VVJMPWZ1bmN0aW9uIGdldFVSTCh1cmwpe3ZhciBjbGllbnQ9bmV3IFhNTEh0dHBSZXF1ZXN0O2NsaWVudC5vcGVuKCJHRVQiLHVybCxmYWxzZSk7Y2xpZW50LnNlbmQoKTtyZXR1cm4gY2xpZW50fTsKbnVtZXJpYy5pbWFnZVVSTD1mdW5jdGlvbiBpbWFnZVVSTChpbWcpe2Z1bmN0aW9uIGJhc2U2NChBKXt2YXIgbj1BLmxlbmd0aCxpLHgseSx6LHAscSxyLHM7dmFyIGtleT0iQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrL1x4M2QiO3ZhciByZXQ9IiI7Zm9yKGk9MDtpPG47aSs9Myl7eD1BW2ldO3k9QVtpKzFdO3o9QVtpKzJdO3A9eD4+MjtxPSgoeCYzKTw8NCkrKHk+PjQpO3I9KCh5JjE1KTw8MikrKHo+PjYpO3M9eiY2MztpZihpKzE+PW4pcj1zPTY0O2Vsc2UgaWYoaSsyPj1uKXM9NjQ7cmV0Kz1rZXkuY2hhckF0KHApK2tleS5jaGFyQXQocSkra2V5LmNoYXJBdChyKStrZXkuY2hhckF0KHMpfXJldHVybiByZXR9ZnVuY3Rpb24gY3JjMzJBcnJheShhLGZyb20sdG8pe2lmKHR5cGVvZiBmcm9tPT09InVuZGVmaW5lZCIpZnJvbT0wO2lmKHR5cGVvZiB0bz09PSJ1bmRlZmluZWQiKXRvPWEubGVuZ3RoO3ZhciB0YWJsZT0KWzAsMTk5Njk1OTg5NCwzOTkzOTE5Nzg4LDI1Njc1MjQ3OTQsMTI0NjM0MTM3LDE4ODYwNTc2MTUsMzkxNTYyMTY4NSwyNjU3MzkyMDM1LDI0OTI2ODI3NCwyMDQ0NTA4MzI0LDM3NzIxMTUyMzAsMjU0NzE3Nzg2NCwxNjI5NDE5OTUsMjEyNTU2MTAyMSwzODg3NjA3MDQ3LDI0Mjg0NDQwNDksNDk4NTM2NTQ4LDE3ODk5Mjc2NjYsNDA4OTAxNjY0OCwyMjI3MDYxMjE0LDQ1MDU0ODg2MSwxODQzMjU4NjAzLDQxMDc1ODA3NTMsMjIxMTY3NzYzOSwzMjU4ODM5OTAsMTY4NDc3NzE1Miw0MjUxMTIyMDQyLDIzMjE5MjY2MzYsMzM1NjMzNDg3LDE2NjEzNjU0NjUsNDE5NTMwMjc1NSwyMzY2MTE1MzE3LDk5NzA3MzA5NiwxMjgxOTUzODg2LDM1Nzk4NTUzMzIsMjcyNDY4ODI0MiwxMDA2ODg4MTQ1LDEyNTg2MDc2ODcsMzUyNDEwMTYyOSwyNzY4OTQyNDQzLDkwMTA5NzcyMiwxMTE5MDAwNjg0LDM2ODY1MTcyMDYsMjg5ODA2NTcyOCw4NTMwNDQ0NTEsMTE3MjI2NjEwMSwzNzA1MDE1NzU5LDI4ODI2MTY2NjUsCjY1MTc2Nzk4MCwxMzczNTAzNTQ2LDMzNjk1NTQzMDQsMzIxODEwNDU5OCw1NjU1MDcyNTMsMTQ1NDYyMTczMSwzNDg1MTExNzA1LDMwOTk0MzYzMDMsNjcxMjY2OTc0LDE1OTQxOTgwMjQsMzMyMjczMDkzMCwyOTcwMzQ3ODEyLDc5NTgzNTUyNywxNDgzMjMwMjI1LDMyNDQzNjcyNzUsMzA2MDE0OTU2NSwxOTk0MTQ2MTkyLDMxMTU4NTM0LDI1NjM5MDc3NzIsNDAyMzcxNzkzMCwxOTA3NDU5NDY1LDExMjYzNzIxNSwyNjgwMTUzMjUzLDM5MDQ0MjcwNTksMjAxMzc3NjI5MCwyNTE3MjIwMzYsMjUxNzIxNTM3NCwzNzc1ODMwMDQwLDIxMzc2NTY3NjMsMTQxMzc2ODEzLDI0MzkyNzc3MTksMzg2NTI3MTI5NywxODAyMTk1NDQ0LDQ3Njg2NDg2NiwyMjM4MDAxMzY4LDQwNjY1MDg4NzgsMTgxMjM3MDkyNSw0NTMwOTI3MzEsMjE4MTYyNTAyNSw0MTExNDUxMjIzLDE3MDYwODg5MDIsMzE0MDQyNzA0LDIzNDQ1MzIyMDIsNDI0MDAxNzUzMiwxNjU4NjU4MjcxLDM2NjYxOTk3NywyMzYyNjcwMzIzLAo0MjI0OTk0NDA1LDEzMDM1MzU5NjAsOTg0OTYxNDg2LDI3NDcwMDcwOTIsMzU2OTAzNzUzOCwxMjU2MTcwODE3LDEwMzc2MDQzMTEsMjc2NTIxMDczMywzNTU0MDc5OTk1LDExMzEwMTQ1MDYsODc5Njc5OTk2LDI5MDkyNDM0NjIsMzY2Mzc3MTg1NiwxMTQxMTI0NDY3LDg1NTg0MjI3NywyODUyODAxNjMxLDM3MDg2NDg2NDksMTM0MjUzMzk0OCw2NTQ0NTkzMDYsMzE4ODM5NjA0OCwzMzczMDE1MTc0LDE0NjY0Nzk5MDksNTQ0MTc5NjM1LDMxMTA1MjM5MTMsMzQ2MjUyMjAxNSwxNTkxNjcxMDU0LDcwMjEzODc3NiwyOTY2NDYwNDUwLDMzNTI3OTk0MTIsMTUwNDkxODgwNyw3ODM1NTE4NzMsMzA4MjY0MDQ0MywzMjMzNDQyOTg5LDM5ODgyOTIzODQsMjU5NjI1NDY0Niw2MjMxNzA2OCwxOTU3ODEwODQyLDM5Mzk4NDU5NDUsMjY0NzgxNjExMSw4MTQ3MDk5NywxOTQzODAzNTIzLDM4MTQ5MTg5MzAsMjQ4OTU5NjgwNCwyMjUyNzQ0MzAsMjA1Mzc5MDM3NiwzODI2MTc1NzU1LDI0NjY5MDYwMTMsCjE2NzgxNjc0MywyMDk3NjUxMzc3LDQwMjc1NTI1ODAsMjI2NTQ5MDM4Niw1MDM0NDQwNzIsMTc2MjA1MDgxNCw0MTUwNDE3MjQ1LDIxNTQxMjkzNTUsNDI2NTIyMjI1LDE4NTI1MDc4NzksNDI3NTMxMzUyNiwyMzEyMzE3OTIwLDI4Mjc1MzYyNiwxNzQyNTU1ODUyLDQxODk3MDgxNDMsMjM5NDg3Nzk0NSwzOTc5MTc3NjMsMTYyMjE4MzYzNywzNjA0MzkwODg4LDI3MTQ4NjY1NTgsOTUzNzI5NzMyLDEzNDAwNzY2MjYsMzUxODcxOTk4NSwyNzk3MzYwOTk5LDEwNjg4MjgzODEsMTIxOTYzODg1OSwzNjI0NzQxODUwLDI5MzY2NzUxNDgsOTA2MTg1NDYyLDEwOTA4MTI1MTIsMzc0NzY3MjAwMywyODI1Mzc5NjY5LDgyOTMyOTEzNSwxMTgxMzM1MTYxLDM0MTIxNzc4MDQsMzE2MDgzNDg0Miw2MjgwODU0MDgsMTM4MjYwNTM2NiwzNDIzMzY5MTA5LDMxMzgwNzg0NjcsNTcwNTYyMjMzLDE0MjY0MDA4MTUsMzMxNzMxNjU0MiwyOTk4NzMzNjA4LDczMzIzOTk1NCwxNTU1MjYxOTU2LDMyNjg5MzU1OTEsCjMwNTAzNjA2MjUsNzUyNDU5NDAzLDE1NDEzMjAyMjEsMjYwNzA3MTkyMCwzOTY1OTczMDMwLDE5Njk5MjI5NzIsNDA3MzU0OTgsMjYxNzgzNzIyNSwzOTQzNTc3MTUxLDE5MTMwODc4NzcsODM5MDgzNzEsMjUxMjM0MTYzNCwzODAzNzQwNjkyLDIwNzUyMDg2MjIsMjEzMjYxMTEyLDI0NjMyNzI2MDMsMzg1NTk5MDI4NSwyMDk0ODU0MDcxLDE5ODk1ODg4MSwyMjYyMDI5MDEyLDQwNTcyNjA2MTAsMTc1OTM1OTk5Miw1MzQ0MTQxOTAsMjE3NjcxODU0MSw0MTM5MzI5MTE1LDE4NzM4MzYwMDEsNDE0NjY0NTY3LDIyODIyNDg5MzQsNDI3OTIwMDM2OCwxNzExNjg0NTU0LDI4NTI4MTExNiwyNDA1ODAxNzI3LDQxNjcyMTY3NDUsMTYzNDQ2Nzc5NSwzNzYyMjk3MDEsMjY4NTA2Nzg5NiwzNjA4MDA3NDA2LDEzMDg5MTg2MTIsOTU2NTQzOTM4LDI4MDg1NTUxMDUsMzQ5NTk1ODI2MywxMjMxNjM2MzAxLDEwNDc0MjcwMzUsMjkzMjk1OTgxOCwzNjU0NzAzODM2LDEwODgzNTkyNzAsOTM2OTE4RTMsCjI4NDc3MTQ4OTksMzczNjgzNzgyOSwxMjAyOTAwODYzLDgxNzIzMzg5NywzMTgzMzQyMTA4LDM0MDEyMzcxMzAsMTQwNDI3NzU1Miw2MTU4MTgxNTAsMzEzNDIwNzQ5MywzNDUzNDIxMjAzLDE0MjM4NTc0NDksNjAxNDUwNDMxLDMwMDk4Mzc2MTQsMzI5NDcxMDQ1NiwxNTY3MTAzNzQ2LDcxMTkyODcyNCwzMDIwNjY4NDcxLDMyNzIzODAwNjUsMTUxMDMzNDIzNSw3NTUxNjcxMTddO3ZhciBjcmM9LTEseT0wLG49YS5sZW5ndGgsaTtmb3IoaT1mcm9tO2k8dG87aSsrKXt5PShjcmNeYVtpXSkmMjU1O2NyYz1jcmM+Pj44XnRhYmxlW3ldfXJldHVybiBjcmNeLTF9dmFyIGg9aW1nWzBdLmxlbmd0aCx3PWltZ1swXVswXS5sZW5ndGgsczEsczIsbmV4dCxrLGxlbmd0aCxhLGIsaSxqLGFkbGVyMzIsY3JjMzI7dmFyIHN0cmVhbT1bMTM3LDgwLDc4LDcxLDEzLDEwLDI2LDEwLDAsMCwwLDEzLDczLDcyLDY4LDgyLHc+PjI0JjI1NSx3Pj4xNiYyNTUsdz4+OCYyNTUsdyYyNTUsaD4+MjQmMjU1LApoPj4xNiYyNTUsaD4+OCYyNTUsaCYyNTUsOCwyLDAsMCwwLC0xLC0yLC0zLC00LC01LC02LC03LC04LDczLDY4LDY1LDg0LDgsMjldO2NyYzMyPWNyYzMyQXJyYXkoc3RyZWFtLDEyLDI5KTtzdHJlYW1bMjldPWNyYzMyPj4yNCYyNTU7c3RyZWFtWzMwXT1jcmMzMj4+MTYmMjU1O3N0cmVhbVszMV09Y3JjMzI+PjgmMjU1O3N0cmVhbVszMl09Y3JjMzImMjU1O3MxPTE7czI9MDtmb3IoaT0wO2k8aDtpKyspe2lmKGk8aC0xKXN0cmVhbS5wdXNoKDApO2Vsc2Ugc3RyZWFtLnB1c2goMSk7YT0zKncrMSsoaT09PTApJjI1NTtiPTMqdysxKyhpPT09MCk+PjgmMjU1O3N0cmVhbS5wdXNoKGEpO3N0cmVhbS5wdXNoKGIpO3N0cmVhbS5wdXNoKH5hJjI1NSk7c3RyZWFtLnB1c2gofmImMjU1KTtpZihpPT09MClzdHJlYW0ucHVzaCgwKTtmb3Ioaj0wO2o8dztqKyspZm9yKGs9MDtrPDM7aysrKXthPWltZ1trXVtpXVtqXTtpZihhPjI1NSlhPTI1NTtlbHNlIGlmKGE8MClhPTA7ZWxzZSBhPU1hdGgucm91bmQoYSk7CnMxPShzMSthKSU2NTUyMTtzMj0oczIrczEpJTY1NTIxO3N0cmVhbS5wdXNoKGEpfXN0cmVhbS5wdXNoKDApfWFkbGVyMzI9KHMyPDwxNikrczE7c3RyZWFtLnB1c2goYWRsZXIzMj4+MjQmMjU1KTtzdHJlYW0ucHVzaChhZGxlcjMyPj4xNiYyNTUpO3N0cmVhbS5wdXNoKGFkbGVyMzI+PjgmMjU1KTtzdHJlYW0ucHVzaChhZGxlcjMyJjI1NSk7bGVuZ3RoPXN0cmVhbS5sZW5ndGgtNDE7c3RyZWFtWzMzXT1sZW5ndGg+PjI0JjI1NTtzdHJlYW1bMzRdPWxlbmd0aD4+MTYmMjU1O3N0cmVhbVszNV09bGVuZ3RoPj44JjI1NTtzdHJlYW1bMzZdPWxlbmd0aCYyNTU7Y3JjMzI9Y3JjMzJBcnJheShzdHJlYW0sMzcpO3N0cmVhbS5wdXNoKGNyYzMyPj4yNCYyNTUpO3N0cmVhbS5wdXNoKGNyYzMyPj4xNiYyNTUpO3N0cmVhbS5wdXNoKGNyYzMyPj44JjI1NSk7c3RyZWFtLnB1c2goY3JjMzImMjU1KTtzdHJlYW0ucHVzaCgwKTtzdHJlYW0ucHVzaCgwKTtzdHJlYW0ucHVzaCgwKTtzdHJlYW0ucHVzaCgwKTsKc3RyZWFtLnB1c2goNzMpO3N0cmVhbS5wdXNoKDY5KTtzdHJlYW0ucHVzaCg3OCk7c3RyZWFtLnB1c2goNjgpO3N0cmVhbS5wdXNoKDE3NCk7c3RyZWFtLnB1c2goNjYpO3N0cmVhbS5wdXNoKDk2KTtzdHJlYW0ucHVzaCgxMzApO3JldHVybiJkYXRhOmltYWdlL3BuZztiYXNlNjQsIitiYXNlNjQoc3RyZWFtKX07bnVtZXJpYy5fZGltPWZ1bmN0aW9uIF9kaW0oeCl7dmFyIHJldD1bXTt3aGlsZSh0eXBlb2YgeD09PSJvYmplY3QiKXtyZXQucHVzaCh4Lmxlbmd0aCk7eD14WzBdfXJldHVybiByZXR9O251bWVyaWMuZGltPWZ1bmN0aW9uIGRpbSh4KXt2YXIgeSx6O2lmKHR5cGVvZiB4PT09Im9iamVjdCIpe3k9eFswXTtpZih0eXBlb2YgeT09PSJvYmplY3QiKXt6PXlbMF07aWYodHlwZW9mIHo9PT0ib2JqZWN0IilyZXR1cm4gbnVtZXJpYy5fZGltKHgpO3JldHVyblt4Lmxlbmd0aCx5Lmxlbmd0aF19cmV0dXJuW3gubGVuZ3RoXX1yZXR1cm5bXX07Cm51bWVyaWMubWFwcmVkdWNlPWZ1bmN0aW9uIG1hcHJlZHVjZShib2R5LGluaXQpe3JldHVybiBGdW5jdGlvbigieCIsImFjY3VtIiwiX3MiLCJfayIsJ2lmKHR5cGVvZiBhY2N1bSBceDNkXHgzZFx4M2QgInVuZGVmaW5lZCIpIGFjY3VtIFx4M2QgJytpbml0KyI7XG4iKydpZih0eXBlb2YgeCBceDNkXHgzZFx4M2QgIm51bWJlciIpIHsgdmFyIHhpIFx4M2QgeDsgJytib2R5KyI7IHJldHVybiBhY2N1bTsgfVxuIisnaWYodHlwZW9mIF9zIFx4M2RceDNkXHgzZCAidW5kZWZpbmVkIikgX3MgXHgzZCBudW1lcmljLmRpbSh4KTtcbicrJ2lmKHR5cGVvZiBfayBceDNkXHgzZFx4M2QgInVuZGVmaW5lZCIpIF9rIFx4M2QgMDtcbicrInZhciBfbiBceDNkIF9zW19rXTtcbiIrInZhciBpLHhpO1xuIisiaWYoX2sgXHgzYyBfcy5sZW5ndGgtMSkge1xuIisiICAgIGZvcihpXHgzZF9uLTE7aVx4M2VceDNkMDtpLS0pIHtcbiIrIiAgICAgICAgYWNjdW0gXHgzZCBhcmd1bWVudHMuY2FsbGVlKHhbaV0sYWNjdW0sX3MsX2srMSk7XG4iKwoiICAgIH0iKyIgICAgcmV0dXJuIGFjY3VtO1xuIisifVxuIisiZm9yKGlceDNkX24tMTtpXHgzZVx4M2QxO2ktXHgzZDIpIHsgXG4iKyIgICAgeGkgXHgzZCB4W2ldO1xuIisiICAgICIrYm9keSsiO1xuIisiICAgIHhpIFx4M2QgeFtpLTFdO1xuIisiICAgICIrYm9keSsiO1xuIisifVxuIisiaWYoaSBceDNkXHgzZFx4M2QgMCkge1xuIisiICAgIHhpIFx4M2QgeFtpXTtcbiIrIiAgICAiK2JvZHkrIlxuIisifVxuIisicmV0dXJuIGFjY3VtOyIpfTtudW1lcmljLm1hcHJlZHVjZTI9ZnVuY3Rpb24gbWFwcmVkdWNlMihib2R5LHNldHVwKXtyZXR1cm4gRnVuY3Rpb24oIngiLCJ2YXIgbiBceDNkIHgubGVuZ3RoO1xuIisidmFyIGkseGk7XG4iK3NldHVwKyI7XG4iKyJmb3IoaVx4M2RuLTE7aSFceDNkXHgzZC0xOy0taSkgeyBcbiIrIiAgICB4aSBceDNkIHhbaV07XG4iKyIgICAgIitib2R5KyI7XG4iKyJ9XG4iKyJyZXR1cm4gYWNjdW07Iil9OwpudW1lcmljLnNhbWU9ZnVuY3Rpb24gc2FtZSh4LHkpe3ZhciBpLG47aWYoISh4IGluc3RhbmNlb2YgQXJyYXkpfHwhKHkgaW5zdGFuY2VvZiBBcnJheSkpcmV0dXJuIGZhbHNlO249eC5sZW5ndGg7aWYobiE9PXkubGVuZ3RoKXJldHVybiBmYWxzZTtmb3IoaT0wO2k8bjtpKyspe2lmKHhbaV09PT15W2ldKWNvbnRpbnVlO2lmKHR5cGVvZiB4W2ldPT09Im9iamVjdCIpe2lmKCFzYW1lKHhbaV0seVtpXSkpcmV0dXJuIGZhbHNlfWVsc2UgcmV0dXJuIGZhbHNlfXJldHVybiB0cnVlfTtudW1lcmljLnJlcD1mdW5jdGlvbiByZXAocyx2LGspe2lmKHR5cGVvZiBrPT09InVuZGVmaW5lZCIpaz0wO3ZhciBuPXNba10scmV0PUFycmF5KG4pLGk7aWYoaz09PXMubGVuZ3RoLTEpe2ZvcihpPW4tMjtpPj0wO2ktPTIpe3JldFtpKzFdPXY7cmV0W2ldPXZ9aWYoaT09PS0xKXJldFswXT12O3JldHVybiByZXR9Zm9yKGk9bi0xO2k+PTA7aS0tKXJldFtpXT1udW1lcmljLnJlcChzLHYsaysxKTtyZXR1cm4gcmV0fTsKbnVtZXJpYy5kb3RNTXNtYWxsPWZ1bmN0aW9uIGRvdE1Nc21hbGwoeCx5KXt2YXIgaSxqLGsscCxxLHIscmV0LGZvbyxiYXIsd29vLGkwLGswLHAwLHIwO3A9eC5sZW5ndGg7cT15Lmxlbmd0aDtyPXlbMF0ubGVuZ3RoO3JldD1BcnJheShwKTtmb3IoaT1wLTE7aT49MDtpLS0pe2Zvbz1BcnJheShyKTtiYXI9eFtpXTtmb3Ioaz1yLTE7az49MDtrLS0pe3dvbz1iYXJbcS0xXSp5W3EtMV1ba107Zm9yKGo9cS0yO2o+PTE7ai09Mil7aTA9ai0xO3dvbys9YmFyW2pdKnlbal1ba10rYmFyW2kwXSp5W2kwXVtrXX1pZihqPT09MCl3b28rPWJhclswXSp5WzBdW2tdO2Zvb1trXT13b299cmV0W2ldPWZvb31yZXR1cm4gcmV0fTtudW1lcmljLl9nZXRDb2w9ZnVuY3Rpb24gX2dldENvbChBLGoseCl7dmFyIG49QS5sZW5ndGgsaTtmb3IoaT1uLTE7aT4wOy0taSl7eFtpXT1BW2ldW2pdOy0taTt4W2ldPUFbaV1bal19aWYoaT09PTApeFswXT1BWzBdW2pdfTsKbnVtZXJpYy5kb3RNTWJpZz1mdW5jdGlvbiBkb3RNTWJpZyh4LHkpe3ZhciBnYz1udW1lcmljLl9nZXRDb2wscD15Lmxlbmd0aCx2PUFycmF5KHApO3ZhciBtPXgubGVuZ3RoLG49eVswXS5sZW5ndGgsQT1uZXcgQXJyYXkobSkseGo7dmFyIFZWPW51bWVyaWMuZG90VlY7dmFyIGksaixrLHo7LS1wOy0tbTtmb3IoaT1tO2khPT0tMTstLWkpQVtpXT1BcnJheShuKTstLW47Zm9yKGk9bjtpIT09LTE7LS1pKXtnYyh5LGksdik7Zm9yKGo9bTtqIT09LTE7LS1qKXt6PTA7eGo9eFtqXTtBW2pdW2ldPVZWKHhqLHYpfX1yZXR1cm4gQX07bnVtZXJpYy5kb3RNVj1mdW5jdGlvbiBkb3RNVih4LHkpe3ZhciBwPXgubGVuZ3RoLHE9eS5sZW5ndGgsaTt2YXIgcmV0PUFycmF5KHApLGRvdFZWPW51bWVyaWMuZG90VlY7Zm9yKGk9cC0xO2k+PTA7aS0tKXJldFtpXT1kb3RWVih4W2ldLHkpO3JldHVybiByZXR9OwpudW1lcmljLmRvdFZNPWZ1bmN0aW9uIGRvdFZNKHgseSl7dmFyIGksaixrLHAscSxyLHJldCxmb28sYmFyLHdvbyxpMCxrMCxwMCxyMCxzMSxzMixzMyxiYXosYWNjdW07cD14Lmxlbmd0aDtxPXlbMF0ubGVuZ3RoO3JldD1BcnJheShxKTtmb3Ioaz1xLTE7az49MDtrLS0pe3dvbz14W3AtMV0qeVtwLTFdW2tdO2ZvcihqPXAtMjtqPj0xO2otPTIpe2kwPWotMTt3b28rPXhbal0qeVtqXVtrXSt4W2kwXSp5W2kwXVtrXX1pZihqPT09MCl3b28rPXhbMF0qeVswXVtrXTtyZXRba109d29vfXJldHVybiByZXR9O251bWVyaWMuZG90VlY9ZnVuY3Rpb24gZG90VlYoeCx5KXt2YXIgaSxuPXgubGVuZ3RoLGkxLHJldD14W24tMV0qeVtuLTFdO2ZvcihpPW4tMjtpPj0xO2ktPTIpe2kxPWktMTtyZXQrPXhbaV0qeVtpXSt4W2kxXSp5W2kxXX1pZihpPT09MClyZXQrPXhbMF0qeVswXTtyZXR1cm4gcmV0fTsKbnVtZXJpYy5kb3Q9ZnVuY3Rpb24gZG90KHgseSl7dmFyIGQ9bnVtZXJpYy5kaW07c3dpdGNoKGQoeCkubGVuZ3RoKjFFMytkKHkpLmxlbmd0aCl7Y2FzZSAyMDAyOmlmKHkubGVuZ3RoPDEwKXJldHVybiBudW1lcmljLmRvdE1Nc21hbGwoeCx5KTtlbHNlIHJldHVybiBudW1lcmljLmRvdE1NYmlnKHgseSk7Y2FzZSAyMDAxOnJldHVybiBudW1lcmljLmRvdE1WKHgseSk7Y2FzZSAxMDAyOnJldHVybiBudW1lcmljLmRvdFZNKHgseSk7Y2FzZSAxMDAxOnJldHVybiBudW1lcmljLmRvdFZWKHgseSk7Y2FzZSAxRTM6cmV0dXJuIG51bWVyaWMubXVsVlMoeCx5KTtjYXNlIDE6cmV0dXJuIG51bWVyaWMubXVsU1YoeCx5KTtjYXNlIDA6cmV0dXJuIHgqeTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcigibnVtZXJpYy5kb3Qgb25seSB3b3JrcyBvbiB2ZWN0b3JzIGFuZCBtYXRyaWNlcyIpO319OwpudW1lcmljLmRpYWc9ZnVuY3Rpb24gZGlhZyhkKXt2YXIgaSxpMSxqLG49ZC5sZW5ndGgsQT1BcnJheShuKSxBaTtmb3IoaT1uLTE7aT49MDtpLS0pe0FpPUFycmF5KG4pO2kxPWkrMjtmb3Ioaj1uLTE7aj49aTE7ai09Mil7QWlbal09MDtBaVtqLTFdPTB9aWYoaj5pKUFpW2pdPTA7QWlbaV09ZFtpXTtmb3Ioaj1pLTE7aj49MTtqLT0yKXtBaVtqXT0wO0FpW2otMV09MH1pZihqPT09MClBaVswXT0wO0FbaV09QWl9cmV0dXJuIEF9O251bWVyaWMuZ2V0RGlhZz1mdW5jdGlvbihBKXt2YXIgbj1NYXRoLm1pbihBLmxlbmd0aCxBWzBdLmxlbmd0aCksaSxyZXQ9QXJyYXkobik7Zm9yKGk9bi0xO2k+PTE7LS1pKXtyZXRbaV09QVtpXVtpXTstLWk7cmV0W2ldPUFbaV1baV19aWYoaT09PTApcmV0WzBdPUFbMF1bMF07cmV0dXJuIHJldH07bnVtZXJpYy5pZGVudGl0eT1mdW5jdGlvbiBpZGVudGl0eShuKXtyZXR1cm4gbnVtZXJpYy5kaWFnKG51bWVyaWMucmVwKFtuXSwxKSl9OwpudW1lcmljLnBvaW50d2lzZT1mdW5jdGlvbiBwb2ludHdpc2UocGFyYW1zLGJvZHksc2V0dXApe2lmKHR5cGVvZiBzZXR1cD09PSJ1bmRlZmluZWQiKXNldHVwPSIiO3ZhciBmdW49W107dmFyIGs7dmFyIGF2ZWM9L1xbaVxdJC8scCx0aGV2ZWM9IiI7dmFyIGhhdmVyZXQ9ZmFsc2U7Zm9yKGs9MDtrPHBhcmFtcy5sZW5ndGg7aysrKXtpZihhdmVjLnRlc3QocGFyYW1zW2tdKSl7cD1wYXJhbXNba10uc3Vic3RyaW5nKDAscGFyYW1zW2tdLmxlbmd0aC0zKTt0aGV2ZWM9cH1lbHNlIHA9cGFyYW1zW2tdO2lmKHA9PT0icmV0IiloYXZlcmV0PXRydWU7ZnVuLnB1c2gocCl9ZnVuW3BhcmFtcy5sZW5ndGhdPSJfcyI7ZnVuW3BhcmFtcy5sZW5ndGgrMV09Il9rIjtmdW5bcGFyYW1zLmxlbmd0aCsyXT0naWYodHlwZW9mIF9zIFx4M2RceDNkXHgzZCAidW5kZWZpbmVkIikgX3MgXHgzZCBudW1lcmljLmRpbSgnK3RoZXZlYysiKTtcbiIrJ2lmKHR5cGVvZiBfayBceDNkXHgzZFx4M2QgInVuZGVmaW5lZCIpIF9rIFx4M2QgMDtcbicrCiJ2YXIgX24gXHgzZCBfc1tfa107XG4iKyJ2YXIgaSIrKGhhdmVyZXQ/IiI6IiwgcmV0IFx4M2QgQXJyYXkoX24pIikrIjtcbiIrImlmKF9rIFx4M2MgX3MubGVuZ3RoLTEpIHtcbiIrIiAgICBmb3IoaVx4M2Rfbi0xO2lceDNlXHgzZDA7aS0tKSByZXRbaV0gXHgzZCBhcmd1bWVudHMuY2FsbGVlKCIrcGFyYW1zLmpvaW4oIiwiKSsiLF9zLF9rKzEpO1xuIisiICAgIHJldHVybiByZXQ7XG4iKyJ9XG4iK3NldHVwKyJcbiIrImZvcihpXHgzZF9uLTE7aSFceDNkXHgzZC0xOy0taSkge1xuIisiICAgICIrYm9keSsiXG4iKyJ9XG4iKyJyZXR1cm4gcmV0OyI7cmV0dXJuIEZ1bmN0aW9uLmFwcGx5KG51bGwsZnVuKX07Cm51bWVyaWMucG9pbnR3aXNlMj1mdW5jdGlvbiBwb2ludHdpc2UyKHBhcmFtcyxib2R5LHNldHVwKXtpZih0eXBlb2Ygc2V0dXA9PT0idW5kZWZpbmVkIilzZXR1cD0iIjt2YXIgZnVuPVtdO3ZhciBrO3ZhciBhdmVjPS9cW2lcXSQvLHAsdGhldmVjPSIiO3ZhciBoYXZlcmV0PWZhbHNlO2ZvcihrPTA7azxwYXJhbXMubGVuZ3RoO2srKyl7aWYoYXZlYy50ZXN0KHBhcmFtc1trXSkpe3A9cGFyYW1zW2tdLnN1YnN0cmluZygwLHBhcmFtc1trXS5sZW5ndGgtMyk7dGhldmVjPXB9ZWxzZSBwPXBhcmFtc1trXTtpZihwPT09InJldCIpaGF2ZXJldD10cnVlO2Z1bi5wdXNoKHApfWZ1bltwYXJhbXMubGVuZ3RoXT0idmFyIF9uIFx4M2QgIit0aGV2ZWMrIi5sZW5ndGg7XG4iKyJ2YXIgaSIrKGhhdmVyZXQ/IiI6IiwgcmV0IFx4M2QgQXJyYXkoX24pIikrIjtcbiIrc2V0dXArIlxuIisiZm9yKGlceDNkX24tMTtpIVx4M2RceDNkLTE7LS1pKSB7XG4iK2JvZHkrIlxuIisifVxuIisicmV0dXJuIHJldDsiOwpyZXR1cm4gRnVuY3Rpb24uYXBwbHkobnVsbCxmdW4pfTtudW1lcmljLl9iaWZvcmVhY2g9ZnVuY3Rpb24gX2JpZm9yZWFjaCh4LHkscyxrLGYpe2lmKGs9PT1zLmxlbmd0aC0xKXtmKHgseSk7cmV0dXJufXZhciBpLG49c1trXTtmb3IoaT1uLTE7aT49MDtpLS0pX2JpZm9yZWFjaCh0eXBlb2YgeD09PSJvYmplY3QiP3hbaV06eCx0eXBlb2YgeT09PSJvYmplY3QiP3lbaV06eSxzLGsrMSxmKX07bnVtZXJpYy5fYmlmb3JlYWNoMj1mdW5jdGlvbiBfYmlmb3JlYWNoMih4LHkscyxrLGYpe2lmKGs9PT1zLmxlbmd0aC0xKXJldHVybiBmKHgseSk7dmFyIGksbj1zW2tdLHJldD1BcnJheShuKTtmb3IoaT1uLTE7aT49MDstLWkpcmV0W2ldPV9iaWZvcmVhY2gyKHR5cGVvZiB4PT09Im9iamVjdCI/eFtpXTp4LHR5cGVvZiB5PT09Im9iamVjdCI/eVtpXTp5LHMsaysxLGYpO3JldHVybiByZXR9OwpudW1lcmljLl9mb3JlYWNoPWZ1bmN0aW9uIF9mb3JlYWNoKHgscyxrLGYpe2lmKGs9PT1zLmxlbmd0aC0xKXtmKHgpO3JldHVybn12YXIgaSxuPXNba107Zm9yKGk9bi0xO2k+PTA7aS0tKV9mb3JlYWNoKHhbaV0scyxrKzEsZil9O251bWVyaWMuX2ZvcmVhY2gyPWZ1bmN0aW9uIF9mb3JlYWNoMih4LHMsayxmKXtpZihrPT09cy5sZW5ndGgtMSlyZXR1cm4gZih4KTt2YXIgaSxuPXNba10scmV0PUFycmF5KG4pO2ZvcihpPW4tMTtpPj0wO2ktLSlyZXRbaV09X2ZvcmVhY2gyKHhbaV0scyxrKzEsZik7cmV0dXJuIHJldH07Cm51bWVyaWMub3BzMj17YWRkOiIrIixzdWI6Ii0iLG11bDoiKiIsZGl2OiIvIixtb2Q6IiUiLGFuZDoiXHgyNlx4MjYiLG9yOiJ8fCIsZXE6Ilx4M2RceDNkXHgzZCIsbmVxOiIhXHgzZFx4M2QiLGx0OiJceDNjIixndDoiXHgzZSIsbGVxOiJceDNjXHgzZCIsZ2VxOiJceDNlXHgzZCIsYmFuZDoiXHgyNiIsYm9yOiJ8IixieG9yOiJeIixsc2hpZnQ6Ilx4M2NceDNjIixyc2hpZnQ6Ilx4M2VceDNlIixycnNoaWZ0OiJceDNlXHgzZVx4M2UifTtudW1lcmljLm9wc2VxPXthZGRlcToiK1x4M2QiLHN1YmVxOiItXHgzZCIsbXVsZXE6IipceDNkIixkaXZlcToiL1x4M2QiLG1vZGVxOiIlXHgzZCIsbHNoaWZ0ZXE6Ilx4M2NceDNjXHgzZCIscnNoaWZ0ZXE6Ilx4M2VceDNlXHgzZCIscnJzaGlmdGVxOiJceDNlXHgzZVx4M2VceDNkIixiYW5kZXE6Ilx4MjZceDNkIixib3JlcToifFx4M2QiLGJ4b3JlcToiXlx4M2QifTsKbnVtZXJpYy5tYXRoZnVucz1bImFicyIsImFjb3MiLCJhc2luIiwiYXRhbiIsImNlaWwiLCJjb3MiLCJleHAiLCJmbG9vciIsImxvZyIsInJvdW5kIiwic2luIiwic3FydCIsInRhbiIsImlzTmFOIiwiaXNGaW5pdGUiXTtudW1lcmljLm1hdGhmdW5zMj1bImF0YW4yIiwicG93IiwibWF4IiwibWluIl07bnVtZXJpYy5vcHMxPXtuZWc6Ii0iLG5vdDoiISIsYm5vdDoifiIsY2xvbmU6IiJ9OwpudW1lcmljLm1hcHJlZHVjZXJzPXthbnk6WyJpZih4aSkgcmV0dXJuIHRydWU7IiwidmFyIGFjY3VtIFx4M2QgZmFsc2U7Il0sYWxsOlsiaWYoIXhpKSByZXR1cm4gZmFsc2U7IiwidmFyIGFjY3VtIFx4M2QgdHJ1ZTsiXSxzdW06WyJhY2N1bSArXHgzZCB4aTsiLCJ2YXIgYWNjdW0gXHgzZCAwOyJdLHByb2Q6WyJhY2N1bSAqXHgzZCB4aTsiLCJ2YXIgYWNjdW0gXHgzZCAxOyJdLG5vcm0yU3F1YXJlZDpbImFjY3VtICtceDNkIHhpKnhpOyIsInZhciBhY2N1bSBceDNkIDA7Il0sbm9ybWluZjpbImFjY3VtIFx4M2QgbWF4KGFjY3VtLGFicyh4aSkpOyIsInZhciBhY2N1bSBceDNkIDAsIG1heCBceDNkIE1hdGgubWF4LCBhYnMgXHgzZCBNYXRoLmFiczsiXSxub3JtMTpbImFjY3VtICtceDNkIGFicyh4aSkiLCJ2YXIgYWNjdW0gXHgzZCAwLCBhYnMgXHgzZCBNYXRoLmFiczsiXSxzdXA6WyJhY2N1bSBceDNkIG1heChhY2N1bSx4aSk7IiwidmFyIGFjY3VtIFx4M2QgLUluZmluaXR5LCBtYXggXHgzZCBNYXRoLm1heDsiXSwKaW5mOlsiYWNjdW0gXHgzZCBtaW4oYWNjdW0seGkpOyIsInZhciBhY2N1bSBceDNkIEluZmluaXR5LCBtaW4gXHgzZCBNYXRoLm1pbjsiXX07CihmdW5jdGlvbigpe3ZhciBpLG87Zm9yKGk9MDtpPG51bWVyaWMubWF0aGZ1bnMyLmxlbmd0aDsrK2kpe289bnVtZXJpYy5tYXRoZnVuczJbaV07bnVtZXJpYy5vcHMyW29dPW99Zm9yKGkgaW4gbnVtZXJpYy5vcHMyKWlmKG51bWVyaWMub3BzMi5oYXNPd25Qcm9wZXJ0eShpKSl7bz1udW1lcmljLm9wczJbaV07dmFyIGNvZGUsY29kZWVxLHNldHVwPSIiO2lmKG51bWVyaWMubXlJbmRleE9mLmNhbGwobnVtZXJpYy5tYXRoZnVuczIsaSkhPT0tMSl7c2V0dXA9InZhciAiK28rIiBceDNkIE1hdGguIitvKyI7XG4iO2NvZGU9ZnVuY3Rpb24ocix4LHkpe3JldHVybiByKyIgXHgzZCAiK28rIigiK3grIiwiK3krIikifTtjb2RlZXE9ZnVuY3Rpb24oeCx5KXtyZXR1cm4geCsiIFx4M2QgIitvKyIoIit4KyIsIit5KyIpIn19ZWxzZXtjb2RlPWZ1bmN0aW9uKHIseCx5KXtyZXR1cm4gcisiIFx4M2QgIit4KyIgIitvKyIgIit5fTtpZihudW1lcmljLm9wc2VxLmhhc093blByb3BlcnR5KGkrImVxIikpY29kZWVxPQpmdW5jdGlvbih4LHkpe3JldHVybiB4KyIgIitvKyJceDNkICIreX07ZWxzZSBjb2RlZXE9ZnVuY3Rpb24oeCx5KXtyZXR1cm4geCsiIFx4M2QgIit4KyIgIitvKyIgIit5fX1udW1lcmljW2krIlZWIl09bnVtZXJpYy5wb2ludHdpc2UyKFsieFtpXSIsInlbaV0iXSxjb2RlKCJyZXRbaV0iLCJ4W2ldIiwieVtpXSIpLHNldHVwKTtudW1lcmljW2krIlNWIl09bnVtZXJpYy5wb2ludHdpc2UyKFsieCIsInlbaV0iXSxjb2RlKCJyZXRbaV0iLCJ4IiwieVtpXSIpLHNldHVwKTtudW1lcmljW2krIlZTIl09bnVtZXJpYy5wb2ludHdpc2UyKFsieFtpXSIsInkiXSxjb2RlKCJyZXRbaV0iLCJ4W2ldIiwieSIpLHNldHVwKTtudW1lcmljW2ldPUZ1bmN0aW9uKCJ2YXIgbiBceDNkIGFyZ3VtZW50cy5sZW5ndGgsIGksIHggXHgzZCBhcmd1bWVudHNbMF0sIHk7XG4iKyJ2YXIgVlYgXHgzZCBudW1lcmljLiIraSsiVlYsIFZTIFx4M2QgbnVtZXJpYy4iK2krIlZTLCBTViBceDNkIG51bWVyaWMuIisKaSsiU1Y7XG4iKyJ2YXIgZGltIFx4M2QgbnVtZXJpYy5kaW07XG4iKyJmb3IoaVx4M2QxO2khXHgzZFx4M2RuOysraSkgeyBcbiIrIiAgeSBceDNkIGFyZ3VtZW50c1tpXTtcbiIrJyAgaWYodHlwZW9mIHggXHgzZFx4M2RceDNkICJvYmplY3QiKSB7XG4nKycgICAgICBpZih0eXBlb2YgeSBceDNkXHgzZFx4M2QgIm9iamVjdCIpIHggXHgzZCBudW1lcmljLl9iaWZvcmVhY2gyKHgseSxkaW0oeCksMCxWVik7XG4nKyIgICAgICBlbHNlIHggXHgzZCBudW1lcmljLl9iaWZvcmVhY2gyKHgseSxkaW0oeCksMCxWUyk7XG4iKycgIH0gZWxzZSBpZih0eXBlb2YgeSBceDNkXHgzZFx4M2QgIm9iamVjdCIpIHggXHgzZCBudW1lcmljLl9iaWZvcmVhY2gyKHgseSxkaW0oeSksMCxTVik7XG4nKyIgIGVsc2UgIitjb2RlZXEoIngiLCJ5IikrIlxuIisifVxucmV0dXJuIHg7XG4iKTtudW1lcmljW29dPW51bWVyaWNbaV07bnVtZXJpY1tpKyJlcVYiXT1udW1lcmljLnBvaW50d2lzZTIoWyJyZXRbaV0iLAoieFtpXSJdLGNvZGVlcSgicmV0W2ldIiwieFtpXSIpLHNldHVwKTtudW1lcmljW2krImVxUyJdPW51bWVyaWMucG9pbnR3aXNlMihbInJldFtpXSIsIngiXSxjb2RlZXEoInJldFtpXSIsIngiKSxzZXR1cCk7bnVtZXJpY1tpKyJlcSJdPUZ1bmN0aW9uKCJ2YXIgbiBceDNkIGFyZ3VtZW50cy5sZW5ndGgsIGksIHggXHgzZCBhcmd1bWVudHNbMF0sIHk7XG4iKyJ2YXIgViBceDNkIG51bWVyaWMuIitpKyJlcVYsIFMgXHgzZCBudW1lcmljLiIraSsiZXFTXG4iKyJ2YXIgcyBceDNkIG51bWVyaWMuZGltKHgpO1xuIisiZm9yKGlceDNkMTtpIVx4M2RceDNkbjsrK2kpIHsgXG4iKyIgIHkgXHgzZCBhcmd1bWVudHNbaV07XG4iKycgIGlmKHR5cGVvZiB5IFx4M2RceDNkXHgzZCAib2JqZWN0IikgbnVtZXJpYy5fYmlmb3JlYWNoKHgseSxzLDAsVik7XG4nKyIgIGVsc2UgbnVtZXJpYy5fYmlmb3JlYWNoKHgseSxzLDAsUyk7XG4iKyJ9XG5yZXR1cm4geDtcbiIpfWZvcihpPTA7aTxudW1lcmljLm1hdGhmdW5zMi5sZW5ndGg7KytpKXtvPQpudW1lcmljLm1hdGhmdW5zMltpXTtkZWxldGUgbnVtZXJpYy5vcHMyW29dfWZvcihpPTA7aTxudW1lcmljLm1hdGhmdW5zLmxlbmd0aDsrK2kpe289bnVtZXJpYy5tYXRoZnVuc1tpXTtudW1lcmljLm9wczFbb109b31mb3IoaSBpbiBudW1lcmljLm9wczEpaWYobnVtZXJpYy5vcHMxLmhhc093blByb3BlcnR5KGkpKXtzZXR1cD0iIjtvPW51bWVyaWMub3BzMVtpXTtpZihudW1lcmljLm15SW5kZXhPZi5jYWxsKG51bWVyaWMubWF0aGZ1bnMsaSkhPT0tMSlpZihNYXRoLmhhc093blByb3BlcnR5KG8pKXNldHVwPSJ2YXIgIitvKyIgXHgzZCBNYXRoLiIrbysiO1xuIjtudW1lcmljW2krImVxViJdPW51bWVyaWMucG9pbnR3aXNlMihbInJldFtpXSJdLCJyZXRbaV0gXHgzZCAiK28rIihyZXRbaV0pOyIsc2V0dXApO251bWVyaWNbaSsiZXEiXT1GdW5jdGlvbigieCIsJ2lmKHR5cGVvZiB4ICFceDNkXHgzZCAib2JqZWN0IikgcmV0dXJuICcrbysieFxuIisidmFyIGk7XG4iKyJ2YXIgViBceDNkIG51bWVyaWMuIisKaSsiZXFWO1xuIisidmFyIHMgXHgzZCBudW1lcmljLmRpbSh4KTtcbiIrIm51bWVyaWMuX2ZvcmVhY2goeCxzLDAsVik7XG4iKyJyZXR1cm4geDtcbiIpO251bWVyaWNbaSsiViJdPW51bWVyaWMucG9pbnR3aXNlMihbInhbaV0iXSwicmV0W2ldIFx4M2QgIitvKyIoeFtpXSk7IixzZXR1cCk7bnVtZXJpY1tpXT1GdW5jdGlvbigieCIsJ2lmKHR5cGVvZiB4ICFceDNkXHgzZCAib2JqZWN0IikgcmV0dXJuICcrbysiKHgpXG4iKyJ2YXIgaTtcbiIrInZhciBWIFx4M2QgbnVtZXJpYy4iK2krIlY7XG4iKyJ2YXIgcyBceDNkIG51bWVyaWMuZGltKHgpO1xuIisicmV0dXJuIG51bWVyaWMuX2ZvcmVhY2gyKHgscywwLFYpO1xuIil9Zm9yKGk9MDtpPG51bWVyaWMubWF0aGZ1bnMubGVuZ3RoOysraSl7bz1udW1lcmljLm1hdGhmdW5zW2ldO2RlbGV0ZSBudW1lcmljLm9wczFbb119Zm9yKGkgaW4gbnVtZXJpYy5tYXByZWR1Y2VycylpZihudW1lcmljLm1hcHJlZHVjZXJzLmhhc093blByb3BlcnR5KGkpKXtvPQpudW1lcmljLm1hcHJlZHVjZXJzW2ldO251bWVyaWNbaSsiViJdPW51bWVyaWMubWFwcmVkdWNlMihvWzBdLG9bMV0pO251bWVyaWNbaV09RnVuY3Rpb24oIngiLCJzIiwiayIsb1sxXSsnaWYodHlwZW9mIHggIVx4M2RceDNkICJvYmplY3QiKSB7JysiICAgIHhpIFx4M2QgeDtcbiIrb1swXSsiO1xuIisiICAgIHJldHVybiBhY2N1bTtcbiIrIn0iKydpZih0eXBlb2YgcyBceDNkXHgzZFx4M2QgInVuZGVmaW5lZCIpIHMgXHgzZCBudW1lcmljLmRpbSh4KTtcbicrJ2lmKHR5cGVvZiBrIFx4M2RceDNkXHgzZCAidW5kZWZpbmVkIikgayBceDNkIDA7XG4nKyJpZihrIFx4M2RceDNkXHgzZCBzLmxlbmd0aC0xKSByZXR1cm4gbnVtZXJpYy4iK2krIlYoeCk7XG4iKyJ2YXIgeGk7XG4iKyJ2YXIgbiBceDNkIHgubGVuZ3RoLCBpO1xuIisiZm9yKGlceDNkbi0xO2khXHgzZFx4M2QtMTstLWkpIHtcbiIrIiAgIHhpIFx4M2QgYXJndW1lbnRzLmNhbGxlZSh4W2ldKTtcbiIrb1swXSsiO1xuIisKIn1cbiIrInJldHVybiBhY2N1bTtcbiIpfX0pKCk7bnVtZXJpYy50cnVuY1ZWPW51bWVyaWMucG9pbnR3aXNlKFsieFtpXSIsInlbaV0iXSwicmV0W2ldIFx4M2Qgcm91bmQoeFtpXS95W2ldKSp5W2ldOyIsInZhciByb3VuZCBceDNkIE1hdGgucm91bmQ7Iik7bnVtZXJpYy50cnVuY1ZTPW51bWVyaWMucG9pbnR3aXNlKFsieFtpXSIsInkiXSwicmV0W2ldIFx4M2Qgcm91bmQoeFtpXS95KSp5OyIsInZhciByb3VuZCBceDNkIE1hdGgucm91bmQ7Iik7bnVtZXJpYy50cnVuY1NWPW51bWVyaWMucG9pbnR3aXNlKFsieCIsInlbaV0iXSwicmV0W2ldIFx4M2Qgcm91bmQoeC95W2ldKSp5W2ldOyIsInZhciByb3VuZCBceDNkIE1hdGgucm91bmQ7Iik7Cm51bWVyaWMudHJ1bmM9ZnVuY3Rpb24gdHJ1bmMoeCx5KXtpZih0eXBlb2YgeD09PSJvYmplY3QiKXtpZih0eXBlb2YgeT09PSJvYmplY3QiKXJldHVybiBudW1lcmljLnRydW5jVlYoeCx5KTtyZXR1cm4gbnVtZXJpYy50cnVuY1ZTKHgseSl9aWYodHlwZW9mIHk9PT0ib2JqZWN0IilyZXR1cm4gbnVtZXJpYy50cnVuY1NWKHgseSk7cmV0dXJuIE1hdGgucm91bmQoeC95KSp5fTsKbnVtZXJpYy5pbnY9ZnVuY3Rpb24gaW52KHgpe3ZhciBzPW51bWVyaWMuZGltKHgpLGFicz1NYXRoLmFicyxtPXNbMF0sbj1zWzFdO3ZhciBBPW51bWVyaWMuY2xvbmUoeCksQWksQWo7dmFyIEk9bnVtZXJpYy5pZGVudGl0eShtKSxJaSxJajt2YXIgaSxqLGsseDtmb3Ioaj0wO2o8bjsrK2ope3ZhciBpMD0tMTt2YXIgdjA9LTE7Zm9yKGk9ajtpIT09bTsrK2kpe2s9YWJzKEFbaV1bal0pO2lmKGs+djApe2kwPWk7djA9a319QWo9QVtpMF07QVtpMF09QVtqXTtBW2pdPUFqO0lqPUlbaTBdO0lbaTBdPUlbal07SVtqXT1Jajt4PUFqW2pdO2ZvcihrPWo7ayE9PW47KytrKUFqW2tdLz14O2ZvcihrPW4tMTtrIT09LTE7LS1rKUlqW2tdLz14O2ZvcihpPW0tMTtpIT09LTE7LS1pKWlmKGkhPT1qKXtBaT1BW2ldO0lpPUlbaV07eD1BaVtqXTtmb3Ioaz1qKzE7ayE9PW47KytrKUFpW2tdLT1BaltrXSp4O2ZvcihrPW4tMTtrPjA7LS1rKXtJaVtrXS09SWpba10qeDstLWs7SWlba10tPUlqW2tdKgp4fWlmKGs9PT0wKUlpWzBdLT1JalswXSp4fX1yZXR1cm4gSX07Cm51bWVyaWMuZGV0PWZ1bmN0aW9uIGRldCh4KXt2YXIgcz1udW1lcmljLmRpbSh4KTtpZihzLmxlbmd0aCE9PTJ8fHNbMF0hPT1zWzFdKXRocm93IG5ldyBFcnJvcigibnVtZXJpYzogZGV0KCkgb25seSB3b3JrcyBvbiBzcXVhcmUgbWF0cmljZXMiKTt2YXIgbj1zWzBdLHJldD0xLGksaixrLEE9bnVtZXJpYy5jbG9uZSh4KSxBaixBaSxhbHBoYSx0ZW1wLGsxLGsyLGszO2ZvcihqPTA7ajxuLTE7aisrKXtrPWo7Zm9yKGk9aisxO2k8bjtpKyspaWYoTWF0aC5hYnMoQVtpXVtqXSk+TWF0aC5hYnMoQVtrXVtqXSkpaz1pO2lmKGshPT1qKXt0ZW1wPUFba107QVtrXT1BW2pdO0Fbal09dGVtcDtyZXQqPS0xfUFqPUFbal07Zm9yKGk9aisxO2k8bjtpKyspe0FpPUFbaV07YWxwaGE9QWlbal0vQWpbal07Zm9yKGs9aisxO2s8bi0xO2srPTIpe2sxPWsrMTtBaVtrXS09QWpba10qYWxwaGE7QWlbazFdLT1BaltrMV0qYWxwaGF9aWYoayE9PW4pQWlba10tPUFqW2tdKmFscGhhfWlmKEFqW2pdPT09CjApcmV0dXJuIDA7cmV0Kj1BaltqXX1yZXR1cm4gcmV0KkFbal1bal19O251bWVyaWMudHJhbnNwb3NlPWZ1bmN0aW9uIHRyYW5zcG9zZSh4KXt2YXIgaSxqLG09eC5sZW5ndGgsbj14WzBdLmxlbmd0aCxyZXQ9QXJyYXkobiksQTAsQTEsQmo7Zm9yKGo9MDtqPG47aisrKXJldFtqXT1BcnJheShtKTtmb3IoaT1tLTE7aT49MTtpLT0yKXtBMT14W2ldO0EwPXhbaS0xXTtmb3Ioaj1uLTE7aj49MTstLWope0JqPXJldFtqXTtCaltpXT1BMVtqXTtCaltpLTFdPUEwW2pdOy0tajtCaj1yZXRbal07QmpbaV09QTFbal07QmpbaS0xXT1BMFtqXX1pZihqPT09MCl7Qmo9cmV0WzBdO0JqW2ldPUExWzBdO0JqW2ktMV09QTBbMF19fWlmKGk9PT0wKXtBMD14WzBdO2ZvcihqPW4tMTtqPj0xOy0tail7cmV0W2pdWzBdPUEwW2pdOy0tajtyZXRbal1bMF09QTBbal19aWYoaj09PTApcmV0WzBdWzBdPUEwWzBdfXJldHVybiByZXR9OwpudW1lcmljLm5lZ3RyYW5zcG9zZT1mdW5jdGlvbiBuZWd0cmFuc3Bvc2UoeCl7dmFyIGksaixtPXgubGVuZ3RoLG49eFswXS5sZW5ndGgscmV0PUFycmF5KG4pLEEwLEExLEJqO2ZvcihqPTA7ajxuO2orKylyZXRbal09QXJyYXkobSk7Zm9yKGk9bS0xO2k+PTE7aS09Mil7QTE9eFtpXTtBMD14W2ktMV07Zm9yKGo9bi0xO2o+PTE7LS1qKXtCaj1yZXRbal07QmpbaV09LUExW2pdO0JqW2ktMV09LUEwW2pdOy0tajtCaj1yZXRbal07QmpbaV09LUExW2pdO0JqW2ktMV09LUEwW2pdfWlmKGo9PT0wKXtCaj1yZXRbMF07QmpbaV09LUExWzBdO0JqW2ktMV09LUEwWzBdfX1pZihpPT09MCl7QTA9eFswXTtmb3Ioaj1uLTE7aj49MTstLWope3JldFtqXVswXT0tQTBbal07LS1qO3JldFtqXVswXT0tQTBbal19aWYoaj09PTApcmV0WzBdWzBdPS1BMFswXX1yZXR1cm4gcmV0fTsKbnVtZXJpYy5fcmFuZG9tPWZ1bmN0aW9uIF9yYW5kb20ocyxrKXt2YXIgaSxuPXNba10scmV0PUFycmF5KG4pLHJuZDtpZihrPT09cy5sZW5ndGgtMSl7cm5kPU1hdGgucmFuZG9tO2ZvcihpPW4tMTtpPj0xO2ktPTIpe3JldFtpXT1ybmQoKTtyZXRbaS0xXT1ybmQoKX1pZihpPT09MClyZXRbMF09cm5kKCk7cmV0dXJuIHJldH1mb3IoaT1uLTE7aT49MDtpLS0pcmV0W2ldPV9yYW5kb20ocyxrKzEpO3JldHVybiByZXR9O251bWVyaWMucmFuZG9tPWZ1bmN0aW9uIHJhbmRvbShzKXtyZXR1cm4gbnVtZXJpYy5fcmFuZG9tKHMsMCl9O251bWVyaWMubm9ybTI9ZnVuY3Rpb24gbm9ybTIoeCl7cmV0dXJuIE1hdGguc3FydChudW1lcmljLm5vcm0yU3F1YXJlZCh4KSl9OwpudW1lcmljLmxpbnNwYWNlPWZ1bmN0aW9uIGxpbnNwYWNlKGEsYixuKXtpZih0eXBlb2Ygbj09PSJ1bmRlZmluZWQiKW49TWF0aC5tYXgoTWF0aC5yb3VuZChiLWEpKzEsMSk7aWYobjwyKXJldHVybiBuPT09MT9bYV06W107dmFyIGkscmV0PUFycmF5KG4pO24tLTtmb3IoaT1uO2k+PTA7aS0tKXJldFtpXT0oaSpiKyhuLWkpKmEpL247cmV0dXJuIHJldH07bnVtZXJpYy5nZXRCbG9jaz1mdW5jdGlvbiBnZXRCbG9jayh4LGZyb20sdG8pe3ZhciBzPW51bWVyaWMuZGltKHgpO2Z1bmN0aW9uIGZvbyh4LGspe3ZhciBpLGE9ZnJvbVtrXSxuPXRvW2tdLWEscmV0PUFycmF5KG4pO2lmKGs9PT1zLmxlbmd0aC0xKXtmb3IoaT1uO2k+PTA7aS0tKXJldFtpXT14W2krYV07cmV0dXJuIHJldH1mb3IoaT1uO2k+PTA7aS0tKXJldFtpXT1mb28oeFtpK2FdLGsrMSk7cmV0dXJuIHJldH1yZXR1cm4gZm9vKHgsMCl9OwpudW1lcmljLnNldEJsb2NrPWZ1bmN0aW9uIHNldEJsb2NrKHgsZnJvbSx0byxCKXt2YXIgcz1udW1lcmljLmRpbSh4KTtmdW5jdGlvbiBmb28oeCx5LGspe3ZhciBpLGE9ZnJvbVtrXSxuPXRvW2tdLWE7aWYoaz09PXMubGVuZ3RoLTEpZm9yKGk9bjtpPj0wO2ktLSl4W2krYV09eVtpXTtmb3IoaT1uO2k+PTA7aS0tKWZvbyh4W2krYV0seVtpXSxrKzEpfWZvbyh4LEIsMCk7cmV0dXJuIHh9O251bWVyaWMuZ2V0UmFuZ2U9ZnVuY3Rpb24gZ2V0UmFuZ2UoQSxJLEope3ZhciBtPUkubGVuZ3RoLG49Si5sZW5ndGg7dmFyIGksajt2YXIgQj1BcnJheShtKSxCaSxBSTtmb3IoaT1tLTE7aSE9PS0xOy0taSl7QltpXT1BcnJheShuKTtCaT1CW2ldO0FJPUFbSVtpXV07Zm9yKGo9bi0xO2ohPT0tMTstLWopQmlbal09QUlbSltqXV19cmV0dXJuIEJ9OwpudW1lcmljLmJsb2NrTWF0cml4PWZ1bmN0aW9uIGJsb2NrTWF0cml4KFgpe3ZhciBzPW51bWVyaWMuZGltKFgpO2lmKHMubGVuZ3RoPDQpcmV0dXJuIG51bWVyaWMuYmxvY2tNYXRyaXgoW1hdKTt2YXIgbT1zWzBdLG49c1sxXSxNLE4saSxqLFhpajtNPTA7Tj0wO2ZvcihpPTA7aTxtOysraSlNKz1YW2ldWzBdLmxlbmd0aDtmb3Ioaj0wO2o8bjsrK2opTis9WFswXVtqXVswXS5sZW5ndGg7dmFyIFo9QXJyYXkoTSk7Zm9yKGk9MDtpPE07KytpKVpbaV09QXJyYXkoTik7dmFyIEk9MCxKLFpJLGssbCxYaWprO2ZvcihpPTA7aTxtOysraSl7Sj1OO2ZvcihqPW4tMTtqIT09LTE7LS1qKXtYaWo9WFtpXVtqXTtKLT1YaWpbMF0ubGVuZ3RoO2ZvcihrPVhpai5sZW5ndGgtMTtrIT09LTE7LS1rKXtYaWprPVhpaltrXTtaST1aW0kra107Zm9yKGw9WGlqay5sZW5ndGgtMTtsIT09LTE7LS1sKVpJW0orbF09WGlqa1tsXX19SSs9WFtpXVswXS5sZW5ndGh9cmV0dXJuIFp9OwpudW1lcmljLnRlbnNvcj1mdW5jdGlvbiB0ZW5zb3IoeCx5KXtpZih0eXBlb2YgeD09PSJudW1iZXIifHx0eXBlb2YgeT09PSJudW1iZXIiKXJldHVybiBudW1lcmljLm11bCh4LHkpO3ZhciBzMT1udW1lcmljLmRpbSh4KSxzMj1udW1lcmljLmRpbSh5KTtpZihzMS5sZW5ndGghPT0xfHxzMi5sZW5ndGghPT0xKXRocm93IG5ldyBFcnJvcigibnVtZXJpYzogdGVuc29yIHByb2R1Y3QgaXMgb25seSBkZWZpbmVkIGZvciB2ZWN0b3JzIik7dmFyIG09czFbMF0sbj1zMlswXSxBPUFycmF5KG0pLEFpLGksaix4aTtmb3IoaT1tLTE7aT49MDtpLS0pe0FpPUFycmF5KG4pO3hpPXhbaV07Zm9yKGo9bi0xO2o+PTM7LS1qKXtBaVtqXT14aSp5W2pdOy0tajtBaVtqXT14aSp5W2pdOy0tajtBaVtqXT14aSp5W2pdOy0tajtBaVtqXT14aSp5W2pdfXdoaWxlKGo+PTApe0FpW2pdPXhpKnlbal07LS1qfUFbaV09QWl9cmV0dXJuIEF9OwpudW1lcmljLlQ9ZnVuY3Rpb24gVCh4LHkpe3RoaXMueD14O3RoaXMueT15fTtudW1lcmljLnQ9ZnVuY3Rpb24gdCh4LHkpe3JldHVybiBuZXcgbnVtZXJpYy5UKHgseSl9OwpudW1lcmljLlRiaW5vcD1mdW5jdGlvbiBUYmlub3AocnIscmMsY3IsY2Msc2V0dXApe3ZhciBpbz1udW1lcmljLmluZGV4T2Y7aWYodHlwZW9mIHNldHVwIT09InN0cmluZyIpe3ZhciBrO3NldHVwPSIiO2ZvcihrIGluIG51bWVyaWMpaWYobnVtZXJpYy5oYXNPd25Qcm9wZXJ0eShrKSYmKHJyLmluZGV4T2Yoayk+PTB8fHJjLmluZGV4T2Yoayk+PTB8fGNyLmluZGV4T2Yoayk+PTB8fGNjLmluZGV4T2Yoayk+PTApJiZrLmxlbmd0aD4xKXNldHVwKz0idmFyICIraysiIFx4M2QgbnVtZXJpYy4iK2srIjtcbiJ9cmV0dXJuIEZ1bmN0aW9uKFsieSJdLCJ2YXIgeCBceDNkIHRoaXM7XG4iKyJpZighKHkgaW5zdGFuY2VvZiBudW1lcmljLlQpKSB7IHkgXHgzZCBuZXcgbnVtZXJpYy5UKHkpOyB9XG4iK3NldHVwKyJcbiIrImlmKHgueSkgeyIrIiAgaWYoeS55KSB7IisiICAgIHJldHVybiBuZXcgbnVtZXJpYy5UKCIrY2MrIik7XG4iKyIgIH1cbiIrIiAgcmV0dXJuIG5ldyBudW1lcmljLlQoIisKY3IrIik7XG4iKyJ9XG4iKyJpZih5LnkpIHtcbiIrIiAgcmV0dXJuIG5ldyBudW1lcmljLlQoIityYysiKTtcbiIrIn1cbiIrInJldHVybiBuZXcgbnVtZXJpYy5UKCIrcnIrIik7XG4iKX07bnVtZXJpYy5ULnByb3RvdHlwZS5hZGQ9bnVtZXJpYy5UYmlub3AoImFkZCh4LngseS54KSIsImFkZCh4LngseS54KSx5LnkiLCJhZGQoeC54LHkueCkseC55IiwiYWRkKHgueCx5LngpLGFkZCh4LnkseS55KSIpO251bWVyaWMuVC5wcm90b3R5cGUuc3ViPW51bWVyaWMuVGJpbm9wKCJzdWIoeC54LHkueCkiLCJzdWIoeC54LHkueCksbmVnKHkueSkiLCJzdWIoeC54LHkueCkseC55Iiwic3ViKHgueCx5LngpLHN1Yih4LnkseS55KSIpO251bWVyaWMuVC5wcm90b3R5cGUubXVsPW51bWVyaWMuVGJpbm9wKCJtdWwoeC54LHkueCkiLCJtdWwoeC54LHkueCksbXVsKHgueCx5LnkpIiwibXVsKHgueCx5LngpLG11bCh4LnkseS54KSIsInN1YihtdWwoeC54LHkueCksbXVsKHgueSx5LnkpKSxhZGQobXVsKHgueCx5LnkpLG11bCh4LnkseS54KSkiKTsKbnVtZXJpYy5ULnByb3RvdHlwZS5yZWNpcHJvY2FsPWZ1bmN0aW9uIHJlY2lwcm9jYWwoKXt2YXIgbXVsPW51bWVyaWMubXVsLGRpdj1udW1lcmljLmRpdjtpZih0aGlzLnkpe3ZhciBkPW51bWVyaWMuYWRkKG11bCh0aGlzLngsdGhpcy54KSxtdWwodGhpcy55LHRoaXMueSkpO3JldHVybiBuZXcgbnVtZXJpYy5UKGRpdih0aGlzLngsZCksZGl2KG51bWVyaWMubmVnKHRoaXMueSksZCkpfXJldHVybiBuZXcgVChkaXYoMSx0aGlzLngpKX07bnVtZXJpYy5ULnByb3RvdHlwZS5kaXY9ZnVuY3Rpb24gZGl2KHkpe2lmKCEoeSBpbnN0YW5jZW9mIG51bWVyaWMuVCkpeT1uZXcgbnVtZXJpYy5UKHkpO2lmKHkueSlyZXR1cm4gdGhpcy5tdWwoeS5yZWNpcHJvY2FsKCkpO3ZhciBkaXY9bnVtZXJpYy5kaXY7aWYodGhpcy55KXJldHVybiBuZXcgbnVtZXJpYy5UKGRpdih0aGlzLngseS54KSxkaXYodGhpcy55LHkueCkpO3JldHVybiBuZXcgbnVtZXJpYy5UKGRpdih0aGlzLngseS54KSl9OwpudW1lcmljLlQucHJvdG90eXBlLmRvdD1udW1lcmljLlRiaW5vcCgiZG90KHgueCx5LngpIiwiZG90KHgueCx5LngpLGRvdCh4LngseS55KSIsImRvdCh4LngseS54KSxkb3QoeC55LHkueCkiLCJzdWIoZG90KHgueCx5LngpLGRvdCh4LnkseS55KSksYWRkKGRvdCh4LngseS55KSxkb3QoeC55LHkueCkpIik7bnVtZXJpYy5ULnByb3RvdHlwZS50cmFuc3Bvc2U9ZnVuY3Rpb24gdHJhbnNwb3NlKCl7dmFyIHQ9bnVtZXJpYy50cmFuc3Bvc2UseD10aGlzLngseT10aGlzLnk7aWYoeSlyZXR1cm4gbmV3IG51bWVyaWMuVCh0KHgpLHQoeSkpO3JldHVybiBuZXcgbnVtZXJpYy5UKHQoeCkpfTtudW1lcmljLlQucHJvdG90eXBlLnRyYW5zanVnYXRlPWZ1bmN0aW9uIHRyYW5zanVnYXRlKCl7dmFyIHQ9bnVtZXJpYy50cmFuc3Bvc2UseD10aGlzLngseT10aGlzLnk7aWYoeSlyZXR1cm4gbmV3IG51bWVyaWMuVCh0KHgpLG51bWVyaWMubmVndHJhbnNwb3NlKHkpKTtyZXR1cm4gbmV3IG51bWVyaWMuVCh0KHgpKX07Cm51bWVyaWMuVHVub3A9ZnVuY3Rpb24gVHVub3AocixjLHMpe2lmKHR5cGVvZiBzIT09InN0cmluZyIpcz0iIjtyZXR1cm4gRnVuY3Rpb24oInZhciB4IFx4M2QgdGhpcztcbiIrcysiXG4iKyJpZih4LnkpIHsiKyIgICIrYysiO1xuIisifVxuIityKyI7XG4iKX07bnVtZXJpYy5ULnByb3RvdHlwZS5leHA9bnVtZXJpYy5UdW5vcCgicmV0dXJuIG5ldyBudW1lcmljLlQoZXgpIiwicmV0dXJuIG5ldyBudW1lcmljLlQobXVsKGNvcyh4LnkpLGV4KSxtdWwoc2luKHgueSksZXgpKSIsInZhciBleCBceDNkIG51bWVyaWMuZXhwKHgueCksIGNvcyBceDNkIG51bWVyaWMuY29zLCBzaW4gXHgzZCBudW1lcmljLnNpbiwgbXVsIFx4M2QgbnVtZXJpYy5tdWw7Iik7bnVtZXJpYy5ULnByb3RvdHlwZS5jb25qPW51bWVyaWMuVHVub3AoInJldHVybiBuZXcgbnVtZXJpYy5UKHgueCk7IiwicmV0dXJuIG5ldyBudW1lcmljLlQoeC54LG51bWVyaWMubmVnKHgueSkpOyIpOwpudW1lcmljLlQucHJvdG90eXBlLm5lZz1udW1lcmljLlR1bm9wKCJyZXR1cm4gbmV3IG51bWVyaWMuVChuZWcoeC54KSk7IiwicmV0dXJuIG5ldyBudW1lcmljLlQobmVnKHgueCksbmVnKHgueSkpOyIsInZhciBuZWcgXHgzZCBudW1lcmljLm5lZzsiKTtudW1lcmljLlQucHJvdG90eXBlLnNpbj1udW1lcmljLlR1bm9wKCJyZXR1cm4gbmV3IG51bWVyaWMuVChudW1lcmljLnNpbih4LngpKSIsInJldHVybiB4LmV4cCgpLnN1Yih4Lm5lZygpLmV4cCgpKS5kaXYobmV3IG51bWVyaWMuVCgwLDIpKTsiKTtudW1lcmljLlQucHJvdG90eXBlLmNvcz1udW1lcmljLlR1bm9wKCJyZXR1cm4gbmV3IG51bWVyaWMuVChudW1lcmljLmNvcyh4LngpKSIsInJldHVybiB4LmV4cCgpLmFkZCh4Lm5lZygpLmV4cCgpKS5kaXYoMik7Iik7Cm51bWVyaWMuVC5wcm90b3R5cGUuYWJzPW51bWVyaWMuVHVub3AoInJldHVybiBuZXcgbnVtZXJpYy5UKG51bWVyaWMuYWJzKHgueCkpOyIsInJldHVybiBuZXcgbnVtZXJpYy5UKG51bWVyaWMuc3FydChudW1lcmljLmFkZChtdWwoeC54LHgueCksbXVsKHgueSx4LnkpKSkpOyIsInZhciBtdWwgXHgzZCBudW1lcmljLm11bDsiKTtudW1lcmljLlQucHJvdG90eXBlLmxvZz1udW1lcmljLlR1bm9wKCJyZXR1cm4gbmV3IG51bWVyaWMuVChudW1lcmljLmxvZyh4LngpKTsiLCJ2YXIgdGhldGEgXHgzZCBuZXcgbnVtZXJpYy5UKG51bWVyaWMuYXRhbjIoeC55LHgueCkpLCByIFx4M2QgeC5hYnMoKTtcbiIrInJldHVybiBuZXcgbnVtZXJpYy5UKG51bWVyaWMubG9nKHIueCksdGhldGEueCk7Iik7bnVtZXJpYy5ULnByb3RvdHlwZS5ub3JtMj1udW1lcmljLlR1bm9wKCJyZXR1cm4gbnVtZXJpYy5ub3JtMih4LngpOyIsInZhciBmIFx4M2QgbnVtZXJpYy5ub3JtMlNxdWFyZWQ7XG4iKyJyZXR1cm4gTWF0aC5zcXJ0KGYoeC54KStmKHgueSkpOyIpOwpudW1lcmljLlQucHJvdG90eXBlLmludj1mdW5jdGlvbiBpbnYoKXt2YXIgQT10aGlzO2lmKHR5cGVvZiBBLnk9PT0idW5kZWZpbmVkIilyZXR1cm4gbmV3IG51bWVyaWMuVChudW1lcmljLmludihBLngpKTt2YXIgbj1BLngubGVuZ3RoLGksaixrO3ZhciBSeD1udW1lcmljLmlkZW50aXR5KG4pLFJ5PW51bWVyaWMucmVwKFtuLG5dLDApO3ZhciBBeD1udW1lcmljLmNsb25lKEEueCksQXk9bnVtZXJpYy5jbG9uZShBLnkpO3ZhciBBaXgsQWl5LEFqeCxBanksUml4LFJpeSxSangsUmp5O3ZhciBpLGosayxkLGQxLGF4LGF5LGJ4LGJ5LHRlbXA7Zm9yKGk9MDtpPG47aSsrKXtheD1BeFtpXVtpXTtheT1BeVtpXVtpXTtkPWF4KmF4K2F5KmF5O2s9aTtmb3Ioaj1pKzE7ajxuO2orKyl7YXg9QXhbal1baV07YXk9QXlbal1baV07ZDE9YXgqYXgrYXkqYXk7aWYoZDE+ZCl7az1qO2Q9ZDF9fWlmKGshPT1pKXt0ZW1wPUF4W2ldO0F4W2ldPUF4W2tdO0F4W2tdPXRlbXA7dGVtcD1BeVtpXTtBeVtpXT0KQXlba107QXlba109dGVtcDt0ZW1wPVJ4W2ldO1J4W2ldPVJ4W2tdO1J4W2tdPXRlbXA7dGVtcD1SeVtpXTtSeVtpXT1SeVtrXTtSeVtrXT10ZW1wfUFpeD1BeFtpXTtBaXk9QXlbaV07Uml4PVJ4W2ldO1JpeT1SeVtpXTtheD1BaXhbaV07YXk9QWl5W2ldO2ZvcihqPWkrMTtqPG47aisrKXtieD1BaXhbal07Ynk9QWl5W2pdO0FpeFtqXT0oYngqYXgrYnkqYXkpL2Q7QWl5W2pdPShieSpheC1ieCpheSkvZH1mb3Ioaj0wO2o8bjtqKyspe2J4PVJpeFtqXTtieT1SaXlbal07Uml4W2pdPShieCpheCtieSpheSkvZDtSaXlbal09KGJ5KmF4LWJ4KmF5KS9kfWZvcihqPWkrMTtqPG47aisrKXtBang9QXhbal07QWp5PUF5W2pdO1JqeD1SeFtqXTtSank9Unlbal07YXg9QWp4W2ldO2F5PUFqeVtpXTtmb3Ioaz1pKzE7azxuO2srKyl7Yng9QWl4W2tdO2J5PUFpeVtrXTtBanhba10tPWJ4KmF4LWJ5KmF5O0FqeVtrXS09YnkqYXgrYngqYXl9Zm9yKGs9MDtrPG47aysrKXtieD1SaXhba107Ynk9ClJpeVtrXTtSanhba10tPWJ4KmF4LWJ5KmF5O1JqeVtrXS09YnkqYXgrYngqYXl9fX1mb3IoaT1uLTE7aT4wO2ktLSl7Uml4PVJ4W2ldO1JpeT1SeVtpXTtmb3Ioaj1pLTE7aj49MDtqLS0pe1JqeD1SeFtqXTtSank9Unlbal07YXg9QXhbal1baV07YXk9QXlbal1baV07Zm9yKGs9bi0xO2s+PTA7ay0tKXtieD1SaXhba107Ynk9Uml5W2tdO1JqeFtrXS09YXgqYngtYXkqYnk7Ump5W2tdLT1heCpieStheSpieH19fXJldHVybiBuZXcgbnVtZXJpYy5UKFJ4LFJ5KX07bnVtZXJpYy5ULnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24gZ2V0KGkpe3ZhciB4PXRoaXMueCx5PXRoaXMueSxrPTAsaWssbj1pLmxlbmd0aDtpZih5KXt3aGlsZShrPG4pe2lrPWlba107eD14W2lrXTt5PXlbaWtdO2srK31yZXR1cm4gbmV3IG51bWVyaWMuVCh4LHkpfXdoaWxlKGs8bil7aWs9aVtrXTt4PXhbaWtdO2srK31yZXR1cm4gbmV3IG51bWVyaWMuVCh4KX07Cm51bWVyaWMuVC5wcm90b3R5cGUuc2V0PWZ1bmN0aW9uIHNldChpLHYpe3ZhciB4PXRoaXMueCx5PXRoaXMueSxrPTAsaWssbj1pLmxlbmd0aCx2eD12Lngsdnk9di55O2lmKG49PT0wKXtpZih2eSl0aGlzLnk9dnk7ZWxzZSBpZih5KXRoaXMueT11bmRlZmluZWQ7dGhpcy54PXg7cmV0dXJuIHRoaXN9aWYodnkpe2lmKHkpO2Vsc2V7eT1udW1lcmljLnJlcChudW1lcmljLmRpbSh4KSwwKTt0aGlzLnk9eX13aGlsZShrPG4tMSl7aWs9aVtrXTt4PXhbaWtdO3k9eVtpa107aysrfWlrPWlba107eFtpa109dng7eVtpa109dnk7cmV0dXJuIHRoaXN9aWYoeSl7d2hpbGUoazxuLTEpe2lrPWlba107eD14W2lrXTt5PXlbaWtdO2srK31paz1pW2tdO3hbaWtdPXZ4O2lmKHZ4IGluc3RhbmNlb2YgQXJyYXkpeVtpa109bnVtZXJpYy5yZXAobnVtZXJpYy5kaW0odngpLDApO2Vsc2UgeVtpa109MDtyZXR1cm4gdGhpc313aGlsZShrPG4tMSl7aWs9aVtrXTt4PXhbaWtdO2srK31paz1pW2tdO3hbaWtdPQp2eDtyZXR1cm4gdGhpc307bnVtZXJpYy5ULnByb3RvdHlwZS5nZXRSb3dzPWZ1bmN0aW9uIGdldFJvd3MoaTAsaTEpe3ZhciBuPWkxLWkwKzEsajt2YXIgcng9QXJyYXkobikscnkseD10aGlzLngseT10aGlzLnk7Zm9yKGo9aTA7ajw9aTE7aisrKXJ4W2otaTBdPXhbal07aWYoeSl7cnk9QXJyYXkobik7Zm9yKGo9aTA7ajw9aTE7aisrKXJ5W2otaTBdPXlbal07cmV0dXJuIG5ldyBudW1lcmljLlQocngscnkpfXJldHVybiBuZXcgbnVtZXJpYy5UKHJ4KX07Cm51bWVyaWMuVC5wcm90b3R5cGUuc2V0Um93cz1mdW5jdGlvbiBzZXRSb3dzKGkwLGkxLEEpe3ZhciBqO3ZhciByeD10aGlzLngscnk9dGhpcy55LHg9QS54LHk9QS55O2ZvcihqPWkwO2o8PWkxO2orKylyeFtqXT14W2otaTBdO2lmKHkpe2lmKCFyeSl7cnk9bnVtZXJpYy5yZXAobnVtZXJpYy5kaW0ocngpLDApO3RoaXMueT1yeX1mb3Ioaj1pMDtqPD1pMTtqKyspcnlbal09eVtqLWkwXX1lbHNlIGlmKHJ5KWZvcihqPWkwO2o8PWkxO2orKylyeVtqXT1udW1lcmljLnJlcChbeFtqLWkwXS5sZW5ndGhdLDApO3JldHVybiB0aGlzfTtudW1lcmljLlQucHJvdG90eXBlLmdldFJvdz1mdW5jdGlvbiBnZXRSb3coayl7dmFyIHg9dGhpcy54LHk9dGhpcy55O2lmKHkpcmV0dXJuIG5ldyBudW1lcmljLlQoeFtrXSx5W2tdKTtyZXR1cm4gbmV3IG51bWVyaWMuVCh4W2tdKX07Cm51bWVyaWMuVC5wcm90b3R5cGUuc2V0Um93PWZ1bmN0aW9uIHNldFJvdyhpLHYpe3ZhciByeD10aGlzLngscnk9dGhpcy55LHg9di54LHk9di55O3J4W2ldPXg7aWYoeSl7aWYoIXJ5KXtyeT1udW1lcmljLnJlcChudW1lcmljLmRpbShyeCksMCk7dGhpcy55PXJ5fXJ5W2ldPXl9ZWxzZSBpZihyeSlyeT1udW1lcmljLnJlcChbeC5sZW5ndGhdLDApO3JldHVybiB0aGlzfTtudW1lcmljLlQucHJvdG90eXBlLmdldEJsb2NrPWZ1bmN0aW9uIGdldEJsb2NrKGZyb20sdG8pe3ZhciB4PXRoaXMueCx5PXRoaXMueSxiPW51bWVyaWMuZ2V0QmxvY2s7aWYoeSlyZXR1cm4gbmV3IG51bWVyaWMuVChiKHgsZnJvbSx0byksYih5LGZyb20sdG8pKTtyZXR1cm4gbmV3IG51bWVyaWMuVChiKHgsZnJvbSx0bykpfTsKbnVtZXJpYy5ULnByb3RvdHlwZS5zZXRCbG9jaz1mdW5jdGlvbiBzZXRCbG9jayhmcm9tLHRvLEEpe2lmKCEoQSBpbnN0YW5jZW9mIG51bWVyaWMuVCkpQT1uZXcgbnVtZXJpYy5UKEEpO3ZhciB4PXRoaXMueCx5PXRoaXMueSxiPW51bWVyaWMuc2V0QmxvY2ssQXg9QS54LEF5PUEueTtpZihBeSl7aWYoIXkpe3RoaXMueT1udW1lcmljLnJlcChudW1lcmljLmRpbSh0aGlzKSwwKTt5PXRoaXMueX1iKHgsZnJvbSx0byxBeCk7Yih5LGZyb20sdG8sQXkpO3JldHVybiB0aGlzfWIoeCxmcm9tLHRvLEF4KTtpZih5KWIoeSxmcm9tLHRvLG51bWVyaWMucmVwKG51bWVyaWMuZGltKEF4KSwwKSl9O251bWVyaWMuVC5yZXA9ZnVuY3Rpb24gcmVwKHMsdil7dmFyIFQ9bnVtZXJpYy5UO2lmKCEodiBpbnN0YW5jZW9mIFQpKXY9bmV3IFQodik7dmFyIHg9di54LHk9di55LHI9bnVtZXJpYy5yZXA7aWYoeSlyZXR1cm4gbmV3IFQocihzLHgpLHIocyx5KSk7cmV0dXJuIG5ldyBUKHIocyx4KSl9OwpudW1lcmljLlQuZGlhZz1mdW5jdGlvbiBkaWFnKGQpe2lmKCEoZCBpbnN0YW5jZW9mIG51bWVyaWMuVCkpZD1uZXcgbnVtZXJpYy5UKGQpO3ZhciB4PWQueCx5PWQueSxkaWFnPW51bWVyaWMuZGlhZztpZih5KXJldHVybiBuZXcgbnVtZXJpYy5UKGRpYWcoeCksZGlhZyh5KSk7cmV0dXJuIG5ldyBudW1lcmljLlQoZGlhZyh4KSl9O251bWVyaWMuVC5laWc9ZnVuY3Rpb24gZWlnKCl7aWYodGhpcy55KXRocm93IG5ldyBFcnJvcigiZWlnOiBub3QgaW1wbGVtZW50ZWQgZm9yIGNvbXBsZXggbWF0cmljZXMuIik7cmV0dXJuIG51bWVyaWMuZWlnKHRoaXMueCl9O251bWVyaWMuVC5pZGVudGl0eT1mdW5jdGlvbiBpZGVudGl0eShuKXtyZXR1cm4gbmV3IG51bWVyaWMuVChudW1lcmljLmlkZW50aXR5KG4pKX07Cm51bWVyaWMuVC5wcm90b3R5cGUuZ2V0RGlhZz1mdW5jdGlvbiBnZXREaWFnKCl7dmFyIG49bnVtZXJpYzt2YXIgeD10aGlzLngseT10aGlzLnk7aWYoeSlyZXR1cm4gbmV3IG4uVChuLmdldERpYWcoeCksbi5nZXREaWFnKHkpKTtyZXR1cm4gbmV3IG4uVChuLmdldERpYWcoeCkpfTtudW1lcmljLmhvdXNlPWZ1bmN0aW9uIGhvdXNlKHgpe3ZhciB2PW51bWVyaWMuY2xvbmUoeCk7dmFyIHM9eFswXT49MD8xOi0xO3ZhciBhbHBoYT1zKm51bWVyaWMubm9ybTIoeCk7dlswXSs9YWxwaGE7dmFyIGZvbz1udW1lcmljLm5vcm0yKHYpO2lmKGZvbz09PTApdGhyb3cgbmV3IEVycm9yKCJlaWc6IGludGVybmFsIGVycm9yIik7cmV0dXJuIG51bWVyaWMuZGl2KHYsZm9vKX07Cm51bWVyaWMudG9VcHBlckhlc3NlbmJlcmc9ZnVuY3Rpb24gdG9VcHBlckhlc3NlbmJlcmcobWUpe3ZhciBzPW51bWVyaWMuZGltKG1lKTtpZihzLmxlbmd0aCE9PTJ8fHNbMF0hPT1zWzFdKXRocm93IG5ldyBFcnJvcigibnVtZXJpYzogdG9VcHBlckhlc3NlbmJlcmcoKSBvbmx5IHdvcmtzIG9uIHNxdWFyZSBtYXRyaWNlcyIpO3ZhciBtPXNbMF0saSxqLGsseCx2LEE9bnVtZXJpYy5jbG9uZShtZSksQixDLEFpLENpLFE9bnVtZXJpYy5pZGVudGl0eShtKSxRaTtmb3Ioaj0wO2o8bS0yO2orKyl7eD1BcnJheShtLWotMSk7Zm9yKGk9aisxO2k8bTtpKyspeFtpLWotMV09QVtpXVtqXTtpZihudW1lcmljLm5vcm0yKHgpPjApe3Y9bnVtZXJpYy5ob3VzZSh4KTtCPW51bWVyaWMuZ2V0QmxvY2soQSxbaisxLGpdLFttLTEsbS0xXSk7Qz1udW1lcmljLnRlbnNvcih2LG51bWVyaWMuZG90KHYsQikpO2ZvcihpPWorMTtpPG07aSsrKXtBaT1BW2ldO0NpPUNbaS1qLTFdO2ZvcihrPWo7azxtO2srKylBaVtrXS09CjIqQ2lbay1qXX1CPW51bWVyaWMuZ2V0QmxvY2soQSxbMCxqKzFdLFttLTEsbS0xXSk7Qz1udW1lcmljLnRlbnNvcihudW1lcmljLmRvdChCLHYpLHYpO2ZvcihpPTA7aTxtO2krKyl7QWk9QVtpXTtDaT1DW2ldO2ZvcihrPWorMTtrPG07aysrKUFpW2tdLT0yKkNpW2stai0xXX1CPUFycmF5KG0tai0xKTtmb3IoaT1qKzE7aTxtO2krKylCW2ktai0xXT1RW2ldO0M9bnVtZXJpYy50ZW5zb3IodixudW1lcmljLmRvdCh2LEIpKTtmb3IoaT1qKzE7aTxtO2krKyl7UWk9UVtpXTtDaT1DW2ktai0xXTtmb3Ioaz0wO2s8bTtrKyspUWlba10tPTIqQ2lba119fX1yZXR1cm57SDpBLFE6UX19O251bWVyaWMuZXBzaWxvbj0yLjIyMDQ0NjA0OTI1MDMxM0UtMTY7Cm51bWVyaWMuUVJGcmFuY2lzPWZ1bmN0aW9uKEgsbWF4aXRlcil7aWYodHlwZW9mIG1heGl0ZXI9PT0idW5kZWZpbmVkIiltYXhpdGVyPTFFNDtIPW51bWVyaWMuY2xvbmUoSCk7dmFyIEgwPW51bWVyaWMuY2xvbmUoSCk7dmFyIHM9bnVtZXJpYy5kaW0oSCksbT1zWzBdLHgsdixhLGIsYyxkLGRldCx0cixIbG9jLFE9bnVtZXJpYy5pZGVudGl0eShtKSxRaSxIaSxCLEMsQ2ksaSxqLGssaXRlcjtpZihtPDMpcmV0dXJue1E6USxCOltbMCxtLTFdXX07dmFyIGVwc2lsb249bnVtZXJpYy5lcHNpbG9uO2ZvcihpdGVyPTA7aXRlcjxtYXhpdGVyO2l0ZXIrKyl7Zm9yKGo9MDtqPG0tMTtqKyspaWYoTWF0aC5hYnMoSFtqKzFdW2pdKTxlcHNpbG9uKihNYXRoLmFicyhIW2pdW2pdKStNYXRoLmFicyhIW2orMV1baisxXSkpKXt2YXIgUUgxPW51bWVyaWMuUVJGcmFuY2lzKG51bWVyaWMuZ2V0QmxvY2soSCxbMCwwXSxbaixqXSksbWF4aXRlcik7dmFyIFFIMj1udW1lcmljLlFSRnJhbmNpcyhudW1lcmljLmdldEJsb2NrKEgsCltqKzEsaisxXSxbbS0xLG0tMV0pLG1heGl0ZXIpO0I9QXJyYXkoaisxKTtmb3IoaT0wO2k8PWo7aSsrKUJbaV09UVtpXTtDPW51bWVyaWMuZG90KFFIMS5RLEIpO2ZvcihpPTA7aTw9ajtpKyspUVtpXT1DW2ldO0I9QXJyYXkobS1qLTEpO2ZvcihpPWorMTtpPG07aSsrKUJbaS1qLTFdPVFbaV07Qz1udW1lcmljLmRvdChRSDIuUSxCKTtmb3IoaT1qKzE7aTxtO2krKylRW2ldPUNbaS1qLTFdO3JldHVybntROlEsQjpRSDEuQi5jb25jYXQobnVtZXJpYy5hZGQoUUgyLkIsaisxKSl9fWE9SFttLTJdW20tMl07Yj1IW20tMl1bbS0xXTtjPUhbbS0xXVttLTJdO2Q9SFttLTFdW20tMV07dHI9YStkO2RldD1hKmQtYipjO0hsb2M9bnVtZXJpYy5nZXRCbG9jayhILFswLDBdLFsyLDJdKTtpZih0cip0cj49NCpkZXQpe3ZhciBzMSxzMjtzMT0uNSoodHIrTWF0aC5zcXJ0KHRyKnRyLTQqZGV0KSk7czI9LjUqKHRyLU1hdGguc3FydCh0cip0ci00KmRldCkpO0hsb2M9bnVtZXJpYy5hZGQobnVtZXJpYy5zdWIobnVtZXJpYy5kb3QoSGxvYywKSGxvYyksbnVtZXJpYy5tdWwoSGxvYyxzMStzMikpLG51bWVyaWMuZGlhZyhudW1lcmljLnJlcChbM10sczEqczIpKSl9ZWxzZSBIbG9jPW51bWVyaWMuYWRkKG51bWVyaWMuc3ViKG51bWVyaWMuZG90KEhsb2MsSGxvYyksbnVtZXJpYy5tdWwoSGxvYyx0cikpLG51bWVyaWMuZGlhZyhudW1lcmljLnJlcChbM10sZGV0KSkpO3g9W0hsb2NbMF1bMF0sSGxvY1sxXVswXSxIbG9jWzJdWzBdXTt2PW51bWVyaWMuaG91c2UoeCk7Qj1bSFswXSxIWzFdLEhbMl1dO0M9bnVtZXJpYy50ZW5zb3IodixudW1lcmljLmRvdCh2LEIpKTtmb3IoaT0wO2k8MztpKyspe0hpPUhbaV07Q2k9Q1tpXTtmb3Ioaz0wO2s8bTtrKyspSGlba10tPTIqQ2lba119Qj1udW1lcmljLmdldEJsb2NrKEgsWzAsMF0sW20tMSwyXSk7Qz1udW1lcmljLnRlbnNvcihudW1lcmljLmRvdChCLHYpLHYpO2ZvcihpPTA7aTxtO2krKyl7SGk9SFtpXTtDaT1DW2ldO2ZvcihrPTA7azwzO2srKylIaVtrXS09MipDaVtrXX1CPVtRWzBdLApRWzFdLFFbMl1dO0M9bnVtZXJpYy50ZW5zb3IodixudW1lcmljLmRvdCh2LEIpKTtmb3IoaT0wO2k8MztpKyspe1FpPVFbaV07Q2k9Q1tpXTtmb3Ioaz0wO2s8bTtrKyspUWlba10tPTIqQ2lba119dmFyIEo7Zm9yKGo9MDtqPG0tMjtqKyspe2ZvcihrPWo7azw9aisxO2srKylpZihNYXRoLmFicyhIW2srMV1ba10pPGVwc2lsb24qKE1hdGguYWJzKEhba11ba10pK01hdGguYWJzKEhbaysxXVtrKzFdKSkpe3ZhciBRSDE9bnVtZXJpYy5RUkZyYW5jaXMobnVtZXJpYy5nZXRCbG9jayhILFswLDBdLFtrLGtdKSxtYXhpdGVyKTt2YXIgUUgyPW51bWVyaWMuUVJGcmFuY2lzKG51bWVyaWMuZ2V0QmxvY2soSCxbaysxLGsrMV0sW20tMSxtLTFdKSxtYXhpdGVyKTtCPUFycmF5KGsrMSk7Zm9yKGk9MDtpPD1rO2krKylCW2ldPVFbaV07Qz1udW1lcmljLmRvdChRSDEuUSxCKTtmb3IoaT0wO2k8PWs7aSsrKVFbaV09Q1tpXTtCPUFycmF5KG0tay0xKTtmb3IoaT1rKzE7aTxtO2krKylCW2ktay0KMV09UVtpXTtDPW51bWVyaWMuZG90KFFIMi5RLEIpO2ZvcihpPWsrMTtpPG07aSsrKVFbaV09Q1tpLWstMV07cmV0dXJue1E6USxCOlFIMS5CLmNvbmNhdChudW1lcmljLmFkZChRSDIuQixrKzEpKX19Sj1NYXRoLm1pbihtLTEsaiszKTt4PUFycmF5KEotaik7Zm9yKGk9aisxO2k8PUo7aSsrKXhbaS1qLTFdPUhbaV1bal07dj1udW1lcmljLmhvdXNlKHgpO0I9bnVtZXJpYy5nZXRCbG9jayhILFtqKzEsal0sW0osbS0xXSk7Qz1udW1lcmljLnRlbnNvcih2LG51bWVyaWMuZG90KHYsQikpO2ZvcihpPWorMTtpPD1KO2krKyl7SGk9SFtpXTtDaT1DW2ktai0xXTtmb3Ioaz1qO2s8bTtrKyspSGlba10tPTIqQ2lbay1qXX1CPW51bWVyaWMuZ2V0QmxvY2soSCxbMCxqKzFdLFttLTEsSl0pO0M9bnVtZXJpYy50ZW5zb3IobnVtZXJpYy5kb3QoQix2KSx2KTtmb3IoaT0wO2k8bTtpKyspe0hpPUhbaV07Q2k9Q1tpXTtmb3Ioaz1qKzE7azw9SjtrKyspSGlba10tPTIqQ2lbay1qLTFdfUI9QXJyYXkoSi0Kaik7Zm9yKGk9aisxO2k8PUo7aSsrKUJbaS1qLTFdPVFbaV07Qz1udW1lcmljLnRlbnNvcih2LG51bWVyaWMuZG90KHYsQikpO2ZvcihpPWorMTtpPD1KO2krKyl7UWk9UVtpXTtDaT1DW2ktai0xXTtmb3Ioaz0wO2s8bTtrKyspUWlba10tPTIqQ2lba119fX10aHJvdyBuZXcgRXJyb3IoIm51bWVyaWM6IGVpZ2VudmFsdWUgaXRlcmF0aW9uIGRvZXMgbm90IGNvbnZlcmdlIC0tIGluY3JlYXNlIG1heGl0ZXI/Iik7fTsKbnVtZXJpYy5laWc9ZnVuY3Rpb24gZWlnKEEsbWF4aXRlcil7dmFyIFFIPW51bWVyaWMudG9VcHBlckhlc3NlbmJlcmcoQSk7dmFyIFFCPW51bWVyaWMuUVJGcmFuY2lzKFFILkgsbWF4aXRlcik7dmFyIFQ9bnVtZXJpYy5UO3ZhciBuPUEubGVuZ3RoLGksayxmbGFnPWZhbHNlLEI9UUIuQixIPW51bWVyaWMuZG90KFFCLlEsbnVtZXJpYy5kb3QoUUguSCxudW1lcmljLnRyYW5zcG9zZShRQi5RKSkpO3ZhciBRPW5ldyBUKG51bWVyaWMuZG90KFFCLlEsUUguUSkpLFEwO3ZhciBtPUIubGVuZ3RoLGo7dmFyIGEsYixjLGQscDEscDIsZGlzYyx4LHkscCxxLG4xLG4yO3ZhciBzcXJ0PU1hdGguc3FydDtmb3Ioaz0wO2s8bTtrKyspe2k9QltrXVswXTtpZihpPT09QltrXVsxXSk7ZWxzZXtqPWkrMTthPUhbaV1baV07Yj1IW2ldW2pdO2M9SFtqXVtpXTtkPUhbal1bal07aWYoYj09PTAmJmM9PT0wKWNvbnRpbnVlO3AxPS1hLWQ7cDI9YSpkLWIqYztkaXNjPXAxKnAxLTQqcDI7aWYoZGlzYz49CjApe2lmKHAxPDApeD0tLjUqKHAxLXNxcnQoZGlzYykpO2Vsc2UgeD0tLjUqKHAxK3NxcnQoZGlzYykpO24xPShhLXgpKihhLXgpK2IqYjtuMj1jKmMrKGQteCkqKGQteCk7aWYobjE+bjIpe24xPXNxcnQobjEpO3A9KGEteCkvbjE7cT1iL24xfWVsc2V7bjI9c3FydChuMik7cD1jL24yO3E9KGQteCkvbjJ9UTA9bmV3IFQoW1txLC1wXSxbcCxxXV0pO1Euc2V0Um93cyhpLGosUTAuZG90KFEuZ2V0Um93cyhpLGopKSl9ZWxzZXt4PS0uNSpwMTt5PS41KnNxcnQoLWRpc2MpO24xPShhLXgpKihhLXgpK2IqYjtuMj1jKmMrKGQteCkqKGQteCk7aWYobjE+bjIpe24xPXNxcnQobjEreSp5KTtwPShhLXgpL24xO3E9Yi9uMTt4PTA7eS89bjF9ZWxzZXtuMj1zcXJ0KG4yK3kqeSk7cD1jL24yO3E9KGQteCkvbjI7eD15L24yO3k9MH1RMD1uZXcgVChbW3EsLXBdLFtwLHFdXSxbW3gseV0sW3ksLXhdXSk7US5zZXRSb3dzKGksaixRMC5kb3QoUS5nZXRSb3dzKGksaikpKX19fXZhciBSPVEuZG90KEEpLmRvdChRLnRyYW5zanVnYXRlKCkpLApuPUEubGVuZ3RoLEU9bnVtZXJpYy5ULmlkZW50aXR5KG4pO2ZvcihqPTA7ajxuO2orKylpZihqPjApZm9yKGs9ai0xO2s+PTA7ay0tKXt2YXIgUms9Ui5nZXQoW2ssa10pLFJqPVIuZ2V0KFtqLGpdKTtpZihudW1lcmljLm5lcShSay54LFJqLngpfHxudW1lcmljLm5lcShSay55LFJqLnkpKXt4PVIuZ2V0Um93KGspLmdldEJsb2NrKFtrXSxbai0xXSk7eT1FLmdldFJvdyhqKS5nZXRCbG9jayhba10sW2otMV0pO0Uuc2V0KFtqLGtdLFIuZ2V0KFtrLGpdKS5uZWcoKS5zdWIoeC5kb3QoeSkpLmRpdihSay5zdWIoUmopKSl9ZWxzZXtFLnNldFJvdyhqLEUuZ2V0Um93KGspKTtjb250aW51ZX19Zm9yKGo9MDtqPG47aisrKXt4PUUuZ2V0Um93KGopO0Uuc2V0Um93KGoseC5kaXYoeC5ub3JtMigpKSl9RT1FLnRyYW5zcG9zZSgpO0U9US50cmFuc2p1Z2F0ZSgpLmRvdChFKTtyZXR1cm57bGFtYmRhOlIuZ2V0RGlhZygpLEU6RX19OwpudW1lcmljLmNjc1NwYXJzZT1mdW5jdGlvbiBjY3NTcGFyc2UoQSl7dmFyIG09QS5sZW5ndGgsbixmb28saSxqLGNvdW50cz1bXTtmb3IoaT1tLTE7aSE9PS0xOy0taSl7Zm9vPUFbaV07Zm9yKGogaW4gZm9vKXtqPXBhcnNlSW50KGopO3doaWxlKGo+PWNvdW50cy5sZW5ndGgpY291bnRzW2NvdW50cy5sZW5ndGhdPTA7aWYoZm9vW2pdIT09MCljb3VudHNbal0rK319dmFyIG49Y291bnRzLmxlbmd0aDt2YXIgQWk9QXJyYXkobisxKTtBaVswXT0wO2ZvcihpPTA7aTxuOysraSlBaVtpKzFdPUFpW2ldK2NvdW50c1tpXTt2YXIgQWo9QXJyYXkoQWlbbl0pLEF2PUFycmF5KEFpW25dKTtmb3IoaT1tLTE7aSE9PS0xOy0taSl7Zm9vPUFbaV07Zm9yKGogaW4gZm9vKWlmKGZvb1tqXSE9PTApe2NvdW50c1tqXS0tO0FqW0FpW2pdK2NvdW50c1tqXV09aTtBdltBaVtqXStjb3VudHNbal1dPWZvb1tqXX19cmV0dXJuW0FpLEFqLEF2XX07Cm51bWVyaWMuY2NzRnVsbD1mdW5jdGlvbiBjY3NGdWxsKEEpe3ZhciBBaT1BWzBdLEFqPUFbMV0sQXY9QVsyXSxzPW51bWVyaWMuY2NzRGltKEEpLG09c1swXSxuPXNbMV0saSxqLGowLGoxLGs7dmFyIEI9bnVtZXJpYy5yZXAoW20sbl0sMCk7Zm9yKGk9MDtpPG47aSsrKXtqMD1BaVtpXTtqMT1BaVtpKzFdO2ZvcihqPWowO2o8ajE7KytqKUJbQWpbal1dW2ldPUF2W2pdfXJldHVybiBCfTsKbnVtZXJpYy5jY3NUU29sdmU9ZnVuY3Rpb24gY2NzVFNvbHZlKEEsYix4LGJqLHhqKXt2YXIgQWk9QVswXSxBaj1BWzFdLEF2PUFbMl0sbT1BaS5sZW5ndGgtMSxtYXg9TWF0aC5tYXgsbj0wO2lmKHR5cGVvZiBiaj09PSJ1bmRlZmluZWQiKXg9bnVtZXJpYy5yZXAoW21dLDApO2lmKHR5cGVvZiBiaj09PSJ1bmRlZmluZWQiKWJqPW51bWVyaWMubGluc3BhY2UoMCx4Lmxlbmd0aC0xKTtpZih0eXBlb2YgeGo9PT0idW5kZWZpbmVkIil4aj1bXTtmdW5jdGlvbiBkZnMoail7dmFyIGs7aWYoeFtqXSE9PTApcmV0dXJuO3hbal09MTtmb3Ioaz1BaVtqXTtrPEFpW2orMV07KytrKWRmcyhBaltrXSk7eGpbbl09ajsrK259dmFyIGksaixqMCxqMSxrLGwsbDAsbDEsYTtmb3IoaT1iai5sZW5ndGgtMTtpIT09LTE7LS1pKWRmcyhialtpXSk7eGoubGVuZ3RoPW47Zm9yKGk9eGoubGVuZ3RoLTE7aSE9PS0xOy0taSl4W3hqW2ldXT0wO2ZvcihpPWJqLmxlbmd0aC0xO2khPT0tMTstLWkpe2o9YmpbaV07Cnhbal09YltqXX1mb3IoaT14ai5sZW5ndGgtMTtpIT09LTE7LS1pKXtqPXhqW2ldO2owPUFpW2pdO2oxPW1heChBaVtqKzFdLGowKTtmb3Ioaz1qMDtrIT09ajE7KytrKWlmKEFqW2tdPT09ail7eFtqXS89QXZba107YnJlYWt9YT14W2pdO2ZvcihrPWowO2shPT1qMTsrK2spe2w9QWpba107aWYobCE9PWopeFtsXS09YSpBdltrXX19cmV0dXJuIHh9O251bWVyaWMuY2NzREZTPWZ1bmN0aW9uIGNjc0RGUyhuKXt0aGlzLms9QXJyYXkobik7dGhpcy5rMT1BcnJheShuKTt0aGlzLmo9QXJyYXkobil9OwpudW1lcmljLmNjc0RGUy5wcm90b3R5cGUuZGZzPWZ1bmN0aW9uIGRmcyhKLEFpLEFqLHgseGosUGludil7dmFyIG09MCxmb28sbj14ai5sZW5ndGg7dmFyIGs9dGhpcy5rLGsxPXRoaXMuazEsaj10aGlzLmosa20sazExO2lmKHhbSl0hPT0wKXJldHVybjt4W0pdPTE7alswXT1KO2tbMF09a209QWlbSl07azFbMF09azExPUFpW0orMV07d2hpbGUoMSlpZihrbT49azExKXt4altuXT1qW21dO2lmKG09PT0wKXJldHVybjsrK247LS1tO2ttPWtbbV07azExPWsxW21dfWVsc2V7Zm9vPVBpbnZbQWpba21dXTtpZih4W2Zvb109PT0wKXt4W2Zvb109MTtrW21dPWttOysrbTtqW21dPWZvbztrbT1BaVtmb29dO2sxW21dPWsxMT1BaVtmb28rMV19ZWxzZSsra219fTsKbnVtZXJpYy5jY3NMUFNvbHZlPWZ1bmN0aW9uIGNjc0xQU29sdmUoQSxCLHgseGosSSxQaW52LGRmcyl7dmFyIEFpPUFbMF0sQWo9QVsxXSxBdj1BWzJdLG09QWkubGVuZ3RoLTEsbj0wO3ZhciBCaT1CWzBdLEJqPUJbMV0sQnY9QlsyXTt2YXIgaSxpMCxpMSxqLEosajAsajEsayxsLGwwLGwxLGE7aTA9QmlbSV07aTE9QmlbSSsxXTt4ai5sZW5ndGg9MDtmb3IoaT1pMDtpPGkxOysraSlkZnMuZGZzKFBpbnZbQmpbaV1dLEFpLEFqLHgseGosUGludik7Zm9yKGk9eGoubGVuZ3RoLTE7aSE9PS0xOy0taSl4W3hqW2ldXT0wO2ZvcihpPWkwO2khPT1pMTsrK2kpe2o9UGludltCaltpXV07eFtqXT1CdltpXX1mb3IoaT14ai5sZW5ndGgtMTtpIT09LTE7LS1pKXtqPXhqW2ldO2owPUFpW2pdO2oxPUFpW2orMV07Zm9yKGs9ajA7azxqMTsrK2spaWYoUGludltBaltrXV09PT1qKXt4W2pdLz1BdltrXTticmVha31hPXhbal07Zm9yKGs9ajA7azxqMTsrK2spe2w9UGludltBaltrXV07aWYobCE9PQpqKXhbbF0tPWEqQXZba119fXJldHVybiB4fTsKbnVtZXJpYy5jY3NMVVAxPWZ1bmN0aW9uIGNjc0xVUDEoQSx0aHJlc2hvbGQpe3ZhciBtPUFbMF0ubGVuZ3RoLTE7dmFyIEw9W251bWVyaWMucmVwKFttKzFdLDApLFtdLFtdXSxVPVtudW1lcmljLnJlcChbbSsxXSwwKSxbXSxbXV07dmFyIExpPUxbMF0sTGo9TFsxXSxMdj1MWzJdLFVpPVVbMF0sVWo9VVsxXSxVdj1VWzJdO3ZhciB4PW51bWVyaWMucmVwKFttXSwwKSx4aj1udW1lcmljLnJlcChbbV0sMCk7dmFyIGksaixrLGowLGoxLGEsZSxjLGQsSzt2YXIgc29sPW51bWVyaWMuY2NzTFBTb2x2ZSxtYXg9TWF0aC5tYXgsYWJzPU1hdGguYWJzO3ZhciBQPW51bWVyaWMubGluc3BhY2UoMCxtLTEpLFBpbnY9bnVtZXJpYy5saW5zcGFjZSgwLG0tMSk7dmFyIGRmcz1uZXcgbnVtZXJpYy5jY3NERlMobSk7aWYodHlwZW9mIHRocmVzaG9sZD09PSJ1bmRlZmluZWQiKXRocmVzaG9sZD0xO2ZvcihpPTA7aTxtOysraSl7c29sKEwsQSx4LHhqLGksUGludixkZnMpO2E9LTE7ZT0tMTtmb3Ioaj0KeGoubGVuZ3RoLTE7aiE9PS0xOy0tail7az14altqXTtpZihrPD1pKWNvbnRpbnVlO2M9YWJzKHhba10pO2lmKGM+YSl7ZT1rO2E9Y319aWYoYWJzKHhbaV0pPHRocmVzaG9sZCphKXtqPVBbaV07YT1QW2VdO1BbaV09YTtQaW52W2FdPWk7UFtlXT1qO1BpbnZbal09ZTthPXhbaV07eFtpXT14W2VdO3hbZV09YX1hPUxpW2ldO2U9VWlbaV07ZD14W2ldO0xqW2FdPVBbaV07THZbYV09MTsrK2E7Zm9yKGo9eGoubGVuZ3RoLTE7aiE9PS0xOy0tail7az14altqXTtjPXhba107eGpbal09MDt4W2tdPTA7aWYoazw9aSl7VWpbZV09aztVdltlXT1jOysrZX1lbHNle0xqW2FdPVBba107THZbYV09Yy9kOysrYX19TGlbaSsxXT1hO1VpW2krMV09ZX1mb3Ioaj1Mai5sZW5ndGgtMTtqIT09LTE7LS1qKUxqW2pdPVBpbnZbTGpbal1dO3JldHVybntMOkwsVTpVLFA6UCxQaW52OlBpbnZ9fTsKbnVtZXJpYy5jY3NERlMwPWZ1bmN0aW9uIGNjc0RGUzAobil7dGhpcy5rPUFycmF5KG4pO3RoaXMuazE9QXJyYXkobik7dGhpcy5qPUFycmF5KG4pfTsKbnVtZXJpYy5jY3NERlMwLnByb3RvdHlwZS5kZnM9ZnVuY3Rpb24gZGZzKEosQWksQWoseCx4aixQaW52LFApe3ZhciBtPTAsZm9vLG49eGoubGVuZ3RoO3ZhciBrPXRoaXMuayxrMT10aGlzLmsxLGo9dGhpcy5qLGttLGsxMTtpZih4W0pdIT09MClyZXR1cm47eFtKXT0xO2pbMF09SjtrWzBdPWttPUFpW1BpbnZbSl1dO2sxWzBdPWsxMT1BaVtQaW52W0pdKzFdO3doaWxlKDEpe2lmKGlzTmFOKGttKSl0aHJvdyBuZXcgRXJyb3IoIk93ISIpO2lmKGttPj1rMTEpe3hqW25dPVBpbnZbalttXV07aWYobT09PTApcmV0dXJuOysrbjstLW07a209a1ttXTtrMTE9azFbbV19ZWxzZXtmb289QWpba21dO2lmKHhbZm9vXT09PTApe3hbZm9vXT0xO2tbbV09a207KyttO2pbbV09Zm9vO2Zvbz1QaW52W2Zvb107a209QWlbZm9vXTtrMVttXT1rMTE9QWlbZm9vKzFdfWVsc2UrK2ttfX19OwpudW1lcmljLmNjc0xQU29sdmUwPWZ1bmN0aW9uIGNjc0xQU29sdmUwKEEsQix5LHhqLEksUGludixQLGRmcyl7dmFyIEFpPUFbMF0sQWo9QVsxXSxBdj1BWzJdLG09QWkubGVuZ3RoLTEsbj0wO3ZhciBCaT1CWzBdLEJqPUJbMV0sQnY9QlsyXTt2YXIgaSxpMCxpMSxqLEosajAsajEsayxsLGwwLGwxLGE7aTA9QmlbSV07aTE9QmlbSSsxXTt4ai5sZW5ndGg9MDtmb3IoaT1pMDtpPGkxOysraSlkZnMuZGZzKEJqW2ldLEFpLEFqLHkseGosUGludixQKTtmb3IoaT14ai5sZW5ndGgtMTtpIT09LTE7LS1pKXtqPXhqW2ldO3lbUFtqXV09MH1mb3IoaT1pMDtpIT09aTE7KytpKXtqPUJqW2ldO3lbal09QnZbaV19Zm9yKGk9eGoubGVuZ3RoLTE7aSE9PS0xOy0taSl7aj14altpXTtsPVBbal07ajA9QWlbal07ajE9QWlbaisxXTtmb3Ioaz1qMDtrPGoxOysraylpZihBaltrXT09PWwpe3lbbF0vPUF2W2tdO2JyZWFrfWE9eVtsXTtmb3Ioaz1qMDtrPGoxOysrayl5W0FqW2tdXS09YSpBdltrXTsKeVtsXT1hfX07Cm51bWVyaWMuY2NzTFVQMD1mdW5jdGlvbiBjY3NMVVAwKEEsdGhyZXNob2xkKXt2YXIgbT1BWzBdLmxlbmd0aC0xO3ZhciBMPVtudW1lcmljLnJlcChbbSsxXSwwKSxbXSxbXV0sVT1bbnVtZXJpYy5yZXAoW20rMV0sMCksW10sW11dO3ZhciBMaT1MWzBdLExqPUxbMV0sTHY9TFsyXSxVaT1VWzBdLFVqPVVbMV0sVXY9VVsyXTt2YXIgeT1udW1lcmljLnJlcChbbV0sMCkseGo9bnVtZXJpYy5yZXAoW21dLDApO3ZhciBpLGosayxqMCxqMSxhLGUsYyxkLEs7dmFyIHNvbD1udW1lcmljLmNjc0xQU29sdmUwLG1heD1NYXRoLm1heCxhYnM9TWF0aC5hYnM7dmFyIFA9bnVtZXJpYy5saW5zcGFjZSgwLG0tMSksUGludj1udW1lcmljLmxpbnNwYWNlKDAsbS0xKTt2YXIgZGZzPW5ldyBudW1lcmljLmNjc0RGUzAobSk7aWYodHlwZW9mIHRocmVzaG9sZD09PSJ1bmRlZmluZWQiKXRocmVzaG9sZD0xO2ZvcihpPTA7aTxtOysraSl7c29sKEwsQSx5LHhqLGksUGludixQLGRmcyk7YT0tMTtlPS0xOwpmb3Ioaj14ai5sZW5ndGgtMTtqIT09LTE7LS1qKXtrPXhqW2pdO2lmKGs8PWkpY29udGludWU7Yz1hYnMoeVtQW2tdXSk7aWYoYz5hKXtlPWs7YT1jfX1pZihhYnMoeVtQW2ldXSk8dGhyZXNob2xkKmEpe2o9UFtpXTthPVBbZV07UFtpXT1hO1BpbnZbYV09aTtQW2VdPWo7UGludltqXT1lfWE9TGlbaV07ZT1VaVtpXTtkPXlbUFtpXV07TGpbYV09UFtpXTtMdlthXT0xOysrYTtmb3Ioaj14ai5sZW5ndGgtMTtqIT09LTE7LS1qKXtrPXhqW2pdO2M9eVtQW2tdXTt4altqXT0wO3lbUFtrXV09MDtpZihrPD1pKXtValtlXT1rO1V2W2VdPWM7KytlfWVsc2V7TGpbYV09UFtrXTtMdlthXT1jL2Q7KythfX1MaVtpKzFdPWE7VWlbaSsxXT1lfWZvcihqPUxqLmxlbmd0aC0xO2ohPT0tMTstLWopTGpbal09UGludltMaltqXV07cmV0dXJue0w6TCxVOlUsUDpQLFBpbnY6UGludn19O251bWVyaWMuY2NzTFVQPW51bWVyaWMuY2NzTFVQMDsKbnVtZXJpYy5jY3NEaW09ZnVuY3Rpb24gY2NzRGltKEEpe3JldHVybltudW1lcmljLnN1cChBWzFdKSsxLEFbMF0ubGVuZ3RoLTFdfTsKbnVtZXJpYy5jY3NHZXRCbG9jaz1mdW5jdGlvbiBjY3NHZXRCbG9jayhBLGksail7dmFyIHM9bnVtZXJpYy5jY3NEaW0oQSksbT1zWzBdLG49c1sxXTtpZih0eXBlb2YgaT09PSJ1bmRlZmluZWQiKWk9bnVtZXJpYy5saW5zcGFjZSgwLG0tMSk7ZWxzZSBpZih0eXBlb2YgaT09PSJudW1iZXIiKWk9W2ldO2lmKHR5cGVvZiBqPT09InVuZGVmaW5lZCIpaj1udW1lcmljLmxpbnNwYWNlKDAsbi0xKTtlbHNlIGlmKHR5cGVvZiBqPT09Im51bWJlciIpaj1bal07dmFyIHAscDAscDEsUD1pLmxlbmd0aCxxLFE9ai5sZW5ndGgscixqcSxpcDt2YXIgQmk9bnVtZXJpYy5yZXAoW25dLDApLEJqPVtdLEJ2PVtdLEI9W0JpLEJqLEJ2XTt2YXIgQWk9QVswXSxBaj1BWzFdLEF2PUFbMl07dmFyIHg9bnVtZXJpYy5yZXAoW21dLDApLGNvdW50PTAsZmxhZ3M9bnVtZXJpYy5yZXAoW21dLDApO2ZvcihxPTA7cTxROysrcSl7anE9altxXTt2YXIgcTA9QWlbanFdO3ZhciBxMT1BaVtqcSsxXTtmb3IocD1xMDtwPApxMTsrK3Ape3I9QWpbcF07ZmxhZ3Nbcl09MTt4W3JdPUF2W3BdfWZvcihwPTA7cDxQOysrcCl7aXA9aVtwXTtpZihmbGFnc1tpcF0pe0JqW2NvdW50XT1wO0J2W2NvdW50XT14W2lbcF1dOysrY291bnR9fWZvcihwPXEwO3A8cTE7KytwKXtyPUFqW3BdO2ZsYWdzW3JdPTB9QmlbcSsxXT1jb3VudH1yZXR1cm4gQn07Cm51bWVyaWMuY2NzRG90PWZ1bmN0aW9uIGNjc0RvdChBLEIpe3ZhciBBaT1BWzBdLEFqPUFbMV0sQXY9QVsyXTt2YXIgQmk9QlswXSxCaj1CWzFdLEJ2PUJbMl07dmFyIHNBPW51bWVyaWMuY2NzRGltKEEpLHNCPW51bWVyaWMuY2NzRGltKEIpO3ZhciBtPXNBWzBdLG49c0FbMV0sbz1zQlsxXTt2YXIgeD1udW1lcmljLnJlcChbbV0sMCksZmxhZ3M9bnVtZXJpYy5yZXAoW21dLDApLHhqPUFycmF5KG0pO3ZhciBDaT1udW1lcmljLnJlcChbb10sMCksQ2o9W10sQ3Y9W10sQz1bQ2ksQ2osQ3ZdO3ZhciBpLGosayxqMCxqMSxpMCxpMSxsLHAsYSxiO2ZvcihrPTA7ayE9PW87KytrKXtqMD1CaVtrXTtqMT1CaVtrKzFdO3A9MDtmb3Ioaj1qMDtqPGoxOysrail7YT1CaltqXTtiPUJ2W2pdO2kwPUFpW2FdO2kxPUFpW2ErMV07Zm9yKGk9aTA7aTxpMTsrK2kpe2w9QWpbaV07aWYoZmxhZ3NbbF09PT0wKXt4altwXT1sO2ZsYWdzW2xdPTE7cD1wKzF9eFtsXT14W2xdK0F2W2ldKmJ9fWowPUNpW2tdOwpqMT1qMCtwO0NpW2srMV09ajE7Zm9yKGo9cC0xO2ohPT0tMTstLWope2I9ajArajtpPXhqW2pdO0NqW2JdPWk7Q3ZbYl09eFtpXTtmbGFnc1tpXT0wO3hbaV09MH1DaVtrKzFdPUNpW2tdK3B9cmV0dXJuIEN9OwpudW1lcmljLmNjc0xVUFNvbHZlPWZ1bmN0aW9uIGNjc0xVUFNvbHZlKExVUCxCKXt2YXIgTD1MVVAuTCxVPUxVUC5VLFA9TFVQLlA7dmFyIEJpPUJbMF07dmFyIGZsYWc9ZmFsc2U7aWYodHlwZW9mIEJpIT09Im9iamVjdCIpe0I9W1swLEIubGVuZ3RoXSxudW1lcmljLmxpbnNwYWNlKDAsQi5sZW5ndGgtMSksQl07Qmk9QlswXTtmbGFnPXRydWV9dmFyIEJqPUJbMV0sQnY9QlsyXTt2YXIgbj1MWzBdLmxlbmd0aC0xLG09QmkubGVuZ3RoLTE7dmFyIHg9bnVtZXJpYy5yZXAoW25dLDApLHhqPUFycmF5KG4pO3ZhciBiPW51bWVyaWMucmVwKFtuXSwwKSxiaj1BcnJheShuKTt2YXIgWGk9bnVtZXJpYy5yZXAoW20rMV0sMCksWGo9W10sWHY9W107dmFyIHNvbD1udW1lcmljLmNjc1RTb2x2ZTt2YXIgaSxqLGowLGoxLGssSixOPTA7Zm9yKGk9MDtpPG07KytpKXtrPTA7ajA9QmlbaV07ajE9QmlbaSsxXTtmb3Ioaj1qMDtqPGoxOysrail7Sj1MVVAuUGludltCaltqXV07Ympba109SjtiW0pdPQpCdltqXTsrK2t9YmoubGVuZ3RoPWs7c29sKEwsYix4LGJqLHhqKTtmb3Ioaj1iai5sZW5ndGgtMTtqIT09LTE7LS1qKWJbYmpbal1dPTA7c29sKFUseCxiLHhqLGJqKTtpZihmbGFnKXJldHVybiBiO2ZvcihqPXhqLmxlbmd0aC0xO2ohPT0tMTstLWopeFt4altqXV09MDtmb3Ioaj1iai5sZW5ndGgtMTtqIT09LTE7LS1qKXtKPWJqW2pdO1hqW05dPUo7WHZbTl09YltKXTtiW0pdPTA7KytOfVhpW2krMV09Tn1yZXR1cm5bWGksWGosWHZdfTsKbnVtZXJpYy5jY3NiaW5vcD1mdW5jdGlvbiBjY3NiaW5vcChib2R5LHNldHVwKXtpZih0eXBlb2Ygc2V0dXA9PT0idW5kZWZpbmVkIilzZXR1cD0iIjtyZXR1cm4gRnVuY3Rpb24oIlgiLCJZIiwidmFyIFhpIFx4M2QgWFswXSwgWGogXHgzZCBYWzFdLCBYdiBceDNkIFhbMl07XG4iKyJ2YXIgWWkgXHgzZCBZWzBdLCBZaiBceDNkIFlbMV0sIFl2IFx4M2QgWVsyXTtcbiIrInZhciBuIFx4M2QgWGkubGVuZ3RoLTEsbSBceDNkIE1hdGgubWF4KG51bWVyaWMuc3VwKFhqKSxudW1lcmljLnN1cChZaikpKzE7XG4iKyJ2YXIgWmkgXHgzZCBudW1lcmljLnJlcChbbisxXSwwKSwgWmogXHgzZCBbXSwgWnYgXHgzZCBbXTtcbiIrInZhciB4IFx4M2QgbnVtZXJpYy5yZXAoW21dLDApLHkgXHgzZCBudW1lcmljLnJlcChbbV0sMCk7XG4iKyJ2YXIgeGsseWssems7XG4iKyJ2YXIgaSxqLGowLGoxLGsscFx4M2QwO1xuIitzZXR1cCsiZm9yKGlceDNkMDtpXHgzY247KytpKSB7XG4iKyIgIGowIFx4M2QgWGlbaV07IGoxIFx4M2QgWGlbaSsxXTtcbiIrCiIgIGZvcihqXHgzZGowO2ohXHgzZFx4M2RqMTsrK2opIHtcbiIrIiAgICBrIFx4M2QgWGpbal07XG4iKyIgICAgeFtrXSBceDNkIDE7XG4iKyIgICAgWmpbcF0gXHgzZCBrO1xuIisiICAgICsrcDtcbiIrIiAgfVxuIisiICBqMCBceDNkIFlpW2ldOyBqMSBceDNkIFlpW2krMV07XG4iKyIgIGZvcihqXHgzZGowO2ohXHgzZFx4M2RqMTsrK2opIHtcbiIrIiAgICBrIFx4M2QgWWpbal07XG4iKyIgICAgeVtrXSBceDNkIFl2W2pdO1xuIisiICAgIGlmKHhba10gXHgzZFx4M2RceDNkIDApIHtcbiIrIiAgICAgIFpqW3BdIFx4M2QgaztcbiIrIiAgICAgICsrcDtcbiIrIiAgICB9XG4iKyIgIH1cbiIrIiAgWmlbaSsxXSBceDNkIHA7XG4iKyIgIGowIFx4M2QgWGlbaV07IGoxIFx4M2QgWGlbaSsxXTtcbiIrIiAgZm9yKGpceDNkajA7aiFceDNkXHgzZGoxOysraikgeFtYaltqXV0gXHgzZCBYdltqXTtcbiIrIiAgajAgXHgzZCBaaVtpXTsgajEgXHgzZCBaaVtpKzFdO1xuIisiICBmb3Ioalx4M2RqMDtqIVx4M2RceDNkajE7KytqKSB7XG4iKwoiICAgIGsgXHgzZCBaaltqXTtcbiIrIiAgICB4ayBceDNkIHhba107XG4iKyIgICAgeWsgXHgzZCB5W2tdO1xuIitib2R5KyJcbiIrIiAgICBadltqXSBceDNkIHprO1xuIisiICB9XG4iKyIgIGowIFx4M2QgWGlbaV07IGoxIFx4M2QgWGlbaSsxXTtcbiIrIiAgZm9yKGpceDNkajA7aiFceDNkXHgzZGoxOysraikgeFtYaltqXV0gXHgzZCAwO1xuIisiICBqMCBceDNkIFlpW2ldOyBqMSBceDNkIFlpW2krMV07XG4iKyIgIGZvcihqXHgzZGowO2ohXHgzZFx4M2RqMTsrK2opIHlbWWpbal1dIFx4M2QgMDtcbiIrIn1cbiIrInJldHVybiBbWmksWmosWnZdOyIpfTsKKGZ1bmN0aW9uKCl7dmFyIGssQSxCLEM7Zm9yKGsgaW4gbnVtZXJpYy5vcHMyKXtpZihpc0Zpbml0ZShldmFsKCIxIitudW1lcmljLm9wczJba10rIjAiKSkpQT0iW1lbMF0sWVsxXSxudW1lcmljLiIraysiKFgsWVsyXSldIjtlbHNlIEE9Ik5hTiI7aWYoaXNGaW5pdGUoZXZhbCgiMCIrbnVtZXJpYy5vcHMyW2tdKyIxIikpKUI9IltYWzBdLFhbMV0sbnVtZXJpYy4iK2srIihYWzJdLFkpXSI7ZWxzZSBCPSJOYU4iO2lmKGlzRmluaXRlKGV2YWwoIjEiK251bWVyaWMub3BzMltrXSsiMCIpKSYmaXNGaW5pdGUoZXZhbCgiMCIrbnVtZXJpYy5vcHMyW2tdKyIxIikpKUM9Im51bWVyaWMuY2NzIitrKyJNTShYLFkpIjtlbHNlIEM9Ik5hTiI7bnVtZXJpY1siY2NzIitrKyJNTSJdPW51bWVyaWMuY2NzYmlub3AoInprIFx4M2QgeGsgIitudW1lcmljLm9wczJba10rInlrOyIpO251bWVyaWNbImNjcyIra109RnVuY3Rpb24oIlgiLCJZIiwnaWYodHlwZW9mIFggXHgzZFx4M2RceDNkICJudW1iZXIiKSByZXR1cm4gJysKQSsiO1xuIisnaWYodHlwZW9mIFkgXHgzZFx4M2RceDNkICJudW1iZXIiKSByZXR1cm4gJytCKyI7XG4iKyJyZXR1cm4gIitDKyI7XG4iKX19KSgpO251bWVyaWMuY2NzU2NhdHRlcj1mdW5jdGlvbiBjY3NTY2F0dGVyKEEpe3ZhciBBaT1BWzBdLEFqPUFbMV0sQXY9QVsyXTt2YXIgbj1udW1lcmljLnN1cChBaikrMSxtPUFpLmxlbmd0aDt2YXIgUmk9bnVtZXJpYy5yZXAoW25dLDApLFJqPUFycmF5KG0pLFJ2PUFycmF5KG0pO3ZhciBjb3VudHM9bnVtZXJpYy5yZXAoW25dLDApLGk7Zm9yKGk9MDtpPG07KytpKWNvdW50c1tBaltpXV0rKztmb3IoaT0wO2k8bjsrK2kpUmlbaSsxXT1SaVtpXStjb3VudHNbaV07dmFyIHB0cj1SaS5zbGljZSgwKSxrLEFpaTtmb3IoaT0wO2k8bTsrK2kpe0FpaT1BaltpXTtrPXB0cltBaWldO1JqW2tdPUFpW2ldO1J2W2tdPUF2W2ldO3B0cltBaWldPXB0cltBaWldKzF9cmV0dXJuW1JpLFJqLFJ2XX07Cm51bWVyaWMuY2NzR2F0aGVyPWZ1bmN0aW9uIGNjc0dhdGhlcihBKXt2YXIgQWk9QVswXSxBaj1BWzFdLEF2PUFbMl07dmFyIG49QWkubGVuZ3RoLTEsbT1Bai5sZW5ndGg7dmFyIFJpPUFycmF5KG0pLFJqPUFycmF5KG0pLFJ2PUFycmF5KG0pO3ZhciBpLGosajAsajEscDtwPTA7Zm9yKGk9MDtpPG47KytpKXtqMD1BaVtpXTtqMT1BaVtpKzFdO2ZvcihqPWowO2ohPT1qMTsrK2ope1JqW3BdPWk7UmlbcF09QWpbal07UnZbcF09QXZbal07KytwfX1yZXR1cm5bUmksUmosUnZdfTsKbnVtZXJpYy5zZGltPWZ1bmN0aW9uIGRpbShBLHJldCxrKXtpZih0eXBlb2YgcmV0PT09InVuZGVmaW5lZCIpcmV0PVtdO2lmKHR5cGVvZiBBIT09Im9iamVjdCIpcmV0dXJuIHJldDtpZih0eXBlb2Ygaz09PSJ1bmRlZmluZWQiKWs9MDtpZighKGsgaW4gcmV0KSlyZXRba109MDtpZihBLmxlbmd0aD5yZXRba10pcmV0W2tdPUEubGVuZ3RoO3ZhciBpO2ZvcihpIGluIEEpaWYoQS5oYXNPd25Qcm9wZXJ0eShpKSlkaW0oQVtpXSxyZXQsaysxKTtyZXR1cm4gcmV0fTsKbnVtZXJpYy5zY2xvbmU9ZnVuY3Rpb24gY2xvbmUoQSxrLG4pe2lmKHR5cGVvZiBrPT09InVuZGVmaW5lZCIpaz0wO2lmKHR5cGVvZiBuPT09InVuZGVmaW5lZCIpbj1udW1lcmljLnNkaW0oQSkubGVuZ3RoO3ZhciBpLHJldD1BcnJheShBLmxlbmd0aCk7aWYoaz09PW4tMSl7Zm9yKGkgaW4gQSlpZihBLmhhc093blByb3BlcnR5KGkpKXJldFtpXT1BW2ldO3JldHVybiByZXR9Zm9yKGkgaW4gQSlpZihBLmhhc093blByb3BlcnR5KGkpKXJldFtpXT1jbG9uZShBW2ldLGsrMSxuKTtyZXR1cm4gcmV0fTtudW1lcmljLnNkaWFnPWZ1bmN0aW9uIGRpYWcoZCl7dmFyIG49ZC5sZW5ndGgsaSxyZXQ9QXJyYXkobiksaTEsaTIsaTM7Zm9yKGk9bi0xO2k+PTE7aS09Mil7aTE9aS0xO3JldFtpXT1bXTtyZXRbaV1baV09ZFtpXTtyZXRbaTFdPVtdO3JldFtpMV1baTFdPWRbaTFdfWlmKGk9PT0wKXtyZXRbMF09W107cmV0WzBdWzBdPWRbaV19cmV0dXJuIHJldH07Cm51bWVyaWMuc2lkZW50aXR5PWZ1bmN0aW9uIGlkZW50aXR5KG4pe3JldHVybiBudW1lcmljLnNkaWFnKG51bWVyaWMucmVwKFtuXSwxKSl9O251bWVyaWMuc3RyYW5zcG9zZT1mdW5jdGlvbiB0cmFuc3Bvc2UoQSl7dmFyIHJldD1bXSxuPUEubGVuZ3RoLGksaixBaTtmb3IoaSBpbiBBKXtpZighQS5oYXNPd25Qcm9wZXJ0eShpKSljb250aW51ZTtBaT1BW2ldO2ZvcihqIGluIEFpKXtpZighQWkuaGFzT3duUHJvcGVydHkoaikpY29udGludWU7aWYodHlwZW9mIHJldFtqXSE9PSJvYmplY3QiKXJldFtqXT1bXTtyZXRbal1baV09QWlbal19fXJldHVybiByZXR9O251bWVyaWMuc0xVUD1mdW5jdGlvbiBMVVAoQSx0b2wpe3Rocm93IG5ldyBFcnJvcigiVGhlIGZ1bmN0aW9uIG51bWVyaWMuc0xVUCBoYWQgYSBidWcgaW4gaXQgYW5kIGhhcyBiZWVuIHJlbW92ZWQuIFBsZWFzZSB1c2UgdGhlIG5ldyBudW1lcmljLmNjc0xVUCBmdW5jdGlvbiBpbnN0ZWFkLiIpO307Cm51bWVyaWMuc2RvdE1NPWZ1bmN0aW9uIGRvdE1NKEEsQil7dmFyIHA9QS5sZW5ndGgscT1CLmxlbmd0aCxCVD1udW1lcmljLnN0cmFuc3Bvc2UoQikscj1CVC5sZW5ndGgsQWksQlRrO3ZhciBpLGosayxhY2N1bTt2YXIgcmV0PUFycmF5KHApLHJldGk7Zm9yKGk9cC0xO2k+PTA7aS0tKXtyZXRpPVtdO0FpPUFbaV07Zm9yKGs9ci0xO2s+PTA7ay0tKXthY2N1bT0wO0JUaz1CVFtrXTtmb3IoaiBpbiBBaSl7aWYoIUFpLmhhc093blByb3BlcnR5KGopKWNvbnRpbnVlO2lmKGogaW4gQlRrKWFjY3VtKz1BaVtqXSpCVGtbal19aWYoYWNjdW0pcmV0aVtrXT1hY2N1bX1yZXRbaV09cmV0aX1yZXR1cm4gcmV0fTsKbnVtZXJpYy5zZG90TVY9ZnVuY3Rpb24gZG90TVYoQSx4KXt2YXIgcD1BLmxlbmd0aCxBaSxpLGo7dmFyIHJldD1BcnJheShwKSxhY2N1bTtmb3IoaT1wLTE7aT49MDtpLS0pe0FpPUFbaV07YWNjdW09MDtmb3IoaiBpbiBBaSl7aWYoIUFpLmhhc093blByb3BlcnR5KGopKWNvbnRpbnVlO2lmKHhbal0pYWNjdW0rPUFpW2pdKnhbal19aWYoYWNjdW0pcmV0W2ldPWFjY3VtfXJldHVybiByZXR9O251bWVyaWMuc2RvdFZNPWZ1bmN0aW9uIGRvdE1WKHgsQSl7dmFyIGksaixBaSxhbHBoYTt2YXIgcmV0PVtdLGFjY3VtO2ZvcihpIGluIHgpe2lmKCF4Lmhhc093blByb3BlcnR5KGkpKWNvbnRpbnVlO0FpPUFbaV07YWxwaGE9eFtpXTtmb3IoaiBpbiBBaSl7aWYoIUFpLmhhc093blByb3BlcnR5KGopKWNvbnRpbnVlO2lmKCFyZXRbal0pcmV0W2pdPTA7cmV0W2pdKz1hbHBoYSpBaVtqXX19cmV0dXJuIHJldH07Cm51bWVyaWMuc2RvdFZWPWZ1bmN0aW9uIGRvdFZWKHgseSl7dmFyIGkscmV0PTA7Zm9yKGkgaW4geClpZih4W2ldJiZ5W2ldKXJldCs9eFtpXSp5W2ldO3JldHVybiByZXR9O251bWVyaWMuc2RvdD1mdW5jdGlvbiBkb3QoQSxCKXt2YXIgbT1udW1lcmljLnNkaW0oQSkubGVuZ3RoLG49bnVtZXJpYy5zZGltKEIpLmxlbmd0aDt2YXIgaz1tKjFFMytuO3N3aXRjaChrKXtjYXNlIDA6cmV0dXJuIEEqQjtjYXNlIDEwMDE6cmV0dXJuIG51bWVyaWMuc2RvdFZWKEEsQik7Y2FzZSAyMDAxOnJldHVybiBudW1lcmljLnNkb3RNVihBLEIpO2Nhc2UgMTAwMjpyZXR1cm4gbnVtZXJpYy5zZG90Vk0oQSxCKTtjYXNlIDIwMDI6cmV0dXJuIG51bWVyaWMuc2RvdE1NKEEsQik7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoIm51bWVyaWMuc2RvdCBub3QgaW1wbGVtZW50ZWQgZm9yIHRlbnNvcnMgb2Ygb3JkZXIgIittKyIgYW5kICIrbik7fX07Cm51bWVyaWMuc3NjYXR0ZXI9ZnVuY3Rpb24gc2NhdHRlcihWKXt2YXIgbj1WWzBdLmxlbmd0aCxWaWosaSxqLG09Vi5sZW5ndGgsQT1bXSxBajtmb3IoaT1uLTE7aT49MDstLWkpe2lmKCFWW20tMV1baV0pY29udGludWU7QWo9QTtmb3Ioaj0wO2o8bS0yO2orKyl7VmlqPVZbal1baV07aWYoIUFqW1Zpal0pQWpbVmlqXT1bXTtBaj1BaltWaWpdfUFqW1Zbal1baV1dPVZbaisxXVtpXX1yZXR1cm4gQX07Cm51bWVyaWMuc2dhdGhlcj1mdW5jdGlvbiBnYXRoZXIoQSxyZXQsayl7aWYodHlwZW9mIHJldD09PSJ1bmRlZmluZWQiKXJldD1bXTtpZih0eXBlb2Ygaz09PSJ1bmRlZmluZWQiKWs9W107dmFyIG4saSxBaTtuPWsubGVuZ3RoO2ZvcihpIGluIEEpaWYoQS5oYXNPd25Qcm9wZXJ0eShpKSl7a1tuXT1wYXJzZUludChpKTtBaT1BW2ldO2lmKHR5cGVvZiBBaT09PSJudW1iZXIiKXtpZihBaSl7aWYocmV0Lmxlbmd0aD09PTApZm9yKGk9bisxO2k+PTA7LS1pKXJldFtpXT1bXTtmb3IoaT1uO2k+PTA7LS1pKXJldFtpXS5wdXNoKGtbaV0pO3JldFtuKzFdLnB1c2goQWkpfX1lbHNlIGdhdGhlcihBaSxyZXQsayl9aWYoay5sZW5ndGg+bilrLnBvcCgpO3JldHVybiByZXR9OwpudW1lcmljLmNMVT1mdW5jdGlvbiBMVShBKXt2YXIgST1BWzBdLEo9QVsxXSxWPUFbMl07dmFyIHA9SS5sZW5ndGgsbT0wLGksaixrLGEsYixjO2ZvcihpPTA7aTxwO2krKylpZihJW2ldPm0pbT1JW2ldO20rKzt2YXIgTD1BcnJheShtKSxVPUFycmF5KG0pLGxlZnQ9bnVtZXJpYy5yZXAoW21dLEluZmluaXR5KSxyaWdodD1udW1lcmljLnJlcChbbV0sLUluZmluaXR5KTt2YXIgVWksVWosYWxwaGE7Zm9yKGs9MDtrPHA7aysrKXtpPUlba107aj1KW2tdO2lmKGo8bGVmdFtpXSlsZWZ0W2ldPWo7aWYoaj5yaWdodFtpXSlyaWdodFtpXT1qfWZvcihpPTA7aTxtLTE7aSsrKWlmKHJpZ2h0W2ldPnJpZ2h0W2krMV0pcmlnaHRbaSsxXT1yaWdodFtpXTtmb3IoaT1tLTE7aT49MTtpLS0paWYobGVmdFtpXTxsZWZ0W2ktMV0pbGVmdFtpLTFdPWxlZnRbaV07dmFyIGNvdW50TD0wLGNvdW50VT0wO2ZvcihpPTA7aTxtO2krKyl7VVtpXT1udW1lcmljLnJlcChbcmlnaHRbaV0tbGVmdFtpXSsxXSwKMCk7TFtpXT1udW1lcmljLnJlcChbaS1sZWZ0W2ldXSwwKTtjb3VudEwrPWktbGVmdFtpXSsxO2NvdW50VSs9cmlnaHRbaV0taSsxfWZvcihrPTA7azxwO2srKyl7aT1JW2tdO1VbaV1bSltrXS1sZWZ0W2ldXT1WW2tdfWZvcihpPTA7aTxtLTE7aSsrKXthPWktbGVmdFtpXTtVaT1VW2ldO2ZvcihqPWkrMTtsZWZ0W2pdPD1pJiZqPG07aisrKXtiPWktbGVmdFtqXTtjPXJpZ2h0W2ldLWk7VWo9VVtqXTthbHBoYT1ValtiXS9VaVthXTtpZihhbHBoYSl7Zm9yKGs9MTtrPD1jO2srKylValtrK2JdLT1hbHBoYSpVaVtrK2FdO0xbal1baS1sZWZ0W2pdXT1hbHBoYX19fXZhciBVaT1bXSxVaj1bXSxVdj1bXSxMaT1bXSxMaj1bXSxMdj1bXTt2YXIgcCxxLGZvbztwPTA7cT0wO2ZvcihpPTA7aTxtO2krKyl7YT1sZWZ0W2ldO2I9cmlnaHRbaV07Zm9vPVVbaV07Zm9yKGo9aTtqPD1iO2orKylpZihmb29bai1hXSl7VWlbcF09aTtValtwXT1qO1V2W3BdPWZvb1tqLWFdO3ArK31mb289TFtpXTtmb3Ioaj0KYTtqPGk7aisrKWlmKGZvb1tqLWFdKXtMaVtxXT1pO0xqW3FdPWo7THZbcV09Zm9vW2otYV07cSsrfUxpW3FdPWk7TGpbcV09aTtMdltxXT0xO3ErK31yZXR1cm57VTpbVWksVWosVXZdLEw6W0xpLExqLEx2XX19O251bWVyaWMuY0xVc29sdmU9ZnVuY3Rpb24gTFVzb2x2ZShsdSxiKXt2YXIgTD1sdS5MLFU9bHUuVSxyZXQ9bnVtZXJpYy5jbG9uZShiKTt2YXIgTGk9TFswXSxMaj1MWzFdLEx2PUxbMl07dmFyIFVpPVVbMF0sVWo9VVsxXSxVdj1VWzJdO3ZhciBwPVVpLmxlbmd0aCxxPUxpLmxlbmd0aDt2YXIgbT1yZXQubGVuZ3RoLGksaixrO2s9MDtmb3IoaT0wO2k8bTtpKyspe3doaWxlKExqW2tdPGkpe3JldFtpXS09THZba10qcmV0W0xqW2tdXTtrKyt9aysrfWs9cC0xO2ZvcihpPW0tMTtpPj0wO2ktLSl7d2hpbGUoVWpba10+aSl7cmV0W2ldLT1VdltrXSpyZXRbVWpba11dO2stLX1yZXRbaV0vPVV2W2tdO2stLX1yZXR1cm4gcmV0fTsKbnVtZXJpYy5jZ3JpZD1mdW5jdGlvbiBncmlkKG4sc2hhcGUpe2lmKHR5cGVvZiBuPT09Im51bWJlciIpbj1bbixuXTt2YXIgcmV0PW51bWVyaWMucmVwKG4sLTEpO3ZhciBpLGosY291bnQ7aWYodHlwZW9mIHNoYXBlIT09ImZ1bmN0aW9uIilzd2l0Y2goc2hhcGUpe2Nhc2UgIkwiOnNoYXBlPWZ1bmN0aW9uKGksail7cmV0dXJuIGk+PW5bMF0vMnx8ajxuWzFdLzJ9O2JyZWFrO2RlZmF1bHQ6c2hhcGU9ZnVuY3Rpb24oaSxqKXtyZXR1cm4gdHJ1ZX07YnJlYWt9Y291bnQ9MDtmb3IoaT0xO2k8blswXS0xO2krKylmb3Ioaj0xO2o8blsxXS0xO2orKylpZihzaGFwZShpLGopKXtyZXRbaV1bal09Y291bnQ7Y291bnQrK31yZXR1cm4gcmV0fTsKbnVtZXJpYy5jZGVsc3E9ZnVuY3Rpb24gZGVsc3EoZyl7dmFyIGRpcj1bWy0xLDBdLFswLC0xXSxbMCwxXSxbMSwwXV07dmFyIHM9bnVtZXJpYy5kaW0oZyksbT1zWzBdLG49c1sxXSxpLGosayxwLHE7dmFyIExpPVtdLExqPVtdLEx2PVtdO2ZvcihpPTE7aTxtLTE7aSsrKWZvcihqPTE7ajxuLTE7aisrKXtpZihnW2ldW2pdPDApY29udGludWU7Zm9yKGs9MDtrPDQ7aysrKXtwPWkrZGlyW2tdWzBdO3E9aitkaXJba11bMV07aWYoZ1twXVtxXTwwKWNvbnRpbnVlO0xpLnB1c2goZ1tpXVtqXSk7TGoucHVzaChnW3BdW3FdKTtMdi5wdXNoKC0xKX1MaS5wdXNoKGdbaV1bal0pO0xqLnB1c2goZ1tpXVtqXSk7THYucHVzaCg0KX1yZXR1cm5bTGksTGosTHZdfTsKbnVtZXJpYy5jZG90TVY9ZnVuY3Rpb24gZG90TVYoQSx4KXt2YXIgcmV0LEFpPUFbMF0sQWo9QVsxXSxBdj1BWzJdLGsscD1BaS5sZW5ndGgsTjtOPTA7Zm9yKGs9MDtrPHA7aysrKWlmKEFpW2tdPk4pTj1BaVtrXTtOKys7cmV0PW51bWVyaWMucmVwKFtOXSwwKTtmb3Ioaz0wO2s8cDtrKyspcmV0W0FpW2tdXSs9QXZba10qeFtBaltrXV07cmV0dXJuIHJldH07bnVtZXJpYy5TcGxpbmU9ZnVuY3Rpb24gU3BsaW5lKHgseWwseXIsa2wsa3Ipe3RoaXMueD14O3RoaXMueWw9eWw7dGhpcy55cj15cjt0aGlzLmtsPWtsO3RoaXMua3I9a3J9OwpudW1lcmljLlNwbGluZS5wcm90b3R5cGUuX2F0PWZ1bmN0aW9uIF9hdCh4MSxwKXt2YXIgeD10aGlzLng7dmFyIHlsPXRoaXMueWw7dmFyIHlyPXRoaXMueXI7dmFyIGtsPXRoaXMua2w7dmFyIGtyPXRoaXMua3I7dmFyIHgxLGEsYix0O3ZhciBhZGQ9bnVtZXJpYy5hZGQsc3ViPW51bWVyaWMuc3ViLG11bD1udW1lcmljLm11bDthPXN1YihtdWwoa2xbcF0seFtwKzFdLXhbcF0pLHN1Yih5cltwKzFdLHlsW3BdKSk7Yj1hZGQobXVsKGtyW3ArMV0seFtwXS14W3ArMV0pLHN1Yih5cltwKzFdLHlsW3BdKSk7dD0oeDEteFtwXSkvKHhbcCsxXS14W3BdKTt2YXIgcz10KigxLXQpO3JldHVybiBhZGQoYWRkKGFkZChtdWwoMS10LHlsW3BdKSxtdWwodCx5cltwKzFdKSksbXVsKGEscyooMS10KSkpLG11bChiLHMqdCkpfTsKbnVtZXJpYy5TcGxpbmUucHJvdG90eXBlLmF0PWZ1bmN0aW9uIGF0KHgwKXtpZih0eXBlb2YgeDA9PT0ibnVtYmVyIil7dmFyIHg9dGhpcy54O3ZhciBuPXgubGVuZ3RoO3ZhciBwLHEsbWlkLGZsb29yPU1hdGguZmxvb3IsYSxiLHQ7cD0wO3E9bi0xO3doaWxlKHEtcD4xKXttaWQ9Zmxvb3IoKHArcSkvMik7aWYoeFttaWRdPD14MClwPW1pZDtlbHNlIHE9bWlkfXJldHVybiB0aGlzLl9hdCh4MCxwKX12YXIgbj14MC5sZW5ndGgsaSxyZXQ9QXJyYXkobik7Zm9yKGk9bi0xO2khPT0tMTstLWkpcmV0W2ldPXRoaXMuYXQoeDBbaV0pO3JldHVybiByZXR9OwpudW1lcmljLlNwbGluZS5wcm90b3R5cGUuZGlmZj1mdW5jdGlvbiBkaWZmKCl7dmFyIHg9dGhpcy54O3ZhciB5bD10aGlzLnlsO3ZhciB5cj10aGlzLnlyO3ZhciBrbD10aGlzLmtsO3ZhciBrcj10aGlzLmtyO3ZhciBuPXlsLmxlbmd0aDt2YXIgaSxkeCxkeTt2YXIgemw9a2wsenI9a3IscGw9QXJyYXkobikscHI9QXJyYXkobik7dmFyIGFkZD1udW1lcmljLmFkZCxtdWw9bnVtZXJpYy5tdWwsZGl2PW51bWVyaWMuZGl2LHN1Yj1udW1lcmljLnN1Yjtmb3IoaT1uLTE7aSE9PS0xOy0taSl7ZHg9eFtpKzFdLXhbaV07ZHk9c3ViKHlyW2krMV0seWxbaV0pO3BsW2ldPWRpdihhZGQobXVsKGR5LDYpLG11bChrbFtpXSwtNCpkeCksbXVsKGtyW2krMV0sLTIqZHgpKSxkeCpkeCk7cHJbaSsxXT1kaXYoYWRkKG11bChkeSwtNiksbXVsKGtsW2ldLDIqZHgpLG11bChrcltpKzFdLDQqZHgpKSxkeCpkeCl9cmV0dXJuIG5ldyBudW1lcmljLlNwbGluZSh4LHpsLHpyLHBsLHByKX07Cm51bWVyaWMuU3BsaW5lLnByb3RvdHlwZS5yb290cz1mdW5jdGlvbiByb290cygpe2Z1bmN0aW9uIHNxcih4KXtyZXR1cm4geCp4fWZ1bmN0aW9uIGhldmFsKHkwLHkxLGswLGsxLHgpe3ZhciBBPWswKjItKHkxLXkwKTt2YXIgQj0tazEqMisoeTEteTApO3ZhciB0PSh4KzEpKi41O3ZhciBzPXQqKDEtdCk7cmV0dXJuKDEtdCkqeTArdCp5MStBKnMqKDEtdCkrQipzKnR9dmFyIHJldD1bXTt2YXIgeD10aGlzLngseWw9dGhpcy55bCx5cj10aGlzLnlyLGtsPXRoaXMua2wsa3I9dGhpcy5rcjtpZih0eXBlb2YgeWxbMF09PT0ibnVtYmVyIil7eWw9W3lsXTt5cj1beXJdO2tsPVtrbF07a3I9W2tyXX12YXIgbT15bC5sZW5ndGgsbj14Lmxlbmd0aC0xLGksaixrLHkscyx0O3ZhciBhaSxiaSxjaSxkaSxyZXQ9QXJyYXkobSkscmksazAsazEseTAseTEsQSxCLEQsZHgsY3gsc3RvcHMsejAsejEsem0sdDAsdDEsdG07dmFyIHNxcnQ9TWF0aC5zcXJ0O2ZvcihpPTA7aSE9PW07KytpKXthaT15bFtpXTsKYmk9eXJbaV07Y2k9a2xbaV07ZGk9a3JbaV07cmk9W107Zm9yKGo9MDtqIT09bjtqKyspe2lmKGo+MCYmYmlbal0qYWlbal08MClyaS5wdXNoKHhbal0pO2R4PXhbaisxXS14W2pdO2N4PXhbal07eTA9YWlbal07eTE9YmlbaisxXTtrMD1jaVtqXS9keDtrMT1kaVtqKzFdL2R4O0Q9c3FyKGswLWsxKzMqKHkwLXkxKSkrMTIqazEqeTA7QT1rMSszKnkwKzIqazAtMyp5MTtCPTMqKGsxK2swKzIqKHkwLXkxKSk7aWYoRDw9MCl7ejA9QS9CO2lmKHowPnhbal0mJnowPHhbaisxXSlzdG9wcz1beFtqXSx6MCx4W2orMV1dO2Vsc2Ugc3RvcHM9W3hbal0seFtqKzFdXX1lbHNle3owPShBLXNxcnQoRCkpL0I7ejE9KEErc3FydChEKSkvQjtzdG9wcz1beFtqXV07aWYoejA+eFtqXSYmejA8eFtqKzFdKXN0b3BzLnB1c2goejApO2lmKHoxPnhbal0mJnoxPHhbaisxXSlzdG9wcy5wdXNoKHoxKTtzdG9wcy5wdXNoKHhbaisxXSl9dDA9c3RvcHNbMF07ejA9dGhpcy5fYXQodDAsaik7Zm9yKGs9MDtrPApzdG9wcy5sZW5ndGgtMTtrKyspe3QxPXN0b3BzW2srMV07ejE9dGhpcy5fYXQodDEsaik7aWYoejA9PT0wKXtyaS5wdXNoKHQwKTt0MD10MTt6MD16MTtjb250aW51ZX1pZih6MT09PTB8fHowKnoxPjApe3QwPXQxO3owPXoxO2NvbnRpbnVlfXZhciBzaWRlPTA7d2hpbGUoMSl7dG09KHowKnQxLXoxKnQwKS8oejAtejEpO2lmKHRtPD10MHx8dG0+PXQxKWJyZWFrO3ptPXRoaXMuX2F0KHRtLGopO2lmKHptKnoxPjApe3QxPXRtO3oxPXptO2lmKHNpZGU9PT0tMSl6MCo9LjU7c2lkZT0tMX1lbHNlIGlmKHptKnowPjApe3QwPXRtO3owPXptO2lmKHNpZGU9PT0xKXoxKj0uNTtzaWRlPTF9ZWxzZSBicmVha31yaS5wdXNoKHRtKTt0MD1zdG9wc1trKzFdO3owPXRoaXMuX2F0KHQwLGopfWlmKHoxPT09MClyaS5wdXNoKHQxKX1yZXRbaV09cml9aWYodHlwZW9mIHRoaXMueWxbMF09PT0ibnVtYmVyIilyZXR1cm4gcmV0WzBdO3JldHVybiByZXR9OwpudW1lcmljLnNwbGluZT1mdW5jdGlvbiBzcGxpbmUoeCx5LGsxLGtuKXt2YXIgbj14Lmxlbmd0aCxiPVtdLGR4PVtdLGR5PVtdO3ZhciBpO3ZhciBzdWI9bnVtZXJpYy5zdWIsbXVsPW51bWVyaWMubXVsLGFkZD1udW1lcmljLmFkZDtmb3IoaT1uLTI7aT49MDtpLS0pe2R4W2ldPXhbaSsxXS14W2ldO2R5W2ldPXN1Yih5W2krMV0seVtpXSl9aWYodHlwZW9mIGsxPT09InN0cmluZyJ8fHR5cGVvZiBrbj09PSJzdHJpbmciKWsxPWtuPSJwZXJpb2RpYyI7dmFyIFQ9W1tdLFtdLFtdXTtzd2l0Y2godHlwZW9mIGsxKXtjYXNlICJ1bmRlZmluZWQiOmJbMF09bXVsKDMvKGR4WzBdKmR4WzBdKSxkeVswXSk7VFswXS5wdXNoKDAsMCk7VFsxXS5wdXNoKDAsMSk7VFsyXS5wdXNoKDIvZHhbMF0sMS9keFswXSk7YnJlYWs7Y2FzZSAic3RyaW5nIjpiWzBdPWFkZChtdWwoMy8oZHhbbi0yXSpkeFtuLTJdKSxkeVtuLTJdKSxtdWwoMy8oZHhbMF0qZHhbMF0pLGR5WzBdKSk7VFswXS5wdXNoKDAsMCwKMCk7VFsxXS5wdXNoKG4tMiwwLDEpO1RbMl0ucHVzaCgxL2R4W24tMl0sMi9keFtuLTJdKzIvZHhbMF0sMS9keFswXSk7YnJlYWs7ZGVmYXVsdDpiWzBdPWsxO1RbMF0ucHVzaCgwKTtUWzFdLnB1c2goMCk7VFsyXS5wdXNoKDEpO2JyZWFrfWZvcihpPTE7aTxuLTE7aSsrKXtiW2ldPWFkZChtdWwoMy8oZHhbaS0xXSpkeFtpLTFdKSxkeVtpLTFdKSxtdWwoMy8oZHhbaV0qZHhbaV0pLGR5W2ldKSk7VFswXS5wdXNoKGksaSxpKTtUWzFdLnB1c2goaS0xLGksaSsxKTtUWzJdLnB1c2goMS9keFtpLTFdLDIvZHhbaS0xXSsyL2R4W2ldLDEvZHhbaV0pfXN3aXRjaCh0eXBlb2Yga24pe2Nhc2UgInVuZGVmaW5lZCI6YltuLTFdPW11bCgzLyhkeFtuLTJdKmR4W24tMl0pLGR5W24tMl0pO1RbMF0ucHVzaChuLTEsbi0xKTtUWzFdLnB1c2gobi0yLG4tMSk7VFsyXS5wdXNoKDEvZHhbbi0yXSwyL2R4W24tMl0pO2JyZWFrO2Nhc2UgInN0cmluZyI6VFsxXVtUWzFdLmxlbmd0aC0xXT0wO2JyZWFrOwpkZWZhdWx0OmJbbi0xXT1rbjtUWzBdLnB1c2gobi0xKTtUWzFdLnB1c2gobi0xKTtUWzJdLnB1c2goMSk7YnJlYWt9aWYodHlwZW9mIGJbMF0hPT0ibnVtYmVyIiliPW51bWVyaWMudHJhbnNwb3NlKGIpO2Vsc2UgYj1bYl07dmFyIGs9QXJyYXkoYi5sZW5ndGgpO2lmKHR5cGVvZiBrMT09PSJzdHJpbmciKWZvcihpPWsubGVuZ3RoLTE7aSE9PS0xOy0taSl7a1tpXT1udW1lcmljLmNjc0xVUFNvbHZlKG51bWVyaWMuY2NzTFVQKG51bWVyaWMuY2NzU2NhdHRlcihUKSksYltpXSk7a1tpXVtuLTFdPWtbaV1bMF19ZWxzZSBmb3IoaT1rLmxlbmd0aC0xO2khPT0tMTstLWkpa1tpXT1udW1lcmljLmNMVXNvbHZlKG51bWVyaWMuY0xVKFQpLGJbaV0pO2lmKHR5cGVvZiB5WzBdPT09Im51bWJlciIpaz1rWzBdO2Vsc2Ugaz1udW1lcmljLnRyYW5zcG9zZShrKTtyZXR1cm4gbmV3IG51bWVyaWMuU3BsaW5lKHgseSx5LGssayl9OwpudW1lcmljLmZmdHBvdzI9ZnVuY3Rpb24gZmZ0cG93Mih4LHkpe3ZhciBuPXgubGVuZ3RoO2lmKG49PT0xKXJldHVybjt2YXIgY29zPU1hdGguY29zLHNpbj1NYXRoLnNpbixpLGo7dmFyIHhlPUFycmF5KG4vMikseWU9QXJyYXkobi8yKSx4bz1BcnJheShuLzIpLHlvPUFycmF5KG4vMik7aj1uLzI7Zm9yKGk9bi0xO2khPT0tMTstLWkpey0tajt4b1tqXT14W2ldO3lvW2pdPXlbaV07LS1pO3hlW2pdPXhbaV07eWVbal09eVtpXX1mZnRwb3cyKHhlLHllKTtmZnRwb3cyKHhvLHlvKTtqPW4vMjt2YXIgdCxrPS02LjI4MzE4NTMwNzE3OTU4Ni9uLGNpLHNpO2ZvcihpPW4tMTtpIT09LTE7LS1pKXstLWo7aWYoaj09PS0xKWo9bi8yLTE7dD1rKmk7Y2k9Y29zKHQpO3NpPXNpbih0KTt4W2ldPXhlW2pdK2NpKnhvW2pdLXNpKnlvW2pdO3lbaV09eWVbal0rY2kqeW9bal0rc2kqeG9bal19fTsKbnVtZXJpYy5faWZmdHBvdzI9ZnVuY3Rpb24gX2lmZnRwb3cyKHgseSl7dmFyIG49eC5sZW5ndGg7aWYobj09PTEpcmV0dXJuO3ZhciBjb3M9TWF0aC5jb3Msc2luPU1hdGguc2luLGksajt2YXIgeGU9QXJyYXkobi8yKSx5ZT1BcnJheShuLzIpLHhvPUFycmF5KG4vMikseW89QXJyYXkobi8yKTtqPW4vMjtmb3IoaT1uLTE7aSE9PS0xOy0taSl7LS1qO3hvW2pdPXhbaV07eW9bal09eVtpXTstLWk7eGVbal09eFtpXTt5ZVtqXT15W2ldfV9pZmZ0cG93Mih4ZSx5ZSk7X2lmZnRwb3cyKHhvLHlvKTtqPW4vMjt2YXIgdCxrPTYuMjgzMTg1MzA3MTc5NTg2L24sY2ksc2k7Zm9yKGk9bi0xO2khPT0tMTstLWkpey0tajtpZihqPT09LTEpaj1uLzItMTt0PWsqaTtjaT1jb3ModCk7c2k9c2luKHQpO3hbaV09eGVbal0rY2kqeG9bal0tc2kqeW9bal07eVtpXT15ZVtqXStjaSp5b1tqXStzaSp4b1tqXX19OwpudW1lcmljLmlmZnRwb3cyPWZ1bmN0aW9uIGlmZnRwb3cyKHgseSl7bnVtZXJpYy5faWZmdHBvdzIoeCx5KTtudW1lcmljLmRpdmVxKHgseC5sZW5ndGgpO251bWVyaWMuZGl2ZXEoeSx5Lmxlbmd0aCl9O251bWVyaWMuY29udnBvdzI9ZnVuY3Rpb24gY29udnBvdzIoYXgsYXksYngsYnkpe251bWVyaWMuZmZ0cG93MihheCxheSk7bnVtZXJpYy5mZnRwb3cyKGJ4LGJ5KTt2YXIgaSxuPWF4Lmxlbmd0aCxheGksYnhpLGF5aSxieWk7Zm9yKGk9bi0xO2khPT0tMTstLWkpe2F4aT1heFtpXTtheWk9YXlbaV07YnhpPWJ4W2ldO2J5aT1ieVtpXTtheFtpXT1heGkqYnhpLWF5aSpieWk7YXlbaV09YXhpKmJ5aStheWkqYnhpfW51bWVyaWMuaWZmdHBvdzIoYXgsYXkpfTsKbnVtZXJpYy5ULnByb3RvdHlwZS5mZnQ9ZnVuY3Rpb24gZmZ0KCl7dmFyIHg9dGhpcy54LHk9dGhpcy55O3ZhciBuPXgubGVuZ3RoLGxvZz1NYXRoLmxvZyxsb2cyPWxvZygyKSxwPU1hdGguY2VpbChsb2coMipuLTEpL2xvZzIpLG09TWF0aC5wb3coMixwKTt2YXIgY3g9bnVtZXJpYy5yZXAoW21dLDApLGN5PW51bWVyaWMucmVwKFttXSwwKSxjb3M9TWF0aC5jb3Msc2luPU1hdGguc2luO3ZhciBrLGM9LTMuMTQxNTkyNjUzNTg5NzkzL24sdDt2YXIgYT1udW1lcmljLnJlcChbbV0sMCksYj1udW1lcmljLnJlcChbbV0sMCksbmhhbGY9TWF0aC5mbG9vcihuLzIpO2ZvcihrPTA7azxuO2srKylhW2tdPXhba107aWYodHlwZW9mIHkhPT0idW5kZWZpbmVkIilmb3Ioaz0wO2s8bjtrKyspYltrXT15W2tdO2N4WzBdPTE7Zm9yKGs9MTtrPD1tLzI7aysrKXt0PWMqayprO2N4W2tdPWNvcyh0KTtjeVtrXT1zaW4odCk7Y3hbbS1rXT1jb3ModCk7Y3lbbS1rXT1zaW4odCl9dmFyIFg9bmV3IG51bWVyaWMuVChhLApiKSxZPW5ldyBudW1lcmljLlQoY3gsY3kpO1g9WC5tdWwoWSk7bnVtZXJpYy5jb252cG93MihYLngsWC55LG51bWVyaWMuY2xvbmUoWS54KSxudW1lcmljLm5lZyhZLnkpKTtYPVgubXVsKFkpO1gueC5sZW5ndGg9bjtYLnkubGVuZ3RoPW47cmV0dXJuIFh9OwpudW1lcmljLlQucHJvdG90eXBlLmlmZnQ9ZnVuY3Rpb24gaWZmdCgpe3ZhciB4PXRoaXMueCx5PXRoaXMueTt2YXIgbj14Lmxlbmd0aCxsb2c9TWF0aC5sb2csbG9nMj1sb2coMikscD1NYXRoLmNlaWwobG9nKDIqbi0xKS9sb2cyKSxtPU1hdGgucG93KDIscCk7dmFyIGN4PW51bWVyaWMucmVwKFttXSwwKSxjeT1udW1lcmljLnJlcChbbV0sMCksY29zPU1hdGguY29zLHNpbj1NYXRoLnNpbjt2YXIgayxjPTMuMTQxNTkyNjUzNTg5NzkzL24sdDt2YXIgYT1udW1lcmljLnJlcChbbV0sMCksYj1udW1lcmljLnJlcChbbV0sMCksbmhhbGY9TWF0aC5mbG9vcihuLzIpO2ZvcihrPTA7azxuO2srKylhW2tdPXhba107aWYodHlwZW9mIHkhPT0idW5kZWZpbmVkIilmb3Ioaz0wO2s8bjtrKyspYltrXT15W2tdO2N4WzBdPTE7Zm9yKGs9MTtrPD1tLzI7aysrKXt0PWMqayprO2N4W2tdPWNvcyh0KTtjeVtrXT1zaW4odCk7Y3hbbS1rXT1jb3ModCk7Y3lbbS1rXT1zaW4odCl9dmFyIFg9bmV3IG51bWVyaWMuVChhLApiKSxZPW5ldyBudW1lcmljLlQoY3gsY3kpO1g9WC5tdWwoWSk7bnVtZXJpYy5jb252cG93MihYLngsWC55LG51bWVyaWMuY2xvbmUoWS54KSxudW1lcmljLm5lZyhZLnkpKTtYPVgubXVsKFkpO1gueC5sZW5ndGg9bjtYLnkubGVuZ3RoPW47cmV0dXJuIFguZGl2KG4pfTsKbnVtZXJpYy5ncmFkaWVudD1mdW5jdGlvbiBncmFkaWVudChmLHgpe3ZhciBuPXgubGVuZ3RoO3ZhciBmMD1mKHgpO2lmKGlzTmFOKGYwKSl0aHJvdyBuZXcgRXJyb3IoImdyYWRpZW50OiBmKHgpIGlzIGEgTmFOISIpO3ZhciBtYXg9TWF0aC5tYXg7dmFyIGkseDA9bnVtZXJpYy5jbG9uZSh4KSxmMSxmMixKPUFycmF5KG4pO3ZhciBkaXY9bnVtZXJpYy5kaXYsc3ViPW51bWVyaWMuc3ViLGVycmVzdCxyb3VuZG9mZixtYXg9TWF0aC5tYXgsZXBzPS4wMDEsYWJzPU1hdGguYWJzLG1pbj1NYXRoLm1pbjt2YXIgdDAsdDEsdDIsaXQ9MCxkMSxkMixOO2ZvcihpPTA7aTxuO2krKyl7dmFyIGg9bWF4KDFFLTYqZjAsMUUtOCk7d2hpbGUoMSl7KytpdDtpZihpdD4yMCl0aHJvdyBuZXcgRXJyb3IoIk51bWVyaWNhbCBncmFkaWVudCBmYWlscyIpO3gwW2ldPXhbaV0raDtmMT1mKHgwKTt4MFtpXT14W2ldLWg7ZjI9Zih4MCk7eDBbaV09eFtpXTtpZihpc05hTihmMSl8fGlzTmFOKGYyKSl7aC89CjE2O2NvbnRpbnVlfUpbaV09KGYxLWYyKS8oMipoKTt0MD14W2ldLWg7dDE9eFtpXTt0Mj14W2ldK2g7ZDE9KGYxLWYwKS9oO2QyPShmMC1mMikvaDtOPW1heChhYnMoSltpXSksYWJzKGYwKSxhYnMoZjEpLGFicyhmMiksYWJzKHQwKSxhYnModDEpLGFicyh0MiksMUUtOCk7ZXJyZXN0PW1pbihtYXgoYWJzKGQxLUpbaV0pLGFicyhkMi1KW2ldKSxhYnMoZDEtZDIpKS9OLGgvTik7aWYoZXJyZXN0PmVwcyloLz0xNjtlbHNlIGJyZWFrfX1yZXR1cm4gSn07Cm51bWVyaWMudW5jbWluPWZ1bmN0aW9uIHVuY21pbihmLHgwLHRvbCxncmFkaWVudCxtYXhpdCxjYWxsYmFjayxvcHRpb25zKXt2YXIgZ3JhZD1udW1lcmljLmdyYWRpZW50O2lmKHR5cGVvZiBvcHRpb25zPT09InVuZGVmaW5lZCIpb3B0aW9ucz17fTtpZih0eXBlb2YgdG9sPT09InVuZGVmaW5lZCIpdG9sPTFFLTg7aWYodHlwZW9mIGdyYWRpZW50PT09InVuZGVmaW5lZCIpZ3JhZGllbnQ9ZnVuY3Rpb24oeCl7cmV0dXJuIGdyYWQoZix4KX07aWYodHlwZW9mIG1heGl0PT09InVuZGVmaW5lZCIpbWF4aXQ9MUUzO3gwPW51bWVyaWMuY2xvbmUoeDApO3ZhciBuPXgwLmxlbmd0aDt2YXIgZjA9Zih4MCksZjEsZGYwO2lmKGlzTmFOKGYwKSl0aHJvdyBuZXcgRXJyb3IoInVuY21pbjogZih4MCkgaXMgYSBOYU4hIik7dmFyIG1heD1NYXRoLm1heCxub3JtMj1udW1lcmljLm5vcm0yO3RvbD1tYXgodG9sLG51bWVyaWMuZXBzaWxvbik7dmFyIHN0ZXAsZzAsZzEsSDE9b3B0aW9ucy5IaW52fHwKbnVtZXJpYy5pZGVudGl0eShuKTt2YXIgZG90PW51bWVyaWMuZG90LGludj1udW1lcmljLmludixzdWI9bnVtZXJpYy5zdWIsYWRkPW51bWVyaWMuYWRkLHRlbj1udW1lcmljLnRlbnNvcixkaXY9bnVtZXJpYy5kaXYsbXVsPW51bWVyaWMubXVsO3ZhciBhbGw9bnVtZXJpYy5hbGwsaXNmaW5pdGU9bnVtZXJpYy5pc0Zpbml0ZSxuZWc9bnVtZXJpYy5uZWc7dmFyIGl0PTAsaSxzLHgxLHksSHksSHMseXMsaTAsdCxuc3RlcCx0MSx0Mjt2YXIgbXNnPSIiO2cwPWdyYWRpZW50KHgwKTt3aGlsZShpdDxtYXhpdCl7aWYodHlwZW9mIGNhbGxiYWNrPT09ImZ1bmN0aW9uIilpZihjYWxsYmFjayhpdCx4MCxmMCxnMCxIMSkpe21zZz0iQ2FsbGJhY2sgcmV0dXJuZWQgdHJ1ZSI7YnJlYWt9aWYoIWFsbChpc2Zpbml0ZShnMCkpKXttc2c9IkdyYWRpZW50IGhhcyBJbmZpbml0eSBvciBOYU4iO2JyZWFrfXN0ZXA9bmVnKGRvdChIMSxnMCkpO2lmKCFhbGwoaXNmaW5pdGUoc3RlcCkpKXttc2c9IlNlYXJjaCBkaXJlY3Rpb24gaGFzIEluZmluaXR5IG9yIE5hTiI7CmJyZWFrfW5zdGVwPW5vcm0yKHN0ZXApO2lmKG5zdGVwPHRvbCl7bXNnPSJOZXd0b24gc3RlcCBzbWFsbGVyIHRoYW4gdG9sIjticmVha310PTE7ZGYwPWRvdChnMCxzdGVwKTt4MT14MDt3aGlsZShpdDxtYXhpdCl7aWYodCpuc3RlcDx0b2wpYnJlYWs7cz1tdWwoc3RlcCx0KTt4MT1hZGQoeDAscyk7ZjE9Zih4MSk7aWYoZjEtZjA+PS4xKnQqZGYwfHxpc05hTihmMSkpe3QqPS41OysraXQ7Y29udGludWV9YnJlYWt9aWYodCpuc3RlcDx0b2wpe21zZz0iTGluZSBzZWFyY2ggc3RlcCBzaXplIHNtYWxsZXIgdGhhbiB0b2wiO2JyZWFrfWlmKGl0PT09bWF4aXQpe21zZz0ibWF4aXQgcmVhY2hlZCBkdXJpbmcgbGluZSBzZWFyY2giO2JyZWFrfWcxPWdyYWRpZW50KHgxKTt5PXN1YihnMSxnMCk7eXM9ZG90KHkscyk7SHk9ZG90KEgxLHkpO0gxPXN1YihhZGQoSDEsbXVsKCh5cytkb3QoeSxIeSkpLyh5cyp5cyksdGVuKHMscykpKSxkaXYoYWRkKHRlbihIeSxzKSx0ZW4ocyxIeSkpLHlzKSk7CngwPXgxO2YwPWYxO2cwPWcxOysraXR9cmV0dXJue3NvbHV0aW9uOngwLGY6ZjAsZ3JhZGllbnQ6ZzAsaW52SGVzc2lhbjpIMSxpdGVyYXRpb25zOml0LG1lc3NhZ2U6bXNnfX07bnVtZXJpYy5Eb3ByaT1mdW5jdGlvbiBEb3ByaSh4LHksZix5bWlkLGl0ZXJhdGlvbnMsbXNnLGV2ZW50cyl7dGhpcy54PXg7dGhpcy55PXk7dGhpcy5mPWY7dGhpcy55bWlkPXltaWQ7dGhpcy5pdGVyYXRpb25zPWl0ZXJhdGlvbnM7dGhpcy5ldmVudHM9ZXZlbnRzO3RoaXMubWVzc2FnZT1tc2d9OwpudW1lcmljLkRvcHJpLnByb3RvdHlwZS5fYXQ9ZnVuY3Rpb24gX2F0KHhpLGope2Z1bmN0aW9uIHNxcih4KXtyZXR1cm4geCp4fXZhciBzb2w9dGhpczt2YXIgeHM9c29sLng7dmFyIHlzPXNvbC55O3ZhciBrMT1zb2wuZjt2YXIgeW1pZD1zb2wueW1pZDt2YXIgbj14cy5sZW5ndGg7dmFyIHgwLHgxLHhoLHkwLHkxLHloLHhpO3ZhciBmbG9vcj1NYXRoLmZsb29yLGg7dmFyIGM9LjU7dmFyIGFkZD1udW1lcmljLmFkZCxtdWw9bnVtZXJpYy5tdWwsc3ViPW51bWVyaWMuc3ViLHAscSx3O3gwPXhzW2pdO3gxPXhzW2orMV07eTA9eXNbal07eTE9eXNbaisxXTtoPXgxLXgwO3hoPXgwK2MqaDt5aD15bWlkW2pdO3A9c3ViKGsxW2pdLG11bCh5MCwxLyh4MC14aCkrMi8oeDAteDEpKSk7cT1zdWIoazFbaisxXSxtdWwoeTEsMS8oeDEteGgpKzIvKHgxLXgwKSkpO3c9W3Nxcih4aS14MSkqKHhpLXhoKS9zcXIoeDAteDEpLyh4MC14aCksc3FyKHhpLXgwKSpzcXIoeGkteDEpL3Nxcih4MC14aCkvCnNxcih4MS14aCksc3FyKHhpLXgwKSooeGkteGgpL3Nxcih4MS14MCkvKHgxLXhoKSwoeGkteDApKnNxcih4aS14MSkqKHhpLXhoKS9zcXIoeDAteDEpLyh4MC14aCksKHhpLXgxKSpzcXIoeGkteDApKih4aS14aCkvc3FyKHgwLXgxKS8oeDEteGgpXTtyZXR1cm4gYWRkKGFkZChhZGQoYWRkKG11bCh5MCx3WzBdKSxtdWwoeWgsd1sxXSkpLG11bCh5MSx3WzJdKSksbXVsKHAsd1szXSkpLG11bChxLHdbNF0pKX07Cm51bWVyaWMuRG9wcmkucHJvdG90eXBlLmF0PWZ1bmN0aW9uIGF0KHgpe3ZhciBpLGosayxmbG9vcj1NYXRoLmZsb29yO2lmKHR5cGVvZiB4IT09Im51bWJlciIpe3ZhciBuPXgubGVuZ3RoLHJldD1BcnJheShuKTtmb3IoaT1uLTE7aSE9PS0xOy0taSlyZXRbaV09dGhpcy5hdCh4W2ldKTtyZXR1cm4gcmV0fXZhciB4MD10aGlzLng7aT0wO2o9eDAubGVuZ3RoLTE7d2hpbGUoai1pPjEpe2s9Zmxvb3IoLjUqKGkraikpO2lmKHgwW2tdPD14KWk9aztlbHNlIGo9a31yZXR1cm4gdGhpcy5fYXQoeCxpKX07Cm51bWVyaWMuZG9wcmk9ZnVuY3Rpb24gZG9wcmkoeDAseDEseTAsZix0b2wsbWF4aXQsZXZlbnQpe2lmKHR5cGVvZiB0b2w9PT0idW5kZWZpbmVkIil0b2w9MUUtNjtpZih0eXBlb2YgbWF4aXQ9PT0idW5kZWZpbmVkIiltYXhpdD0xRTM7dmFyIHhzPVt4MF0seXM9W3kwXSxrMT1bZih4MCx5MCldLGsyLGszLGs0LGs1LGs2LGs3LHltaWQ9W107dmFyIEEyPTEvNTt2YXIgQTM9WzMvNDAsOS80MF07dmFyIEE0PVs0NC80NSwtNTYvMTUsMzIvOV07dmFyIEE1PVsxOTM3Mi82NTYxLC0yNTM2MC8yMTg3LDY0NDQ4LzY1NjEsLTIxMi83MjldO3ZhciBBNj1bOTAxNy8zMTY4LC0zNTUvMzMsNDY3MzIvNTI0Nyw0OS8xNzYsLTUxMDMvMTg2NTZdO3ZhciBiPVszNS8zODQsMCw1MDAvMTExMywxMjUvMTkyLC0yMTg3LzY3ODQsMTEvODRdO3ZhciBibT1bLjUqNjAyNTE5Mjc0My8zMDA4NTU1MzE1MiwwLC41KjUxMjUyMjkyOTI1LzY1NDAwODIxNTk4LC41Ki0yNjkxODY4OTI1LzQ1MTI4MzI5NzI4LAouNSoxODc5NDAzNzIwNjcvMTU5NDUzNDMxNzA1NiwuNSotMTc3NjA5NDMzMS8xOTc0MzY0NDI1NiwuNSoxMTIzNzA5OS8yMzUwNDMzODRdO3ZhciBjPVsxLzUsMy8xMCw0LzUsOC85LDEsMV07dmFyIGU9Wy03MS81NzYwMCwwLDcxLzE2Njk1LC03MS8xOTIwLDE3MjUzLzMzOTIwMCwtMjIvNTI1LDEvNDBdO3ZhciBpPTAsZXIsajt2YXIgaD0oeDEteDApLzEwO3ZhciBpdD0wO3ZhciBhZGQ9bnVtZXJpYy5hZGQsbXVsPW51bWVyaWMubXVsLHkxLGVyaW5mO3ZhciBtYXg9TWF0aC5tYXgsbWluPU1hdGgubWluLGFicz1NYXRoLmFicyxub3JtaW5mPW51bWVyaWMubm9ybWluZixwb3c9TWF0aC5wb3c7dmFyIGFueT1udW1lcmljLmFueSxsdD1udW1lcmljLmx0LGFuZD1udW1lcmljLmFuZCxzdWI9bnVtZXJpYy5zdWI7dmFyIGUwLGUxLGV2O3ZhciByZXQ9bmV3IG51bWVyaWMuRG9wcmkoeHMseXMsazEseW1pZCwtMSwiIik7aWYodHlwZW9mIGV2ZW50PT09ImZ1bmN0aW9uIillMD1ldmVudCh4MCwKeTApO3doaWxlKHgwPHgxJiZpdDxtYXhpdCl7KytpdDtpZih4MCtoPngxKWg9eDEteDA7azI9Zih4MCtjWzBdKmgsYWRkKHkwLG11bChBMipoLGsxW2ldKSkpO2szPWYoeDArY1sxXSpoLGFkZChhZGQoeTAsbXVsKEEzWzBdKmgsazFbaV0pKSxtdWwoQTNbMV0qaCxrMikpKTtrND1mKHgwK2NbMl0qaCxhZGQoYWRkKGFkZCh5MCxtdWwoQTRbMF0qaCxrMVtpXSkpLG11bChBNFsxXSpoLGsyKSksbXVsKEE0WzJdKmgsazMpKSk7azU9Zih4MCtjWzNdKmgsYWRkKGFkZChhZGQoYWRkKHkwLG11bChBNVswXSpoLGsxW2ldKSksbXVsKEE1WzFdKmgsazIpKSxtdWwoQTVbMl0qaCxrMykpLG11bChBNVszXSpoLGs0KSkpO2s2PWYoeDArY1s0XSpoLGFkZChhZGQoYWRkKGFkZChhZGQoeTAsbXVsKEE2WzBdKmgsazFbaV0pKSxtdWwoQTZbMV0qaCxrMikpLG11bChBNlsyXSpoLGszKSksbXVsKEE2WzNdKmgsazQpKSxtdWwoQTZbNF0qaCxrNSkpKTt5MT1hZGQoYWRkKGFkZChhZGQoYWRkKHkwLG11bChrMVtpXSwKaCpiWzBdKSksbXVsKGszLGgqYlsyXSkpLG11bChrNCxoKmJbM10pKSxtdWwoazUsaCpiWzRdKSksbXVsKGs2LGgqYls1XSkpO2s3PWYoeDAraCx5MSk7ZXI9YWRkKGFkZChhZGQoYWRkKGFkZChtdWwoazFbaV0saCplWzBdKSxtdWwoazMsaCplWzJdKSksbXVsKGs0LGgqZVszXSkpLG11bChrNSxoKmVbNF0pKSxtdWwoazYsaCplWzVdKSksbXVsKGs3LGgqZVs2XSkpO2lmKHR5cGVvZiBlcj09PSJudW1iZXIiKWVyaW5mPWFicyhlcik7ZWxzZSBlcmluZj1ub3JtaW5mKGVyKTtpZihlcmluZj50b2wpe2g9LjIqaCpwb3codG9sL2VyaW5mLC4yNSk7aWYoeDAraD09PXgwKXtyZXQubXNnPSJTdGVwIHNpemUgYmVjYW1lIHRvbyBzbWFsbCI7YnJlYWt9Y29udGludWV9eW1pZFtpXT1hZGQoYWRkKGFkZChhZGQoYWRkKGFkZCh5MCxtdWwoazFbaV0saCpibVswXSkpLG11bChrMyxoKmJtWzJdKSksbXVsKGs0LGgqYm1bM10pKSxtdWwoazUsaCpibVs0XSkpLG11bChrNixoKmJtWzVdKSksbXVsKGs3LApoKmJtWzZdKSk7KytpO3hzW2ldPXgwK2g7eXNbaV09eTE7azFbaV09azc7aWYodHlwZW9mIGV2ZW50PT09ImZ1bmN0aW9uIil7dmFyIHlpLHhsPXgwLHhyPXgwKy41KmgseGk7ZTE9ZXZlbnQoeHIseW1pZFtpLTFdKTtldj1hbmQobHQoZTAsMCksbHQoMCxlMSkpO2lmKCFhbnkoZXYpKXt4bD14cjt4cj14MCtoO2UwPWUxO2UxPWV2ZW50KHhyLHkxKTtldj1hbmQobHQoZTAsMCksbHQoMCxlMSkpfWlmKGFueShldikpe3ZhciB4Yyx5YyxlbixlaTt2YXIgc2lkZT0wLHNsPTEsc3I9MTt3aGlsZSgxKXtpZih0eXBlb2YgZTA9PT0ibnVtYmVyIil4aT0oc3IqZTEqeGwtc2wqZTAqeHIpLyhzciplMS1zbCplMCk7ZWxzZXt4aT14cjtmb3Ioaj1lMC5sZW5ndGgtMTtqIT09LTE7LS1qKWlmKGUwW2pdPDAmJmUxW2pdPjApeGk9bWluKHhpLChzciplMVtqXSp4bC1zbCplMFtqXSp4cikvKHNyKmUxW2pdLXNsKmUwW2pdKSl9aWYoeGk8PXhsfHx4aT49eHIpYnJlYWs7eWk9cmV0Ll9hdCh4aSxpLTEpOwplaT1ldmVudCh4aSx5aSk7ZW49YW5kKGx0KGUwLDApLGx0KDAsZWkpKTtpZihhbnkoZW4pKXt4cj14aTtlMT1laTtldj1lbjtzcj0xO2lmKHNpZGU9PT0tMSlzbCo9LjU7ZWxzZSBzbD0xO3NpZGU9LTF9ZWxzZXt4bD14aTtlMD1laTtzbD0xO2lmKHNpZGU9PT0xKXNyKj0uNTtlbHNlIHNyPTE7c2lkZT0xfX15MT1yZXQuX2F0KC41Kih4MCt4aSksaS0xKTtyZXQuZltpXT1mKHhpLHlpKTtyZXQueFtpXT14aTtyZXQueVtpXT15aTtyZXQueW1pZFtpLTFdPXkxO3JldC5ldmVudHM9ZXY7cmV0Lml0ZXJhdGlvbnM9aXQ7cmV0dXJuIHJldH19eDArPWg7eTA9eTE7ZTA9ZTE7aD1taW4oLjgqaCpwb3codG9sL2VyaW5mLC4yNSksNCpoKX1yZXQuaXRlcmF0aW9ucz1pdDtyZXR1cm4gcmV0fTsKbnVtZXJpYy5MVT1mdW5jdGlvbihBLGZhc3Qpe2Zhc3Q9ZmFzdHx8ZmFsc2U7dmFyIGFicz1NYXRoLmFiczt2YXIgaSxqLGssYWJzQWprLEFrayxBayxQayxBaTt2YXIgbWF4O3ZhciBuPUEubGVuZ3RoLG4xPW4tMTt2YXIgUD1uZXcgQXJyYXkobik7aWYoIWZhc3QpQT1udW1lcmljLmNsb25lKEEpO2ZvcihrPTA7azxuOysrayl7UGs9aztBaz1BW2tdO21heD1hYnMoQWtba10pO2ZvcihqPWsrMTtqPG47KytqKXthYnNBams9YWJzKEFbal1ba10pO2lmKG1heDxhYnNBamspe21heD1hYnNBams7UGs9an19UFtrXT1QaztpZihQayE9ayl7QVtrXT1BW1BrXTtBW1BrXT1BaztBaz1BW2tdfUFraz1Ba1trXTtmb3IoaT1rKzE7aTxuOysraSlBW2ldW2tdLz1Ba2s7Zm9yKGk9aysxO2k8bjsrK2kpe0FpPUFbaV07Zm9yKGo9aysxO2o8bjE7KytqKXtBaVtqXS09QWlba10qQWtbal07KytqO0FpW2pdLT1BaVtrXSpBa1tqXX1pZihqPT09bjEpQWlbal0tPUFpW2tdKkFrW2pdfX1yZXR1cm57TFU6QSwKUDpQfX07bnVtZXJpYy5MVXNvbHZlPWZ1bmN0aW9uIExVc29sdmUoTFVQLGIpe3ZhciBpLGo7dmFyIExVPUxVUC5MVTt2YXIgbj1MVS5sZW5ndGg7dmFyIHg9bnVtZXJpYy5jbG9uZShiKTt2YXIgUD1MVVAuUDt2YXIgUGksTFVpLExVaWksdG1wO2ZvcihpPW4tMTtpIT09LTE7LS1pKXhbaV09YltpXTtmb3IoaT0wO2k8bjsrK2kpe1BpPVBbaV07aWYoUFtpXSE9PWkpe3RtcD14W2ldO3hbaV09eFtQaV07eFtQaV09dG1wfUxVaT1MVVtpXTtmb3Ioaj0wO2o8aTsrK2opeFtpXS09eFtqXSpMVWlbal19Zm9yKGk9bi0xO2k+PTA7LS1pKXtMVWk9TFVbaV07Zm9yKGo9aSsxO2o8bjsrK2opeFtpXS09eFtqXSpMVWlbal07eFtpXS89TFVpW2ldfXJldHVybiB4fTtudW1lcmljLnNvbHZlPWZ1bmN0aW9uIHNvbHZlKEEsYixmYXN0KXtyZXR1cm4gbnVtZXJpYy5MVXNvbHZlKG51bWVyaWMuTFUoQSxmYXN0KSxiKX07Cm51bWVyaWMuZWNoZWxvbml6ZT1mdW5jdGlvbiBlY2hlbG9uaXplKEEpe3ZhciBzPW51bWVyaWMuZGltKEEpLG09c1swXSxuPXNbMV07dmFyIEk9bnVtZXJpYy5pZGVudGl0eShtKTt2YXIgUD1BcnJheShtKTt2YXIgaSxqLGssbCxBaSxJaSxaLGE7dmFyIGFicz1NYXRoLmFiczt2YXIgZGl2ZXE9bnVtZXJpYy5kaXZlcTtBPW51bWVyaWMuY2xvbmUoQSk7Zm9yKGk9MDtpPG07KytpKXtrPTA7QWk9QVtpXTtJaT1JW2ldO2ZvcihqPTE7ajxuOysrailpZihhYnMoQWlba10pPGFicyhBaVtqXSkpaz1qO1BbaV09aztkaXZlcShJaSxBaVtrXSk7ZGl2ZXEoQWksQWlba10pO2ZvcihqPTA7ajxtOysrailpZihqIT09aSl7Wj1BW2pdO2E9WltrXTtmb3IobD1uLTE7bCE9PS0xOy0tbClaW2xdLT1BaVtsXSphO1o9SVtqXTtmb3IobD1tLTE7bCE9PS0xOy0tbClaW2xdLT1JaVtsXSphfX1yZXR1cm57STpJLEE6QSxQOlB9fTsKbnVtZXJpYy5fX3NvbHZlTFA9ZnVuY3Rpb24gX19zb2x2ZUxQKGMsQSxiLHRvbCxtYXhpdCx4LGZsYWcpe3ZhciBzdW09bnVtZXJpYy5zdW0sbG9nPW51bWVyaWMubG9nLG11bD1udW1lcmljLm11bCxzdWI9bnVtZXJpYy5zdWIsZG90PW51bWVyaWMuZG90LGRpdj1udW1lcmljLmRpdixhZGQ9bnVtZXJpYy5hZGQ7dmFyIG09Yy5sZW5ndGgsbj1iLmxlbmd0aCx5O3ZhciB1bmJvdW5kZWQ9ZmFsc2UsY2IsaTA9MDt2YXIgYWxwaGE9MTt2YXIgZjAsZGYwLEFUPW51bWVyaWMudHJhbnNwb3NlKEEpLHN2ZD1udW1lcmljLnN2ZCx0cmFuc3Bvc2U9bnVtZXJpYy50cmFuc3Bvc2UsbGVxPW51bWVyaWMubGVxLHNxcnQ9TWF0aC5zcXJ0LGFicz1NYXRoLmFiczt2YXIgbXVsZXE9bnVtZXJpYy5tdWxlcTt2YXIgbm9ybT1udW1lcmljLm5vcm1pbmYsYW55PW51bWVyaWMuYW55LG1pbj1NYXRoLm1pbjt2YXIgYWxsPW51bWVyaWMuYWxsLGd0PW51bWVyaWMuZ3Q7dmFyIHA9QXJyYXkobSksQTA9QXJyYXkobiksCmU9bnVtZXJpYy5yZXAoW25dLDEpLEg7dmFyIHNvbHZlPW51bWVyaWMuc29sdmUsej1zdWIoYixkb3QoQSx4KSksY291bnQ7dmFyIGRvdGNjPWRvdChjLGMpO3ZhciBnO2Zvcihjb3VudD1pMDtjb3VudDxtYXhpdDsrK2NvdW50KXt2YXIgaSxqLGQ7Zm9yKGk9bi0xO2khPT0tMTstLWkpQTBbaV09ZGl2KEFbaV0seltpXSk7dmFyIEExPXRyYW5zcG9zZShBMCk7Zm9yKGk9bS0xO2khPT0tMTstLWkpcFtpXT1zdW0oQTFbaV0pO2FscGhhPS4yNSphYnMoZG90Y2MvZG90KGMscCkpO3ZhciBhMT0xMDAqc3FydChkb3RjYy9kb3QocCxwKSk7aWYoIWlzRmluaXRlKGFscGhhKXx8YWxwaGE+YTEpYWxwaGE9YTE7Zz1hZGQoYyxtdWwoYWxwaGEscCkpO0g9ZG90KEExLEEwKTtmb3IoaT1tLTE7aSE9PS0xOy0taSlIW2ldW2ldKz0xO2Q9c29sdmUoSCxkaXYoZyxhbHBoYSksdHJ1ZSk7dmFyIHQwPWRpdih6LGRvdChBLGQpKTt2YXIgdD0xO2ZvcihpPW4tMTtpIT09LTE7LS1pKWlmKHQwW2ldPDApdD0KbWluKHQsLS45OTkqdDBbaV0pO3k9c3ViKHgsbXVsKGQsdCkpO3o9c3ViKGIsZG90KEEseSkpO2lmKCFhbGwoZ3QoeiwwKSkpcmV0dXJue3NvbHV0aW9uOngsbWVzc2FnZToiIixpdGVyYXRpb25zOmNvdW50fTt4PXk7aWYoYWxwaGE8dG9sKXJldHVybntzb2x1dGlvbjp5LG1lc3NhZ2U6IiIsaXRlcmF0aW9uczpjb3VudH07aWYoZmxhZyl7dmFyIHM9ZG90KGMsZyksQWc9ZG90KEEsZyk7dW5ib3VuZGVkPXRydWU7Zm9yKGk9bi0xO2khPT0tMTstLWkpaWYocypBZ1tpXTwwKXt1bmJvdW5kZWQ9ZmFsc2U7YnJlYWt9fWVsc2UgaWYoeFttLTFdPj0wKXVuYm91bmRlZD1mYWxzZTtlbHNlIHVuYm91bmRlZD10cnVlO2lmKHVuYm91bmRlZClyZXR1cm57c29sdXRpb246eSxtZXNzYWdlOiJVbmJvdW5kZWQiLGl0ZXJhdGlvbnM6Y291bnR9fXJldHVybntzb2x1dGlvbjp4LG1lc3NhZ2U6Im1heGltdW0gaXRlcmF0aW9uIGNvdW50IGV4Y2VlZGVkIixpdGVyYXRpb25zOmNvdW50fX07Cm51bWVyaWMuX3NvbHZlTFA9ZnVuY3Rpb24gX3NvbHZlTFAoYyxBLGIsdG9sLG1heGl0KXt2YXIgbT1jLmxlbmd0aCxuPWIubGVuZ3RoLHk7dmFyIHN1bT1udW1lcmljLnN1bSxsb2c9bnVtZXJpYy5sb2csbXVsPW51bWVyaWMubXVsLHN1Yj1udW1lcmljLnN1Yixkb3Q9bnVtZXJpYy5kb3QsZGl2PW51bWVyaWMuZGl2LGFkZD1udW1lcmljLmFkZDt2YXIgYzA9bnVtZXJpYy5yZXAoW21dLDApLmNvbmNhdChbMV0pO3ZhciBKPW51bWVyaWMucmVwKFtuLDFdLC0xKTt2YXIgQTA9bnVtZXJpYy5ibG9ja01hdHJpeChbW0EsSl1dKTt2YXIgYjA9Yjt2YXIgeT1udW1lcmljLnJlcChbbV0sMCkuY29uY2F0KE1hdGgubWF4KDAsbnVtZXJpYy5zdXAobnVtZXJpYy5uZWcoYikpKSsxKTt2YXIgeDA9bnVtZXJpYy5fX3NvbHZlTFAoYzAsQTAsYjAsdG9sLG1heGl0LHksZmFsc2UpO3ZhciB4PW51bWVyaWMuY2xvbmUoeDAuc29sdXRpb24pO3gubGVuZ3RoPW07dmFyIGZvbz1udW1lcmljLmluZihzdWIoYiwKZG90KEEseCkpKTtpZihmb288MClyZXR1cm57c29sdXRpb246TmFOLG1lc3NhZ2U6IkluZmVhc2libGUiLGl0ZXJhdGlvbnM6eDAuaXRlcmF0aW9uc307dmFyIHJldD1udW1lcmljLl9fc29sdmVMUChjLEEsYix0b2wsbWF4aXQteDAuaXRlcmF0aW9ucyx4LHRydWUpO3JldC5pdGVyYXRpb25zKz14MC5pdGVyYXRpb25zO3JldHVybiByZXR9OwpudW1lcmljLnNvbHZlTFA9ZnVuY3Rpb24gc29sdmVMUChjLEEsYixBZXEsYmVxLHRvbCxtYXhpdCl7aWYodHlwZW9mIG1heGl0PT09InVuZGVmaW5lZCIpbWF4aXQ9MUUzO2lmKHR5cGVvZiB0b2w9PT0idW5kZWZpbmVkIil0b2w9bnVtZXJpYy5lcHNpbG9uO2lmKHR5cGVvZiBBZXE9PT0idW5kZWZpbmVkIilyZXR1cm4gbnVtZXJpYy5fc29sdmVMUChjLEEsYix0b2wsbWF4aXQpO3ZhciBtPUFlcS5sZW5ndGgsbj1BZXFbMF0ubGVuZ3RoLG89QS5sZW5ndGg7dmFyIEI9bnVtZXJpYy5lY2hlbG9uaXplKEFlcSk7dmFyIGZsYWdzPW51bWVyaWMucmVwKFtuXSwwKTt2YXIgUD1CLlA7dmFyIFE9W107dmFyIGk7Zm9yKGk9UC5sZW5ndGgtMTtpIT09LTE7LS1pKWZsYWdzW1BbaV1dPTE7Zm9yKGk9bi0xO2khPT0tMTstLWkpaWYoZmxhZ3NbaV09PT0wKVEucHVzaChpKTt2YXIgZz1udW1lcmljLmdldFJhbmdlO3ZhciBJPW51bWVyaWMubGluc3BhY2UoMCxtLTEpLEo9bnVtZXJpYy5saW5zcGFjZSgwLApvLTEpO3ZhciBBZXEyPWcoQWVxLEksUSksQTE9ZyhBLEosUCksQTI9ZyhBLEosUSksZG90PW51bWVyaWMuZG90LHN1Yj1udW1lcmljLnN1Yjt2YXIgQTM9ZG90KEExLEIuSSk7dmFyIEE0PXN1YihBMixkb3QoQTMsQWVxMikpLGI0PXN1YihiLGRvdChBMyxiZXEpKTt2YXIgYzE9QXJyYXkoUC5sZW5ndGgpLGMyPUFycmF5KFEubGVuZ3RoKTtmb3IoaT1QLmxlbmd0aC0xO2khPT0tMTstLWkpYzFbaV09Y1tQW2ldXTtmb3IoaT1RLmxlbmd0aC0xO2khPT0tMTstLWkpYzJbaV09Y1tRW2ldXTt2YXIgYzQ9c3ViKGMyLGRvdChjMSxkb3QoQi5JLEFlcTIpKSk7dmFyIFM9bnVtZXJpYy5fc29sdmVMUChjNCxBNCxiNCx0b2wsbWF4aXQpO3ZhciB4Mj1TLnNvbHV0aW9uO2lmKHgyIT09eDIpcmV0dXJuIFM7dmFyIHgxPWRvdChCLkksc3ViKGJlcSxkb3QoQWVxMix4MikpKTt2YXIgeD1BcnJheShjLmxlbmd0aCk7Zm9yKGk9UC5sZW5ndGgtMTtpIT09LTE7LS1pKXhbUFtpXV09eDFbaV07Zm9yKGk9ClEubGVuZ3RoLTE7aSE9PS0xOy0taSl4W1FbaV1dPXgyW2ldO3JldHVybntzb2x1dGlvbjp4LG1lc3NhZ2U6Uy5tZXNzYWdlLGl0ZXJhdGlvbnM6Uy5pdGVyYXRpb25zfX07Cm51bWVyaWMuTVBTdG9MUD1mdW5jdGlvbiBNUFN0b0xQKE1QUyl7aWYoTVBTIGluc3RhbmNlb2YgU3RyaW5nKU1QUy5zcGxpdCgiXG4iKTt2YXIgc3RhdGU9MDt2YXIgc3RhdGVzPVsiSW5pdGlhbCBzdGF0ZSIsIk5BTUUiLCJST1dTIiwiQ09MVU1OUyIsIlJIUyIsIkJPVU5EUyIsIkVOREFUQSJdO3ZhciBuPU1QUy5sZW5ndGg7dmFyIGksaix6LE49MCxyb3dzPXt9LHNpZ249W10scmw9MCx2YXJzPXt9LG52PTA7dmFyIG5hbWU7dmFyIGM9W10sQT1bXSxiPVtdO2Z1bmN0aW9uIGVycihlKXt0aHJvdyBuZXcgRXJyb3IoIk1QU3RvTFA6ICIrZSsiXG5MaW5lICIraSsiOiAiK01QU1tpXSsiXG5DdXJyZW50IHN0YXRlOiAiK3N0YXRlc1tzdGF0ZV0rIlxuIik7fWZvcihpPTA7aTxuOysraSl7ej1NUFNbaV07dmFyIHcwPXoubWF0Y2goL1xTKi9nKTt2YXIgdz1bXTtmb3Ioaj0wO2o8dzAubGVuZ3RoOysrailpZih3MFtqXSE9PSIiKXcucHVzaCh3MFtqXSk7aWYody5sZW5ndGg9PT0wKWNvbnRpbnVlOwpmb3Ioaj0wO2o8c3RhdGVzLmxlbmd0aDsrK2opaWYoei5zdWJzdHIoMCxzdGF0ZXNbal0ubGVuZ3RoKT09PXN0YXRlc1tqXSlicmVhaztpZihqPHN0YXRlcy5sZW5ndGgpe3N0YXRlPWo7aWYoaj09PTEpbmFtZT13WzFdO2lmKGo9PT02KXJldHVybntuYW1lOm5hbWUsYzpjLEE6bnVtZXJpYy50cmFuc3Bvc2UoQSksYjpiLHJvd3M6cm93cyx2YXJzOnZhcnN9O2NvbnRpbnVlfXN3aXRjaChzdGF0ZSl7Y2FzZSAwOmNhc2UgMTplcnIoIlVuZXhwZWN0ZWQgbGluZSIpO2Nhc2UgMjpzd2l0Y2god1swXSl7Y2FzZSAiTiI6aWYoTj09PTApTj13WzFdO2Vsc2UgZXJyKCJUd28gb3IgbW9yZSBOIHJvd3MiKTticmVhaztjYXNlICJMIjpyb3dzW3dbMV1dPXJsO3NpZ25bcmxdPTE7YltybF09MDsrK3JsO2JyZWFrO2Nhc2UgIkciOnJvd3Nbd1sxXV09cmw7c2lnbltybF09LTE7YltybF09MDsrK3JsO2JyZWFrO2Nhc2UgIkUiOnJvd3Nbd1sxXV09cmw7c2lnbltybF09MDtiW3JsXT0wOysrcmw7YnJlYWs7CmRlZmF1bHQ6ZXJyKCJQYXJzZSBlcnJvciAiK251bWVyaWMucHJldHR5UHJpbnQodykpfWJyZWFrO2Nhc2UgMzppZighdmFycy5oYXNPd25Qcm9wZXJ0eSh3WzBdKSl7dmFyc1t3WzBdXT1udjtjW252XT0wO0FbbnZdPW51bWVyaWMucmVwKFtybF0sMCk7Kytudn12YXIgcD12YXJzW3dbMF1dO2ZvcihqPTE7ajx3Lmxlbmd0aDtqKz0yKXtpZih3W2pdPT09Til7Y1twXT1wYXJzZUZsb2F0KHdbaisxXSk7Y29udGludWV9dmFyIHE9cm93c1t3W2pdXTtBW3BdW3FdPShzaWduW3FdPDA/LTE6MSkqcGFyc2VGbG9hdCh3W2orMV0pfWJyZWFrO2Nhc2UgNDpmb3Ioaj0xO2o8dy5sZW5ndGg7ais9MiliW3Jvd3Nbd1tqXV1dPShzaWduW3Jvd3Nbd1tqXV1dPDA/LTE6MSkqcGFyc2VGbG9hdCh3W2orMV0pO2JyZWFrO2Nhc2UgNTpicmVhaztjYXNlIDY6ZXJyKCJJbnRlcm5hbCBlcnJvciIpfX1lcnIoIlJlYWNoZWQgZW5kIG9mIGZpbGUgd2l0aG91dCBFTkRBVEEiKX07Cm51bWVyaWMuc2VlZHJhbmRvbT17cG93Ok1hdGgucG93LHJhbmRvbTpNYXRoLnJhbmRvbX07CihmdW5jdGlvbihwb29sLG1hdGgsd2lkdGgsY2h1bmtzLHNpZ25pZmljYW5jZSxvdmVyZmxvdyxzdGFydGRlbm9tKXttYXRoWyJzZWVkcmFuZG9tIl09ZnVuY3Rpb24gc2VlZHJhbmRvbShzZWVkLHVzZV9lbnRyb3B5KXt2YXIga2V5PVtdO3ZhciBhcmM0O3NlZWQ9bWl4a2V5KGZsYXR0ZW4odXNlX2VudHJvcHk/W3NlZWQscG9vbF06YXJndW1lbnRzLmxlbmd0aD9zZWVkOlsobmV3IERhdGUpLmdldFRpbWUoKSxwb29sLHdpbmRvd10sMyksa2V5KTthcmM0PW5ldyBBUkM0KGtleSk7bWl4a2V5KGFyYzQuUyxwb29sKTttYXRoWyJyYW5kb20iXT1mdW5jdGlvbiByYW5kb20oKXt2YXIgbj1hcmM0LmcoY2h1bmtzKTt2YXIgZD1zdGFydGRlbm9tO3ZhciB4PTA7d2hpbGUobjxzaWduaWZpY2FuY2Upe249KG4reCkqd2lkdGg7ZCo9d2lkdGg7eD1hcmM0LmcoMSl9d2hpbGUobj49b3ZlcmZsb3cpe24vPTI7ZC89Mjt4Pj4+PTF9cmV0dXJuKG4reCkvZH07cmV0dXJuIHNlZWR9O2Z1bmN0aW9uIEFSQzQoa2V5KXt2YXIgdCwKdSxtZT10aGlzLGtleWxlbj1rZXkubGVuZ3RoO3ZhciBpPTAsaj1tZS5pPW1lLmo9bWUubT0wO21lLlM9W107bWUuYz1bXTtpZigha2V5bGVuKWtleT1ba2V5bGVuKytdO3doaWxlKGk8d2lkdGgpbWUuU1tpXT1pKys7Zm9yKGk9MDtpPHdpZHRoO2krKyl7dD1tZS5TW2ldO2o9bG93Yml0cyhqK3Qra2V5W2kla2V5bGVuXSk7dT1tZS5TW2pdO21lLlNbaV09dTttZS5TW2pdPXR9bWUuZz1mdW5jdGlvbiBnZXRuZXh0KGNvdW50KXt2YXIgcz1tZS5TO3ZhciBpPWxvd2JpdHMobWUuaSsxKTt2YXIgdD1zW2ldO3ZhciBqPWxvd2JpdHMobWUuait0KTt2YXIgdT1zW2pdO3NbaV09dTtzW2pdPXQ7dmFyIHI9c1tsb3diaXRzKHQrdSldO3doaWxlKC0tY291bnQpe2k9bG93Yml0cyhpKzEpO3Q9c1tpXTtqPWxvd2JpdHMoait0KTt1PXNbal07c1tpXT11O3Nbal09dDtyPXIqd2lkdGgrc1tsb3diaXRzKHQrdSldfW1lLmk9aTttZS5qPWo7cmV0dXJuIHJ9O21lLmcod2lkdGgpfWZ1bmN0aW9uIGZsYXR0ZW4ob2JqLApkZXB0aCxyZXN1bHQscHJvcCx0eXApe3Jlc3VsdD1bXTt0eXA9dHlwZW9mIG9iajtpZihkZXB0aCYmdHlwPT0ib2JqZWN0Iilmb3IocHJvcCBpbiBvYmopaWYocHJvcC5pbmRleE9mKCJTIik8NSl0cnl7cmVzdWx0LnB1c2goZmxhdHRlbihvYmpbcHJvcF0sZGVwdGgtMSkpfWNhdGNoKGUpe31yZXR1cm4gcmVzdWx0Lmxlbmd0aD9yZXN1bHQ6b2JqKyh0eXAhPSJzdHJpbmciPyJceDAwIjoiIil9ZnVuY3Rpb24gbWl4a2V5KHNlZWQsa2V5LHNtZWFyLGope3NlZWQrPSIiO3NtZWFyPTA7Zm9yKGo9MDtqPHNlZWQubGVuZ3RoO2orKylrZXlbbG93Yml0cyhqKV09bG93Yml0cygoc21lYXJePWtleVtsb3diaXRzKGopXSoxOSkrc2VlZC5jaGFyQ29kZUF0KGopKTtzZWVkPSIiO2ZvcihqIGluIGtleSlzZWVkKz1TdHJpbmcuZnJvbUNoYXJDb2RlKGtleVtqXSk7cmV0dXJuIHNlZWR9ZnVuY3Rpb24gbG93Yml0cyhuKXtyZXR1cm4gbiZ3aWR0aC0xfXN0YXJ0ZGVub209bWF0aC5wb3cod2lkdGgsCmNodW5rcyk7c2lnbmlmaWNhbmNlPW1hdGgucG93KDIsc2lnbmlmaWNhbmNlKTtvdmVyZmxvdz1zaWduaWZpY2FuY2UqMjttaXhrZXkobWF0aC5yYW5kb20oKSxwb29sKX0pKFtdLG51bWVyaWMuc2VlZHJhbmRvbSwyNTYsNiw1Mik7CihmdW5jdGlvbihleHBvcnRzKXtmdW5jdGlvbiBiYXNlMHRvMShBKXtpZih0eXBlb2YgQSE9PSJvYmplY3QiKXJldHVybiBBO3ZhciByZXQ9W10saSxuPUEubGVuZ3RoO2ZvcihpPTA7aTxuO2krKylyZXRbaSsxXT1iYXNlMHRvMShBW2ldKTtyZXR1cm4gcmV0fWZ1bmN0aW9uIGJhc2UxdG8wKEEpe2lmKHR5cGVvZiBBIT09Im9iamVjdCIpcmV0dXJuIEE7dmFyIHJldD1bXSxpLG49QS5sZW5ndGg7Zm9yKGk9MTtpPG47aSsrKXJldFtpLTFdPWJhc2UxdG8wKEFbaV0pO3JldHVybiByZXR9ZnVuY3Rpb24gZHBvcmkoYSxsZGEsbil7dmFyIGksaixrLGtwMSx0O2ZvcihrPTE7azw9bjtrPWsrMSl7YVtrXVtrXT0xL2Fba11ba107dD0tYVtrXVtrXTtmb3IoaT0xO2k8aztpPWkrMSlhW2ldW2tdPXQqYVtpXVtrXTtrcDE9aysxO2lmKG48a3AxKWJyZWFrO2ZvcihqPWtwMTtqPD1uO2o9aisxKXt0PWFba11bal07YVtrXVtqXT0wO2ZvcihpPTE7aTw9aztpPWkrMSlhW2ldW2pdPWFbaV1bal0rdCoKYVtpXVtrXX19fWZ1bmN0aW9uIGRwb3NsKGEsbGRhLG4sYil7dmFyIGksayxrYix0O2ZvcihrPTE7azw9bjtrPWsrMSl7dD0wO2ZvcihpPTE7aTxrO2k9aSsxKXQ9dCthW2ldW2tdKmJbaV07YltrXT0oYltrXS10KS9hW2tdW2tdfWZvcihrYj0xO2tiPD1uO2tiPWtiKzEpe2s9bisxLWtiO2Jba109YltrXS9hW2tdW2tdO3Q9LWJba107Zm9yKGk9MTtpPGs7aT1pKzEpYltpXT1iW2ldK3QqYVtpXVtrXX19ZnVuY3Rpb24gZHBvZmEoYSxsZGEsbixpbmZvKXt2YXIgaSxqLGptMSxrLHQscztmb3Ioaj0xO2o8PW47aj1qKzEpe2luZm9bMV09ajtzPTA7am0xPWotMTtpZihqbTE8MSl7cz1hW2pdW2pdLXM7aWYoczw9MClicmVhazthW2pdW2pdPU1hdGguc3FydChzKX1lbHNle2ZvcihrPTE7azw9am0xO2s9aysxKXt0PWFba11bal07Zm9yKGk9MTtpPGs7aT1pKzEpdD10LWFbaV1bal0qYVtpXVtrXTt0PXQvYVtrXVtrXTthW2tdW2pdPXQ7cz1zK3QqdH1zPWFbal1bal0tcztpZihzPD0wKWJyZWFrOwphW2pdW2pdPU1hdGguc3FydChzKX1pbmZvWzFdPTB9fWZ1bmN0aW9uIHFwZ2VuMihkbWF0LGR2ZWMsZmRkbWF0LG4sc29sLGNydmFsLGFtYXQsYnZlYyxmZGFtYXQscSxtZXEsaWFjdCxuYWN0LGl0ZXIsd29yayxpZXJyKXt2YXIgaSxqLGwsbDEsaW5mbyxpdDEsaXd6dixpd3J2LGl3cm0saXdzdixpd3V2LG52bCxyLGl3bmJ2LHRlbXAsc3VtLHQxLHR0LGdjLGdzLG51LHQxaW5mLHQybWluLHZzbWFsbCx0bXBhLHRtcGIsZ287cj1NYXRoLm1pbihuLHEpO2w9MipuK3IqKHIrNSkvMisyKnErMTt2c21hbGw9MUUtNjA7ZG97dnNtYWxsPXZzbWFsbCt2c21hbGw7dG1wYT0xKy4xKnZzbWFsbDt0bXBiPTErLjIqdnNtYWxsfXdoaWxlKHRtcGE8PTF8fHRtcGI8PTEpO2ZvcihpPTE7aTw9bjtpPWkrMSl3b3JrW2ldPWR2ZWNbaV07Zm9yKGk9bisxO2k8PWw7aT1pKzEpd29ya1tpXT0wO2ZvcihpPTE7aTw9cTtpPWkrMSlpYWN0W2ldPTA7aW5mbz1bXTtpZihpZXJyWzFdPT09MCl7ZHBvZmEoZG1hdCwKZmRkbWF0LG4saW5mbyk7aWYoaW5mb1sxXSE9PTApe2llcnJbMV09MjtyZXR1cm59ZHBvc2woZG1hdCxmZGRtYXQsbixkdmVjKTtkcG9yaShkbWF0LGZkZG1hdCxuKX1lbHNle2ZvcihqPTE7ajw9bjtqPWorMSl7c29sW2pdPTA7Zm9yKGk9MTtpPD1qO2k9aSsxKXNvbFtqXT1zb2xbal0rZG1hdFtpXVtqXSpkdmVjW2ldfWZvcihqPTE7ajw9bjtqPWorMSl7ZHZlY1tqXT0wO2ZvcihpPWo7aTw9bjtpPWkrMSlkdmVjW2pdPWR2ZWNbal0rZG1hdFtqXVtpXSpzb2xbaV19fWNydmFsWzFdPTA7Zm9yKGo9MTtqPD1uO2o9aisxKXtzb2xbal09ZHZlY1tqXTtjcnZhbFsxXT1jcnZhbFsxXSt3b3JrW2pdKnNvbFtqXTt3b3JrW2pdPTA7Zm9yKGk9aisxO2k8PW47aT1pKzEpZG1hdFtpXVtqXT0wfWNydmFsWzFdPS1jcnZhbFsxXS8yO2llcnJbMV09MDtpd3p2PW47aXdydj1pd3p2K247aXd1dj1pd3J2K3I7aXdybT1pd3V2K3IrMTtpd3N2PWl3cm0rcioocisxKS8yO2l3bmJ2PWl3c3YrcTtmb3IoaT0KMTtpPD1xO2k9aSsxKXtzdW09MDtmb3Ioaj0xO2o8PW47aj1qKzEpc3VtPXN1bSthbWF0W2pdW2ldKmFtYXRbal1baV07d29ya1tpd25iditpXT1NYXRoLnNxcnQoc3VtKX1uYWN0PTA7aXRlclsxXT0wO2l0ZXJbMl09MDtmdW5jdGlvbiBmbl9nb3RvXzUwKCl7aXRlclsxXT1pdGVyWzFdKzE7bD1pd3N2O2ZvcihpPTE7aTw9cTtpPWkrMSl7bD1sKzE7c3VtPS1idmVjW2ldO2ZvcihqPTE7ajw9bjtqPWorMSlzdW09c3VtK2FtYXRbal1baV0qc29sW2pdO2lmKE1hdGguYWJzKHN1bSk8dnNtYWxsKXN1bT0wO2lmKGk+bWVxKXdvcmtbbF09c3VtO2Vsc2V7d29ya1tsXT0tTWF0aC5hYnMoc3VtKTtpZihzdW0+MCl7Zm9yKGo9MTtqPD1uO2o9aisxKWFtYXRbal1baV09LWFtYXRbal1baV07YnZlY1tpXT0tYnZlY1tpXX19fWZvcihpPTE7aTw9bmFjdDtpPWkrMSl3b3JrW2l3c3YraWFjdFtpXV09MDtudmw9MDt0ZW1wPTA7Zm9yKGk9MTtpPD1xO2k9aSsxKWlmKHdvcmtbaXdzditpXTx0ZW1wKgp3b3JrW2l3bmJ2K2ldKXtudmw9aTt0ZW1wPXdvcmtbaXdzditpXS93b3JrW2l3bmJ2K2ldfWlmKG52bD09PTApcmV0dXJuIDk5OTtyZXR1cm4gMH1mdW5jdGlvbiBmbl9nb3RvXzU1KCl7Zm9yKGk9MTtpPD1uO2k9aSsxKXtzdW09MDtmb3Ioaj0xO2o8PW47aj1qKzEpc3VtPXN1bStkbWF0W2pdW2ldKmFtYXRbal1bbnZsXTt3b3JrW2ldPXN1bX1sMT1pd3p2O2ZvcihpPTE7aTw9bjtpPWkrMSl3b3JrW2wxK2ldPTA7Zm9yKGo9bmFjdCsxO2o8PW47aj1qKzEpZm9yKGk9MTtpPD1uO2k9aSsxKXdvcmtbbDEraV09d29ya1tsMStpXStkbWF0W2ldW2pdKndvcmtbal07dDFpbmY9dHJ1ZTtmb3IoaT1uYWN0O2k+PTE7aT1pLTEpe3N1bT13b3JrW2ldO2w9aXdybStpKihpKzMpLzI7bDE9bC1pO2ZvcihqPWkrMTtqPD1uYWN0O2o9aisxKXtzdW09c3VtLXdvcmtbbF0qd29ya1tpd3J2K2pdO2w9bCtqfXN1bT1zdW0vd29ya1tsMV07d29ya1tpd3J2K2ldPXN1bTtpZihpYWN0W2ldPG1lcSlicmVhazsKaWYoc3VtPDApYnJlYWs7dDFpbmY9ZmFsc2U7aXQxPWl9aWYoIXQxaW5mKXt0MT13b3JrW2l3dXYraXQxXS93b3JrW2l3cnYraXQxXTtmb3IoaT0xO2k8PW5hY3Q7aT1pKzEpe2lmKGlhY3RbaV08bWVxKWJyZWFrO2lmKHdvcmtbaXdyditpXTwwKWJyZWFrO3RlbXA9d29ya1tpd3V2K2ldL3dvcmtbaXdyditpXTtpZih0ZW1wPHQxKXt0MT10ZW1wO2l0MT1pfX19c3VtPTA7Zm9yKGk9aXd6disxO2k8PWl3enYrbjtpPWkrMSlzdW09c3VtK3dvcmtbaV0qd29ya1tpXTtpZihNYXRoLmFicyhzdW0pPD12c21hbGwpaWYodDFpbmYpe2llcnJbMV09MTtyZXR1cm4gOTk5fWVsc2V7Zm9yKGk9MTtpPD1uYWN0O2k9aSsxKXdvcmtbaXd1ditpXT13b3JrW2l3dXYraV0tdDEqd29ya1tpd3J2K2ldO3dvcmtbaXd1dituYWN0KzFdPXdvcmtbaXd1dituYWN0KzFdK3QxO3JldHVybiA3MDB9ZWxzZXtzdW09MDtmb3IoaT0xO2k8PW47aT1pKzEpc3VtPXN1bSt3b3JrW2l3enYraV0qYW1hdFtpXVtudmxdOwp0dD0td29ya1tpd3N2K252bF0vc3VtO3QybWluPXRydWU7aWYoIXQxaW5mKWlmKHQxPHR0KXt0dD10MTt0Mm1pbj1mYWxzZX1mb3IoaT0xO2k8PW47aT1pKzEpe3NvbFtpXT1zb2xbaV0rdHQqd29ya1tpd3p2K2ldO2lmKE1hdGguYWJzKHNvbFtpXSk8dnNtYWxsKXNvbFtpXT0wfWNydmFsWzFdPWNydmFsWzFdK3R0KnN1bSoodHQvMit3b3JrW2l3dXYrbmFjdCsxXSk7Zm9yKGk9MTtpPD1uYWN0O2k9aSsxKXdvcmtbaXd1ditpXT13b3JrW2l3dXYraV0tdHQqd29ya1tpd3J2K2ldO3dvcmtbaXd1dituYWN0KzFdPXdvcmtbaXd1dituYWN0KzFdK3R0O2lmKHQybWluKXtuYWN0PW5hY3QrMTtpYWN0W25hY3RdPW52bDtsPWl3cm0rKG5hY3QtMSkqbmFjdC8yKzE7Zm9yKGk9MTtpPD1uYWN0LTE7aT1pKzEpe3dvcmtbbF09d29ya1tpXTtsPWwrMX1pZihuYWN0PT09bil3b3JrW2xdPXdvcmtbbl07ZWxzZXtmb3IoaT1uO2k+PW5hY3QrMTtpPWktMSl7aWYod29ya1tpXT09PTApYnJlYWs7Z2M9Ck1hdGgubWF4KE1hdGguYWJzKHdvcmtbaS0xXSksTWF0aC5hYnMod29ya1tpXSkpO2dzPU1hdGgubWluKE1hdGguYWJzKHdvcmtbaS0xXSksTWF0aC5hYnMod29ya1tpXSkpO2lmKHdvcmtbaS0xXT49MCl0ZW1wPU1hdGguYWJzKGdjKk1hdGguc3FydCgxK2dzKmdzLyhnYypnYykpKTtlbHNlIHRlbXA9LU1hdGguYWJzKGdjKk1hdGguc3FydCgxK2dzKmdzLyhnYypnYykpKTtnYz13b3JrW2ktMV0vdGVtcDtncz13b3JrW2ldL3RlbXA7aWYoZ2M9PT0xKWJyZWFrO2lmKGdjPT09MCl7d29ya1tpLTFdPWdzKnRlbXA7Zm9yKGo9MTtqPD1uO2o9aisxKXt0ZW1wPWRtYXRbal1baS0xXTtkbWF0W2pdW2ktMV09ZG1hdFtqXVtpXTtkbWF0W2pdW2ldPXRlbXB9fWVsc2V7d29ya1tpLTFdPXRlbXA7bnU9Z3MvKDErZ2MpO2ZvcihqPTE7ajw9bjtqPWorMSl7dGVtcD1nYypkbWF0W2pdW2ktMV0rZ3MqZG1hdFtqXVtpXTtkbWF0W2pdW2ldPW51KihkbWF0W2pdW2ktMV0rdGVtcCktZG1hdFtqXVtpXTsKZG1hdFtqXVtpLTFdPXRlbXB9fX13b3JrW2xdPXdvcmtbbmFjdF19fWVsc2V7c3VtPS1idmVjW252bF07Zm9yKGo9MTtqPD1uO2o9aisxKXN1bT1zdW0rc29sW2pdKmFtYXRbal1bbnZsXTtpZihudmw+bWVxKXdvcmtbaXdzditudmxdPXN1bTtlbHNle3dvcmtbaXdzditudmxdPS1NYXRoLmFicyhzdW0pO2lmKHN1bT4wKXtmb3Ioaj0xO2o8PW47aj1qKzEpYW1hdFtqXVtudmxdPS1hbWF0W2pdW252bF07YnZlY1tudmxdPS1idmVjW252bF19fXJldHVybiA3MDB9fXJldHVybiAwfWZ1bmN0aW9uIGZuX2dvdG9fNzk3KCl7bD1pd3JtK2l0MSooaXQxKzEpLzIrMTtsMT1sK2l0MTtpZih3b3JrW2wxXT09PTApcmV0dXJuIDc5ODtnYz1NYXRoLm1heChNYXRoLmFicyh3b3JrW2wxLTFdKSxNYXRoLmFicyh3b3JrW2wxXSkpO2dzPU1hdGgubWluKE1hdGguYWJzKHdvcmtbbDEtMV0pLE1hdGguYWJzKHdvcmtbbDFdKSk7aWYod29ya1tsMS0xXT49MCl0ZW1wPU1hdGguYWJzKGdjKk1hdGguc3FydCgxKwpncypncy8oZ2MqZ2MpKSk7ZWxzZSB0ZW1wPS1NYXRoLmFicyhnYypNYXRoLnNxcnQoMStncypncy8oZ2MqZ2MpKSk7Z2M9d29ya1tsMS0xXS90ZW1wO2dzPXdvcmtbbDFdL3RlbXA7aWYoZ2M9PT0xKXJldHVybiA3OTg7aWYoZ2M9PT0wKXtmb3IoaT1pdDErMTtpPD1uYWN0O2k9aSsxKXt0ZW1wPXdvcmtbbDEtMV07d29ya1tsMS0xXT13b3JrW2wxXTt3b3JrW2wxXT10ZW1wO2wxPWwxK2l9Zm9yKGk9MTtpPD1uO2k9aSsxKXt0ZW1wPWRtYXRbaV1baXQxXTtkbWF0W2ldW2l0MV09ZG1hdFtpXVtpdDErMV07ZG1hdFtpXVtpdDErMV09dGVtcH19ZWxzZXtudT1ncy8oMStnYyk7Zm9yKGk9aXQxKzE7aTw9bmFjdDtpPWkrMSl7dGVtcD1nYyp3b3JrW2wxLTFdK2dzKndvcmtbbDFdO3dvcmtbbDFdPW51Kih3b3JrW2wxLTFdK3RlbXApLXdvcmtbbDFdO3dvcmtbbDEtMV09dGVtcDtsMT1sMStpfWZvcihpPTE7aTw9bjtpPWkrMSl7dGVtcD1nYypkbWF0W2ldW2l0MV0rZ3MqZG1hdFtpXVtpdDErCjFdO2RtYXRbaV1baXQxKzFdPW51KihkbWF0W2ldW2l0MV0rdGVtcCktZG1hdFtpXVtpdDErMV07ZG1hdFtpXVtpdDFdPXRlbXB9fXJldHVybiAwfWZ1bmN0aW9uIGZuX2dvdG9fNzk4KCl7bDE9bC1pdDE7Zm9yKGk9MTtpPD1pdDE7aT1pKzEpe3dvcmtbbDFdPXdvcmtbbF07bD1sKzE7bDE9bDErMX13b3JrW2l3dXYraXQxXT13b3JrW2l3dXYraXQxKzFdO2lhY3RbaXQxXT1pYWN0W2l0MSsxXTtpdDE9aXQxKzE7aWYoaXQxPG5hY3QpcmV0dXJuIDc5NztyZXR1cm4gMH1mdW5jdGlvbiBmbl9nb3RvXzc5OSgpe3dvcmtbaXd1dituYWN0XT13b3JrW2l3dXYrbmFjdCsxXTt3b3JrW2l3dXYrbmFjdCsxXT0wO2lhY3RbbmFjdF09MDtuYWN0PW5hY3QtMTtpdGVyWzJdPWl0ZXJbMl0rMTtyZXR1cm4gMH1nbz0wO3doaWxlKHRydWUpe2dvPWZuX2dvdG9fNTAoKTtpZihnbz09PTk5OSlyZXR1cm47d2hpbGUodHJ1ZSl7Z289Zm5fZ290b181NSgpO2lmKGdvPT09MClicmVhaztpZihnbz09PTk5OSlyZXR1cm47CmlmKGdvPT09NzAwKWlmKGl0MT09PW5hY3QpZm5fZ290b183OTkoKTtlbHNle3doaWxlKHRydWUpe2ZuX2dvdG9fNzk3KCk7Z289Zm5fZ290b183OTgoKTtpZihnbyE9PTc5NylicmVha31mbl9nb3RvXzc5OSgpfX19fWZ1bmN0aW9uIHNvbHZlUVAoRG1hdCxkdmVjLEFtYXQsYnZlYyxtZXEsZmFjdG9yaXplZCl7RG1hdD1iYXNlMHRvMShEbWF0KTtkdmVjPWJhc2UwdG8xKGR2ZWMpO0FtYXQ9YmFzZTB0bzEoQW1hdCk7dmFyIGksbixxLG5hY3QscixjcnZhbD1bXSxpYWN0PVtdLHNvbD1bXSx3b3JrPVtdLGl0ZXI9W10sbWVzc2FnZTttZXE9bWVxfHwwO2ZhY3Rvcml6ZWQ9ZmFjdG9yaXplZD9iYXNlMHRvMShmYWN0b3JpemVkKTpbdW5kZWZpbmVkLDBdO2J2ZWM9YnZlYz9iYXNlMHRvMShidmVjKTpbXTtuPURtYXQubGVuZ3RoLTE7cT1BbWF0WzFdLmxlbmd0aC0xO2lmKCFidmVjKWZvcihpPTE7aTw9cTtpPWkrMSlidmVjW2ldPTA7Zm9yKGk9MTtpPD1xO2k9aSsxKWlhY3RbaV09MDtuYWN0PQowO3I9TWF0aC5taW4obixxKTtmb3IoaT0xO2k8PW47aT1pKzEpc29sW2ldPTA7Y3J2YWxbMV09MDtmb3IoaT0xO2k8PTIqbityKihyKzUpLzIrMipxKzE7aT1pKzEpd29ya1tpXT0wO2ZvcihpPTE7aTw9MjtpPWkrMSlpdGVyW2ldPTA7cXBnZW4yKERtYXQsZHZlYyxuLG4sc29sLGNydmFsLEFtYXQsYnZlYyxuLHEsbWVxLGlhY3QsbmFjdCxpdGVyLHdvcmssZmFjdG9yaXplZCk7bWVzc2FnZT0iIjtpZihmYWN0b3JpemVkWzFdPT09MSltZXNzYWdlPSJjb25zdHJhaW50cyBhcmUgaW5jb25zaXN0ZW50LCBubyBzb2x1dGlvbiEiO2lmKGZhY3Rvcml6ZWRbMV09PT0yKW1lc3NhZ2U9Im1hdHJpeCBEIGluIHF1YWRyYXRpYyBmdW5jdGlvbiBpcyBub3QgcG9zaXRpdmUgZGVmaW5pdGUhIjtyZXR1cm57c29sdXRpb246YmFzZTF0bzAoc29sKSx2YWx1ZTpiYXNlMXRvMChjcnZhbCksdW5jb25zdHJhaW5lZF9zb2x1dGlvbjpiYXNlMXRvMChkdmVjKSxpdGVyYXRpb25zOmJhc2UxdG8wKGl0ZXIpLAppYWN0OmJhc2UxdG8wKGlhY3QpLG1lc3NhZ2U6bWVzc2FnZX19ZXhwb3J0cy5zb2x2ZVFQPXNvbHZlUVB9KShudW1lcmljKTsKbnVtZXJpYy5zdmQ9ZnVuY3Rpb24gc3ZkKEEpe3ZhciB0ZW1wO3ZhciBwcmVjPW51bWVyaWMuZXBzaWxvbjt2YXIgdG9sZXJhbmNlPTFFLTY0L3ByZWM7dmFyIGl0bWF4PTUwO3ZhciBjPTA7dmFyIGk9MDt2YXIgaj0wO3ZhciBrPTA7dmFyIGw9MDt2YXIgdT1udW1lcmljLmNsb25lKEEpO3ZhciBtPXUubGVuZ3RoO3ZhciBuPXVbMF0ubGVuZ3RoO2lmKG08bil0aHJvdyJOZWVkIG1vcmUgcm93cyB0aGFuIGNvbHVtbnMiO3ZhciBlPW5ldyBBcnJheShuKTt2YXIgcT1uZXcgQXJyYXkobik7Zm9yKGk9MDtpPG47aSsrKWVbaV09cVtpXT0wO3ZhciB2PW51bWVyaWMucmVwKFtuLG5dLDApO2Z1bmN0aW9uIHB5dGhhZyhhLGIpe2E9TWF0aC5hYnMoYSk7Yj1NYXRoLmFicyhiKTtpZihhPmIpcmV0dXJuIGEqTWF0aC5zcXJ0KDErYipiL2EvYSk7ZWxzZSBpZihiPT0wKXJldHVybiBhO3JldHVybiBiKk1hdGguc3FydCgxK2EqYS9iL2IpfXZhciBmPTA7dmFyIGc9MDt2YXIgaD0wO3ZhciB4PTA7CnZhciB5PTA7dmFyIHo9MDt2YXIgcz0wO2ZvcihpPTA7aTxuO2krKyl7ZVtpXT1nO3M9MDtsPWkrMTtmb3Ioaj1pO2o8bTtqKyspcys9dVtqXVtpXSp1W2pdW2ldO2lmKHM8PXRvbGVyYW5jZSlnPTA7ZWxzZXtmPXVbaV1baV07Zz1NYXRoLnNxcnQocyk7aWYoZj49MClnPS1nO2g9ZipnLXM7dVtpXVtpXT1mLWc7Zm9yKGo9bDtqPG47aisrKXtzPTA7Zm9yKGs9aTtrPG07aysrKXMrPXVba11baV0qdVtrXVtqXTtmPXMvaDtmb3Ioaz1pO2s8bTtrKyspdVtrXVtqXSs9Zip1W2tdW2ldfX1xW2ldPWc7cz0wO2ZvcihqPWw7ajxuO2orKylzPXMrdVtpXVtqXSp1W2ldW2pdO2lmKHM8PXRvbGVyYW5jZSlnPTA7ZWxzZXtmPXVbaV1baSsxXTtnPU1hdGguc3FydChzKTtpZihmPj0wKWc9LWc7aD1mKmctczt1W2ldW2krMV09Zi1nO2ZvcihqPWw7ajxuO2orKyllW2pdPXVbaV1bal0vaDtmb3Ioaj1sO2o8bTtqKyspe3M9MDtmb3Ioaz1sO2s8bjtrKyspcys9dVtqXVtrXSp1W2ldW2tdO2ZvcihrPQpsO2s8bjtrKyspdVtqXVtrXSs9cyplW2tdfX15PU1hdGguYWJzKHFbaV0pK01hdGguYWJzKGVbaV0pO2lmKHk+eCl4PXl9Zm9yKGk9bi0xO2khPS0xO2krPS0xKXtpZihnIT0wKXtoPWcqdVtpXVtpKzFdO2ZvcihqPWw7ajxuO2orKyl2W2pdW2ldPXVbaV1bal0vaDtmb3Ioaj1sO2o8bjtqKyspe3M9MDtmb3Ioaz1sO2s8bjtrKyspcys9dVtpXVtrXSp2W2tdW2pdO2ZvcihrPWw7azxuO2srKyl2W2tdW2pdKz1zKnZba11baV19fWZvcihqPWw7ajxuO2orKyl7dltpXVtqXT0wO3Zbal1baV09MH12W2ldW2ldPTE7Zz1lW2ldO2w9aX1mb3IoaT1uLTE7aSE9LTE7aSs9LTEpe2w9aSsxO2c9cVtpXTtmb3Ioaj1sO2o8bjtqKyspdVtpXVtqXT0wO2lmKGchPTApe2g9dVtpXVtpXSpnO2ZvcihqPWw7ajxuO2orKyl7cz0wO2ZvcihrPWw7azxtO2srKylzKz11W2tdW2ldKnVba11bal07Zj1zL2g7Zm9yKGs9aTtrPG07aysrKXVba11bal0rPWYqdVtrXVtpXX1mb3Ioaj1pO2o8bTtqKyspdVtqXVtpXT0KdVtqXVtpXS9nfWVsc2UgZm9yKGo9aTtqPG07aisrKXVbal1baV09MDt1W2ldW2ldKz0xfXByZWM9cHJlYyp4O2ZvcihrPW4tMTtrIT0tMTtrKz0tMSlmb3IodmFyIGl0ZXJhdGlvbj0wO2l0ZXJhdGlvbjxpdG1heDtpdGVyYXRpb24rKyl7dmFyIHRlc3RfY29udmVyZ2VuY2U9ZmFsc2U7Zm9yKGw9aztsIT0tMTtsKz0tMSl7aWYoTWF0aC5hYnMoZVtsXSk8PXByZWMpe3Rlc3RfY29udmVyZ2VuY2U9dHJ1ZTticmVha31pZihNYXRoLmFicyhxW2wtMV0pPD1wcmVjKWJyZWFrfWlmKCF0ZXN0X2NvbnZlcmdlbmNlKXtjPTA7cz0xO3ZhciBsMT1sLTE7Zm9yKGk9bDtpPGsrMTtpKyspe2Y9cyplW2ldO2VbaV09YyplW2ldO2lmKE1hdGguYWJzKGYpPD1wcmVjKWJyZWFrO2c9cVtpXTtoPXB5dGhhZyhmLGcpO3FbaV09aDtjPWcvaDtzPS1mL2g7Zm9yKGo9MDtqPG07aisrKXt5PXVbal1bbDFdO3o9dVtqXVtpXTt1W2pdW2wxXT15KmMreipzO3Vbal1baV09LXkqcyt6KmN9fX16PXFba107aWYobD09Cmspe2lmKHo8MCl7cVtrXT0tejtmb3Ioaj0wO2o8bjtqKyspdltqXVtrXT0tdltqXVtrXX1icmVha31pZihpdGVyYXRpb24+PWl0bWF4LTEpdGhyb3ciRXJyb3I6IG5vIGNvbnZlcmdlbmNlLiI7eD1xW2xdO3k9cVtrLTFdO2c9ZVtrLTFdO2g9ZVtrXTtmPSgoeS16KSooeSt6KSsoZy1oKSooZytoKSkvKDIqaCp5KTtnPXB5dGhhZyhmLDEpO2lmKGY8MClmPSgoeC16KSooeCt6KStoKih5LyhmLWcpLWgpKS94O2Vsc2UgZj0oKHgteikqKHgreikraCooeS8oZitnKS1oKSkveDtjPTE7cz0xO2ZvcihpPWwrMTtpPGsrMTtpKyspe2c9ZVtpXTt5PXFbaV07aD1zKmc7Zz1jKmc7ej1weXRoYWcoZixoKTtlW2ktMV09ejtjPWYvejtzPWgvejtmPXgqYytnKnM7Zz0teCpzK2cqYztoPXkqczt5PXkqYztmb3Ioaj0wO2o8bjtqKyspe3g9dltqXVtpLTFdO3o9dltqXVtpXTt2W2pdW2ktMV09eCpjK3oqczt2W2pdW2ldPS14KnMreipjfXo9cHl0aGFnKGYsaCk7cVtpLTFdPXo7Yz1mL3o7cz1oL3o7Zj0KYypnK3MqeTt4PS1zKmcrYyp5O2ZvcihqPTA7ajxtO2orKyl7eT11W2pdW2ktMV07ej11W2pdW2ldO3Vbal1baS0xXT15KmMreipzO3Vbal1baV09LXkqcyt6KmN9fWVbbF09MDtlW2tdPWY7cVtrXT14fWZvcihpPTA7aTxxLmxlbmd0aDtpKyspaWYocVtpXTxwcmVjKXFbaV09MDtmb3IoaT0wO2k8bjtpKyspZm9yKGo9aS0xO2o+PTA7ai0tKWlmKHFbal08cVtpXSl7Yz1xW2pdO3Fbal09cVtpXTtxW2ldPWM7Zm9yKGs9MDtrPHUubGVuZ3RoO2srKyl7dGVtcD11W2tdW2ldO3Vba11baV09dVtrXVtqXTt1W2tdW2pdPXRlbXB9Zm9yKGs9MDtrPHYubGVuZ3RoO2srKyl7dGVtcD12W2tdW2ldO3Zba11baV09dltrXVtqXTt2W2tdW2pdPXRlbXB9aT1qfXJldHVybntVOnUsUzpxLFY6dn19Ozwvc2NyaXB0PjxzY3JpcHQ+IWZ1bmN0aW9uKHQpe3ZhciByPXt9O2Z1bmN0aW9uIGUobil7aWYocltuXSlyZXR1cm4gcltuXS5leHBvcnRzO3ZhciBpPXJbbl09e2k6bixsOiExLGV4cG9ydHM6e319O3JldHVybiB0W25dLmNhbGwoaS5leHBvcnRzLGksaS5leHBvcnRzLGUpLGkubD0hMCxpLmV4cG9ydHN9ZS5tPXQsZS5jPXIsZS5kPWZ1bmN0aW9uKHQscixuKXtlLm8odCxyKXx8T2JqZWN0LmRlZmluZVByb3BlcnR5KHQscix7ZW51bWVyYWJsZTohMCxnZXQ6bn0pfSxlLnI9ZnVuY3Rpb24odCl7InVuZGVmaW5lZCIhPXR5cGVvZiBTeW1ib2wmJlN5bWJvbC50b1N0cmluZ1RhZyYmT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsU3ltYm9sLnRvU3RyaW5nVGFnLHt2YWx1ZToiTW9kdWxlIn0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KX0sZS50PWZ1bmN0aW9uKHQscil7aWYoMSZyJiYodD1lKHQpKSw4JnIpcmV0dXJuIHQ7aWYoNCZyJiYib2JqZWN0Ij09dHlwZW9mIHQmJnQmJnQuX19lc01vZHVsZSlyZXR1cm4gdDt2YXIgbj1PYmplY3QuY3JlYXRlKG51bGwpO2lmKGUucihuKSxPYmplY3QuZGVmaW5lUHJvcGVydHkobiwiZGVmYXVsdCIse2VudW1lcmFibGU6ITAsdmFsdWU6dH0pLDImciYmInN0cmluZyIhPXR5cGVvZiB0KWZvcih2YXIgaSBpbiB0KWUuZChuLGksZnVuY3Rpb24ocil7cmV0dXJuIHRbcl19LmJpbmQobnVsbCxpKSk7cmV0dXJuIG59LGUubj1mdW5jdGlvbih0KXt2YXIgcj10JiZ0Ll9fZXNNb2R1bGU/ZnVuY3Rpb24oKXtyZXR1cm4gdC5kZWZhdWx0fTpmdW5jdGlvbigpe3JldHVybiB0fTtyZXR1cm4gZS5kKHIsImEiLHIpLHJ9LGUubz1mdW5jdGlvbih0LHIpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCxyKX0sZS5wPSIiLGUoZS5zPTIpfShbZnVuY3Rpb24odCxyLGUpeyJ1c2Ugc3RyaWN0Ijtjb25zdCBuPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiBuLmNhbGwodCkuZW5kc1dpdGgoIkFycmF5XSIpfX0sZnVuY3Rpb24odCxyLGUpeyJ1c2Ugc3RyaWN0Ijt2YXIgbj10aGlzJiZ0aGlzLl9fdmFsdWVzfHxmdW5jdGlvbih0KXt2YXIgcj0iZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiZ0W1N5bWJvbC5pdGVyYXRvcl0sZT0wO3JldHVybiByP3IuY2FsbCh0KTp7bmV4dDpmdW5jdGlvbigpe3JldHVybiB0JiZlPj10Lmxlbmd0aCYmKHQ9dm9pZCAwKSx7dmFsdWU6dCYmdFtlKytdLGRvbmU6IXR9fX19O2Z1bmN0aW9uIGkodCl7cmV0dXJuIHZvaWQgMD09PXQmJih0PU1hdGgucmFuZG9tKSx0KCl9ZnVuY3Rpb24gbyh0KXtmb3IodmFyIHI9W10sZT0wO2U8dDtlKyspci5wdXNoKHZvaWQgMCk7cmV0dXJuIHJ9ZnVuY3Rpb24gcyh0LHIpe3JldHVybiBvKHQpLm1hcChmdW5jdGlvbigpe3JldHVybiByfSl9ZnVuY3Rpb24gYSh0KXtyZXR1cm4gdC5yZWR1Y2UoZnVuY3Rpb24odCxyKXtyZXR1cm4gdCtyfSl9T2JqZWN0LmRlZmluZVByb3BlcnR5KHIsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHIucmFuZG9tTm9ybWFsMmQ9ZnVuY3Rpb24odCxyLGUsbil7cmV0dXJuIHZvaWQgMD09PXQmJih0PTApLHZvaWQgMD09PXImJihyPTEpLHZvaWQgMD09PWUmJihlPVsxLDFdKSx2b2lkIDA9PT1uJiYobj1NYXRoLnJhbmRvbSksQXJyYXkoZVswXSkuZmlsbCgwKS5tYXAoZnVuY3Rpb24oKXtyZXR1cm4gQXJyYXkoZVsxXSkuZmlsbCgwKS5tYXAoZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24odCxyLGUpe3ZvaWQgMD09PWUmJihlPU1hdGgucmFuZG9tKTt2YXIgbj1pKGUpLG89aShlKTtyZXR1cm4gTWF0aC5zcXJ0KC0yKk1hdGgubG9nKG4pKSpNYXRoLmNvcygyKk1hdGguUEkqbykqcit0fSh0LHIsbil9KX0pfSxyLnRhdVJhbmRJbnQ9ZnVuY3Rpb24odCxyKXtyZXR1cm4gdm9pZCAwPT09ciYmKHI9TWF0aC5yYW5kb20pLE1hdGguZmxvb3IocigpKnQpfSxyLnRhdVJhbmQ9aSxyLm5vcm09ZnVuY3Rpb24odCl7dmFyIHIsZSxpPTA7dHJ5e2Zvcih2YXIgbz1uKHQpLHM9by5uZXh0KCk7IXMuZG9uZTtzPW8ubmV4dCgpKXt2YXIgYT1zLnZhbHVlO2krPU1hdGgucG93KGEsMil9fWNhdGNoKHQpe3I9e2Vycm9yOnR9fWZpbmFsbHl7dHJ5e3MmJiFzLmRvbmUmJihlPW8ucmV0dXJuKSYmZS5jYWxsKG8pfWZpbmFsbHl7aWYocil0aHJvdyByLmVycm9yfX1yZXR1cm4gTWF0aC5zcXJ0KGkpfSxyLmVtcHR5PW8sci5yYW5nZT1mdW5jdGlvbih0KXtyZXR1cm4gbyh0KS5tYXAoZnVuY3Rpb24odCxyKXtyZXR1cm4gcn0pfSxyLmZpbGxlZD1zLHIuemVyb3M9ZnVuY3Rpb24odCl7cmV0dXJuIHModCwwKX0sci5vbmVzPWZ1bmN0aW9uKHQpe3JldHVybiBzKHQsMSl9LHIubGluZWFyPWZ1bmN0aW9uKHQscixlKXtyZXR1cm4gbyhlKS5tYXAoZnVuY3Rpb24obixpKXtyZXR1cm4gdCtpKigoci10KS8oZS0xKSl9KX0sci5zdW09YSxyLm1lYW49ZnVuY3Rpb24odCl7cmV0dXJuIGEodCkvdC5sZW5ndGh9LHIubWF4PWZ1bmN0aW9uKHQpe2Zvcih2YXIgcj0wLGU9MDtlPHQubGVuZ3RoO2UrKylyPXRbZV0+cj90W2VdOnI7cmV0dXJuIHJ9LHIubWF4MmQ9ZnVuY3Rpb24odCl7Zm9yKHZhciByPTAsZT0wO2U8dC5sZW5ndGg7ZSsrKWZvcih2YXIgbj0wO248dFtlXS5sZW5ndGg7bisrKXI9dFtlXVtuXT5yP3RbZV1bbl06cjtyZXR1cm4gcn19LGZ1bmN0aW9uKHQscixlKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHIsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBuPWUoMyk7d2luZG93LlVNQVA9bi5VTUFQfSxmdW5jdGlvbih0LHIsZSl7InVzZSBzdHJpY3QiO3ZhciBuPXRoaXMmJnRoaXMuX19hd2FpdGVyfHxmdW5jdGlvbih0LHIsZSxuKXtyZXR1cm4gbmV3KGV8fChlPVByb21pc2UpKShmdW5jdGlvbihpLG8pe2Z1bmN0aW9uIHModCl7dHJ5e2gobi5uZXh0KHQpKX1jYXRjaCh0KXtvKHQpfX1mdW5jdGlvbiBhKHQpe3RyeXtoKG4udGhyb3codCkpfWNhdGNoKHQpe28odCl9fWZ1bmN0aW9uIGgodCl7dC5kb25lP2kodC52YWx1ZSk6bmV3IGUoZnVuY3Rpb24ocil7cih0LnZhbHVlKX0pLnRoZW4ocyxhKX1oKChuPW4uYXBwbHkodCxyfHxbXSkpLm5leHQoKSl9KX0saT10aGlzJiZ0aGlzLl9fZ2VuZXJhdG9yfHxmdW5jdGlvbih0LHIpe3ZhciBlLG4saSxvLHM9e2xhYmVsOjAsc2VudDpmdW5jdGlvbigpe2lmKDEmaVswXSl0aHJvdyBpWzFdO3JldHVybiBpWzFdfSx0cnlzOltdLG9wczpbXX07cmV0dXJuIG89e25leHQ6YSgwKSx0aHJvdzphKDEpLHJldHVybjphKDIpfSwiZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiYob1tTeW1ib2wuaXRlcmF0b3JdPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9KSxvO2Z1bmN0aW9uIGEobyl7cmV0dXJuIGZ1bmN0aW9uKGEpe3JldHVybiBmdW5jdGlvbihvKXtpZihlKXRocm93IG5ldyBUeXBlRXJyb3IoIkdlbmVyYXRvciBpcyBhbHJlYWR5IGV4ZWN1dGluZy4iKTtmb3IoO3M7KXRyeXtpZihlPTEsbiYmKGk9MiZvWzBdP24ucmV0dXJuOm9bMF0/bi50aHJvd3x8KChpPW4ucmV0dXJuKSYmaS5jYWxsKG4pLDApOm4ubmV4dCkmJiEoaT1pLmNhbGwobixvWzFdKSkuZG9uZSlyZXR1cm4gaTtzd2l0Y2gobj0wLGkmJihvPVsyJm9bMF0saS52YWx1ZV0pLG9bMF0pe2Nhc2UgMDpjYXNlIDE6aT1vO2JyZWFrO2Nhc2UgNDpyZXR1cm4gcy5sYWJlbCsrLHt2YWx1ZTpvWzFdLGRvbmU6ITF9O2Nhc2UgNTpzLmxhYmVsKyssbj1vWzFdLG89WzBdO2NvbnRpbnVlO2Nhc2UgNzpvPXMub3BzLnBvcCgpLHMudHJ5cy5wb3AoKTtjb250aW51ZTtkZWZhdWx0OmlmKCEoaT0oaT1zLnRyeXMpLmxlbmd0aD4wJiZpW2kubGVuZ3RoLTFdKSYmKDY9PT1vWzBdfHwyPT09b1swXSkpe3M9MDtjb250aW51ZX1pZigzPT09b1swXSYmKCFpfHxvWzFdPmlbMF0mJm9bMV08aVszXSkpe3MubGFiZWw9b1sxXTticmVha31pZig2PT09b1swXSYmcy5sYWJlbDxpWzFdKXtzLmxhYmVsPWlbMV0saT1vO2JyZWFrfWlmKGkmJnMubGFiZWw8aVsyXSl7cy5sYWJlbD1pWzJdLHMub3BzLnB1c2gobyk7YnJlYWt9aVsyXSYmcy5vcHMucG9wKCkscy50cnlzLnBvcCgpO2NvbnRpbnVlfW89ci5jYWxsKHQscyl9Y2F0Y2godCl7bz1bNix0XSxuPTB9ZmluYWxseXtlPWk9MH1pZig1Jm9bMF0pdGhyb3cgb1sxXTtyZXR1cm57dmFsdWU6b1swXT9vWzFdOnZvaWQgMCxkb25lOiEwfX0oW28sYV0pfX19LG89dGhpcyYmdGhpcy5fX3JlYWR8fGZ1bmN0aW9uKHQscil7dmFyIGU9ImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmdFtTeW1ib2wuaXRlcmF0b3JdO2lmKCFlKXJldHVybiB0O3ZhciBuLGksbz1lLmNhbGwodCkscz1bXTt0cnl7Zm9yKDsodm9pZCAwPT09cnx8ci0tID4wKSYmIShuPW8ubmV4dCgpKS5kb25lOylzLnB1c2gobi52YWx1ZSl9Y2F0Y2godCl7aT17ZXJyb3I6dH19ZmluYWxseXt0cnl7biYmIW4uZG9uZSYmKGU9by5yZXR1cm4pJiZlLmNhbGwobyl9ZmluYWxseXtpZihpKXRocm93IGkuZXJyb3J9fXJldHVybiBzfSxzPXRoaXMmJnRoaXMuX19zcHJlYWR8fGZ1bmN0aW9uKCl7Zm9yKHZhciB0PVtdLHI9MDtyPGFyZ3VtZW50cy5sZW5ndGg7cisrKXQ9dC5jb25jYXQobyhhcmd1bWVudHNbcl0pKTtyZXR1cm4gdH07T2JqZWN0LmRlZmluZVByb3BlcnR5KHIsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBhPWUoNCksaD1lKDUpLHU9ZSg3KSxsPWUoMSksZj1lKDgpLGM9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3ZvaWQgMD09PXQmJih0PXt9KSx0aGlzLm1pbkRpc3Q9LjEsdGhpcy5uQ29tcG9uZW50cz0yLHRoaXMubkVwb2Nocz0wLHRoaXMubk5laWdoYm9ycz0xNSx0aGlzLnJhbmRvbT1NYXRoLnJhbmRvbSx0aGlzLnNwcmVhZD0xLHRoaXMudGFyZ2V0TWV0cmljPSJjYXRlZ29yaWNhbCIsdGhpcy50YXJnZXRXZWlnaHQ9LjUsdGhpcy50YXJnZXROTmVpZ2hib3JzPXRoaXMubk5laWdoYm9ycyx0aGlzLmRpc3RhbmNlRm49bSx0aGlzLmlzSW5pdGlhbGl6ZWQ9ITEsdGhpcy5lbWJlZGRpbmc9W10sdGhpcy5vcHRpbWl6YXRpb25TdGF0ZT1uZXcgZyx0aGlzLm1pbkRpc3Q9dC5taW5EaXN0fHx0aGlzLm1pbkRpc3QsdGhpcy5uQ29tcG9uZW50cz10Lm5Db21wb25lbnRzfHx0aGlzLm5Db21wb25lbnRzLHRoaXMubkVwb2Nocz10Lm5FcG9jaHN8fHRoaXMubkVwb2Nocyx0aGlzLm5OZWlnaGJvcnM9dC5uTmVpZ2hib3JzfHx0aGlzLm5OZWlnaGJvcnMsdGhpcy5yYW5kb209dC5yYW5kb218fHRoaXMucmFuZG9tLHRoaXMuc3ByZWFkPXQuc3ByZWFkfHx0aGlzLnNwcmVhZH1yZXR1cm4gdC5wcm90b3R5cGUuZml0PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmluaXRpYWxpemVGaXQodCksdGhpcy5vcHRpbWl6ZUxheW91dCgpLHRoaXMuZW1iZWRkaW5nfSx0LnByb3RvdHlwZS5maXRBc3luYz1mdW5jdGlvbih0LHIpe3JldHVybiB2b2lkIDA9PT1yJiYocj1mdW5jdGlvbigpe3JldHVybiEwfSksbih0aGlzLHZvaWQgMCx2b2lkIDAsZnVuY3Rpb24oKXtyZXR1cm4gaSh0aGlzLGZ1bmN0aW9uKGUpe3N3aXRjaChlLmxhYmVsKXtjYXNlIDA6cmV0dXJuIHRoaXMuaW5pdGlhbGl6ZUZpdCh0KSxbNCx0aGlzLm9wdGltaXplTGF5b3V0KHIpXTtjYXNlIDE6cmV0dXJuIGUuc2VudCgpLFsyLHRoaXMuZW1iZWRkaW5nXX19KX0pfSx0LnByb3RvdHlwZS5zZXRTdXBlcnZpc2VkUHJvamVjdGlvbj1mdW5jdGlvbih0LHIpe3ZvaWQgMD09PXImJihyPXt9KSx0aGlzLlk9dCx0aGlzLnRhcmdldE1ldHJpYz1yLnRhcmdldE1ldHJpY3x8dGhpcy50YXJnZXRNZXRyaWMsdGhpcy50YXJnZXRXZWlnaHQ9ci50YXJnZXRXZWlnaHR8fHRoaXMudGFyZ2V0V2VpZ2h0LHRoaXMudGFyZ2V0Tk5laWdoYm9ycz1yLnRhcmdldE5OZWlnaGJvcnN8fHRoaXMudGFyZ2V0Tk5laWdoYm9yc30sdC5wcm90b3R5cGUuc2V0UHJlY29tcHV0ZWRLTk49ZnVuY3Rpb24odCxyKXt0aGlzLmtubkluZGljZXM9dCx0aGlzLmtubkRpc3RhbmNlcz1yfSx0LnByb3RvdHlwZS5pbml0aWFsaXplRml0PWZ1bmN0aW9uKHQpe2lmKHRoaXMuWD09PXQmJnRoaXMuaXNJbml0aWFsaXplZClyZXR1cm4gdGhpcy5nZXRORXBvY2hzKCk7aWYodGhpcy5YPXQsIXRoaXMua25uSW5kaWNlcyYmIXRoaXMua25uRGlzdGFuY2VzKXt2YXIgcj10aGlzLm5lYXJlc3ROZWlnaGJvcnModCk7dGhpcy5rbm5JbmRpY2VzPXIua25uSW5kaWNlcyx0aGlzLmtubkRpc3RhbmNlcz1yLmtubkRpc3RhbmNlc310aGlzLmdyYXBoPXRoaXMuZnV6enlTaW1wbGljaWFsU2V0KHQsdGhpcy5uTmVpZ2hib3JzKSx0aGlzLnByb2Nlc3NHcmFwaEZvclN1cGVydmlzZWRQcm9qZWN0aW9uKCk7dmFyIGU9dGhpcy5pbml0aWFsaXplU2ltcGxpY2lhbFNldEVtYmVkZGluZygpLG49ZS5oZWFkLGk9ZS50YWlsLG89ZS5lcG9jaHNQZXJTYW1wbGU7cmV0dXJuIHRoaXMub3B0aW1pemF0aW9uU3RhdGUuaGVhZD1uLHRoaXMub3B0aW1pemF0aW9uU3RhdGUudGFpbD1pLHRoaXMub3B0aW1pemF0aW9uU3RhdGUuZXBvY2hzUGVyU2FtcGxlPW8sdGhpcy5pc0luaXRpYWxpemVkPSEwLHRoaXMuZ2V0TkVwb2NocygpfSx0LnByb3RvdHlwZS5wcm9jZXNzR3JhcGhGb3JTdXBlcnZpc2VkUHJvamVjdGlvbj1mdW5jdGlvbigpe3ZhciB0PXRoaXMuWSxyPXRoaXMuWDtpZih0KXtpZih0Lmxlbmd0aCE9PXIubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiTGVuZ3RoIG9mIFggYW5kIHkgbXVzdCBiZSBlcXVhbCIpO2lmKCJjYXRlZ29yaWNhbCI9PT10aGlzLnRhcmdldE1ldHJpYyl7dmFyIGU9dGhpcy50YXJnZXRXZWlnaHQ8MT8xLygxLXRoaXMudGFyZ2V0V2VpZ2h0KSoyLjU6MWUxMjt0aGlzLmdyYXBoPXRoaXMuY2F0ZWdvcmljYWxTaW1wbGljaWFsU2V0SW50ZXJzZWN0aW9uKHRoaXMuZ3JhcGgsdCxlKX19fSx0LnByb3RvdHlwZS5zdGVwPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5vcHRpbWl6YXRpb25TdGF0ZSxyPXQuY3VycmVudEVwb2NoO3JldHVybiB0LmlzSW5pdGlhbGl6ZWR8fHRoaXMuaW5pdGlhbGl6ZU9wdGltaXphdGlvbigpLHI8dGhpcy5nZXRORXBvY2hzKCkmJnRoaXMub3B0aW1pemVMYXlvdXRTdGVwKHIpLHRoaXMub3B0aW1pemF0aW9uU3RhdGUuY3VycmVudEVwb2NofSx0LnByb3RvdHlwZS5nZXRFbWJlZGRpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lbWJlZGRpbmd9LHQucHJvdG90eXBlLm5lYXJlc3ROZWlnaGJvcnM9ZnVuY3Rpb24odCl7dmFyIHIsZT10aGlzLmRpc3RhbmNlRm4sbj10aGlzLm5OZWlnaGJvcnMsaT1oLm1ha2VOTkRlc2NlbnQoZSx0aGlzLnJhbmRvbSksbz01K01hdGguZmxvb3IoLjU9PT0ocj1NYXRoLnBvdyh0Lmxlbmd0aCwuNSkvMjApPzA6TWF0aC5yb3VuZChyKSkscz1NYXRoLm1heCg1LE1hdGguZmxvb3IoTWF0aC5yb3VuZChmdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5sb2codCkvTWF0aC5sb2coMil9KHQubGVuZ3RoKSkpKSxhPXUubWFrZUZvcmVzdCh0LG4sbyx0aGlzLnJhbmRvbSksbD1pKHQsdS5tYWtlTGVhZkFycmF5KGEpLG4scyk7cmV0dXJue2tubkluZGljZXM6bC5pbmRpY2VzLGtubkRpc3RhbmNlczpsLndlaWdodHN9fSx0LnByb3RvdHlwZS5mdXp6eVNpbXBsaWNpYWxTZXQ9ZnVuY3Rpb24odCxyLGUsbil7dm9pZCAwPT09ZSYmKGU9MSksdm9pZCAwPT09biYmKG49MSk7dmFyIGk9dGhpcy5rbm5JbmRpY2VzLG89dm9pZCAwPT09aT9bXTppLHM9dGhpcy5rbm5EaXN0YW5jZXMsaD12b2lkIDA9PT1zP1tdOnMsdT10aGlzLnNtb290aEtOTkRpc3RhbmNlKGgscixlKSxsPXUuc2lnbWFzLGY9dS5yaG9zLGM9dGhpcy5jb21wdXRlTWVtYmVyc2hpcFN0cmVuZ3RocyhvLGgsbCxmKSxtPWMucm93cyxnPWMuY29scyx2PWMudmFscyxwPVt0Lmxlbmd0aCx0Lmxlbmd0aF0sdz1uZXcgYS5TcGFyc2VNYXRyaXgobSxnLHYscCksZD1hLnRyYW5zcG9zZSh3KSx5PWEucGFpcndpc2VNdWx0aXBseSh3LGQpLGI9YS5zdWJ0cmFjdChhLmFkZCh3LGQpLHkpLE09YS5tdWx0aXBseVNjYWxhcihiLG4pLHg9YS5tdWx0aXBseVNjYWxhcih5LDEtbik7cmV0dXJuIGEuYWRkKE0seCl9LHQucHJvdG90eXBlLmNhdGVnb3JpY2FsU2ltcGxpY2lhbFNldEludGVyc2VjdGlvbj1mdW5jdGlvbih0LHIsZSxuKXt2b2lkIDA9PT1uJiYobj0xKTt2YXIgaT1kKHQscixuLGUpO3JldHVybiB5KGk9YS5lbGltaW5hdGVaZXJvcyhpKSl9LHQucHJvdG90eXBlLnNtb290aEtOTkRpc3RhbmNlPWZ1bmN0aW9uKHQscixlLG4saSl7dm9pZCAwPT09ZSYmKGU9MSksdm9pZCAwPT09biYmKG49NjQpLHZvaWQgMD09PWkmJihpPTEpO2Zvcih2YXIgbz1NYXRoLmxvZyhyKS9NYXRoLmxvZygyKSppLHM9bC56ZXJvcyh0Lmxlbmd0aCksYT1sLnplcm9zKHQubGVuZ3RoKSxoPTA7aDx0Lmxlbmd0aDtoKyspe3ZhciB1PTAsZj0xLzAsYz0xLG09dFtoXSxnPW0uZmlsdGVyKGZ1bmN0aW9uKHQpe3JldHVybiB0PjB9KTtpZihnLmxlbmd0aD49ZSl7dmFyIHY9TWF0aC5mbG9vcihlKSxwPWUtdjt2PjA/KHNbaF09Z1t2LTFdLHA+MWUtNSYmKHNbaF0rPXAqKGdbdl0tZ1t2LTFdKSkpOnNbaF09cCpnWzBdfWVsc2UgZy5sZW5ndGg+MCYmKHNbaF09bC5tYXgoZykpO2Zvcih2YXIgdz0wO3c8bjt3Kyspe2Zvcih2YXIgZD0wLHk9MTt5PHRbaF0ubGVuZ3RoO3krKyl7dmFyIGI9dFtoXVt5XS1zW2hdO2QrPWI+MD9NYXRoLmV4cCgtYi9jKToxfWlmKE1hdGguYWJzKGQtbyk8MWUtNSlicmVhaztkPm8/Yz0odSsoZj1jKSkvMjoodT1jLGY9PT0xLzA/Yyo9MjpjPSh1K2YpLzIpfWlmKGFbaF09YyxzW2hdPjApe3ZhciBNPWwubWVhbihtKTthW2hdPC4wMDEqTSYmKGFbaF09LjAwMSpNKX1lbHNle3ZhciB4PWwubWVhbih0Lm1hcChsLm1lYW4pKTthW2hdPC4wMDEqeCYmKGFbaF09LjAwMSp4KX19cmV0dXJue3NpZ21hczphLHJob3M6c319LHQucHJvdG90eXBlLmNvbXB1dGVNZW1iZXJzaGlwU3RyZW5ndGhzPWZ1bmN0aW9uKHQscixlLG4pe2Zvcih2YXIgaT10Lmxlbmd0aCxvPXRbMF0ubGVuZ3RoLHM9bC56ZXJvcyhpKm8pLGE9bC56ZXJvcyhpKm8pLGg9bC56ZXJvcyhpKm8pLHU9MDt1PGk7dSsrKWZvcih2YXIgZj0wO2Y8bztmKyspe3ZhciBjPTA7LTEhPT10W3VdW2ZdJiYoYz10W3VdW2ZdPT09dT8wOnJbdV1bZl0tblt1XTw9MD8xOk1hdGguZXhwKC0oclt1XVtmXS1uW3VdKS9lW3VdKSxzW3UqbytmXT11LGFbdSpvK2ZdPXRbdV1bZl0saFt1Km8rZl09Yyl9cmV0dXJue3Jvd3M6cyxjb2xzOmEsdmFsczpofX0sdC5wcm90b3R5cGUuaW5pdGlhbGl6ZVNpbXBsaWNpYWxTZXRFbWJlZGRpbmc9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcyxyPXRoaXMuZ2V0TkVwb2NocygpLGU9dGhpcy5uQ29tcG9uZW50cyxuPXRoaXMuZ3JhcGguZ2V0VmFsdWVzKCksaT0wLG89MDtvPG4ubGVuZ3RoO28rKyl7dmFyIHM9bltvXTtpPG5bb10mJihpPXMpfXZhciBhPXRoaXMuZ3JhcGgubWFwKGZ1bmN0aW9uKHQpe3JldHVybiB0PGkvcj8wOnR9KTt0aGlzLmVtYmVkZGluZz1sLnplcm9zKGEublJvd3MpLm1hcChmdW5jdGlvbigpe3JldHVybiBsLnplcm9zKGUpLm1hcChmdW5jdGlvbigpe3JldHVybiAyMCpsLnRhdVJhbmQodC5yYW5kb20pLTEwfSl9KTt2YXIgaD1bXSx1PVtdLGY9W107Zm9yKG89MDtvPGEublJvd3M7bysrKWZvcih2YXIgYz0wO2M8YS5uQ29scztjKyspeyhzPWEuZ2V0KG8sYykpJiYoaC5wdXNoKHMpLGYucHVzaChvKSx1LnB1c2goYykpfXJldHVybntoZWFkOnUsdGFpbDpmLGVwb2Noc1BlclNhbXBsZTp0aGlzLm1ha2VFcG9jaHNQZXJTYW1wbGUoaCxyKX19LHQucHJvdG90eXBlLm1ha2VFcG9jaHNQZXJTYW1wbGU9ZnVuY3Rpb24odCxyKXt2YXIgZT1sLmZpbGxlZCh0Lmxlbmd0aCwtMSksbj1sLm1heCh0KSxpPXQubWFwKGZ1bmN0aW9uKHQpe3JldHVybiB0L24qcn0pO3JldHVybiBpLmZvckVhY2goZnVuY3Rpb24odCxuKXt0PjAmJihlW25dPXIvaVtuXSl9KSxlfSx0LnByb3RvdHlwZS5pbml0aWFsaXplT3B0aW1pemF0aW9uPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5lbWJlZGRpbmcscj10aGlzLmVtYmVkZGluZyxlPXRoaXMub3B0aW1pemF0aW9uU3RhdGUsbj1lLmhlYWQsaT1lLnRhaWwsbz1lLmVwb2Noc1BlclNhbXBsZSxhPXRoaXMuZ2V0TkVwb2NocygpLGg9dGhpcy5ncmFwaC5uQ29scyx1PXcodGhpcy5zcHJlYWQsdGhpcy5taW5EaXN0KSxsPXUuYSxmPXUuYixjPXRbMF0ubGVuZ3RoLG09dC5sZW5ndGg9PT1yLmxlbmd0aCxnPW8ubWFwKGZ1bmN0aW9uKHQpe3JldHVybiB0LzV9KSx2PXMoZykscD1zKG8pO09iamVjdC5hc3NpZ24odGhpcy5vcHRpbWl6YXRpb25TdGF0ZSx7aXNJbml0aWFsaXplZDohMCxoZWFkRW1iZWRkaW5nOnQsdGFpbEVtYmVkZGluZzpyLGhlYWQ6bix0YWlsOmksZXBvY2hzUGVyU2FtcGxlOm8sZXBvY2hPZk5leHRTYW1wbGU6cCxlcG9jaE9mTmV4dE5lZ2F0aXZlU2FtcGxlOnYsZXBvY2hzUGVyTmVnYXRpdmVTYW1wbGU6Zyxtb3ZlT3RoZXI6bSxpbml0aWFsQWxwaGE6MSxhbHBoYToxLGdhbW1hOjEsYTpsLGI6ZixkaW06YyxuRXBvY2hzOmEsblZlcnRpY2VzOmh9KX0sdC5wcm90b3R5cGUub3B0aW1pemVMYXlvdXRTdGVwPWZ1bmN0aW9uKHQpe2Zvcih2YXIgcj10aGlzLm9wdGltaXphdGlvblN0YXRlLGU9ci5oZWFkLG49ci50YWlsLGk9ci5oZWFkRW1iZWRkaW5nLG89ci50YWlsRW1iZWRkaW5nLHM9ci5lcG9jaHNQZXJTYW1wbGUsYT1yLmVwb2NoT2ZOZXh0U2FtcGxlLGg9ci5lcG9jaE9mTmV4dE5lZ2F0aXZlU2FtcGxlLHU9ci5lcG9jaHNQZXJOZWdhdGl2ZVNhbXBsZSxmPXIubW92ZU90aGVyLGM9ci5pbml0aWFsQWxwaGEsbT1yLmFscGhhLGc9ci5nYW1tYSx3PXIuYSxkPXIuYix5PXIuZGltLGI9ci5uRXBvY2hzLE09ci5uVmVydGljZXMseD0wO3g8cy5sZW5ndGg7eCsrKWlmKCEoYVt4XT50KSl7dmFyIFM9ZVt4XSxFPW5beF0sUj1pW1NdLGs9b1tFXSxBPXAoUixrKSxOPTA7QT4wJiYoTj0tMip3KmQqTWF0aC5wb3coQSxkLTEpLE4vPXcqTWF0aC5wb3coQSxkKSsxKTtmb3IodmFyIFY9MDtWPHk7VisrKXt2YXIgej12KE4qKFJbVl0ta1tWXSksNCk7UltWXSs9eiptLGYmJihrW1ZdKz0teiptKX1hW3hdKz1zW3hdO2Zvcih2YXIgQz1NYXRoLmZsb29yKCh0LWhbeF0pL3VbeF0pLEk9MDtJPEM7SSsrKXt2YXIgaj1sLnRhdVJhbmRJbnQoTSx0aGlzLnJhbmRvbSksUD1vW2pdLEQ9cChSLFApLF89MDtpZihEPjApXz0yKmcqZCxfLz0oLjAwMStEKSoodypNYXRoLnBvdyhELGQpKzEpO2Vsc2UgaWYoUz09PWopY29udGludWU7Zm9yKFY9MDtWPHk7VisrKXt6PTQ7Xz4wJiYoej12KF8qKFJbVl0tUFtWXSksNCkpLFJbVl0rPXoqbX19aFt4XSs9Qyp1W3hdfXJldHVybiByLmFscGhhPWMqKDEtdC9iKSxyLmN1cnJlbnRFcG9jaCs9MSx0aGlzLmVtYmVkZGluZz1pLHIuY3VycmVudEVwb2NofSx0LnByb3RvdHlwZS5vcHRpbWl6ZUxheW91dD1mdW5jdGlvbih0KXt2YXIgcj10aGlzO3JldHVybiB2b2lkIDA9PT10JiYodD1mdW5jdGlvbigpe3JldHVybiEwfSksdGhpcy5vcHRpbWl6YXRpb25TdGF0ZS5pc0luaXRpYWxpemVkfHx0aGlzLmluaXRpYWxpemVPcHRpbWl6YXRpb24oKSxuZXcgUHJvbWlzZShmdW5jdGlvbihlLG8pe3ZhciBzPWZ1bmN0aW9uKCl7cmV0dXJuIG4ocix2b2lkIDAsdm9pZCAwLGZ1bmN0aW9uKCl7dmFyIHIsbixhLGgsdSxsO3JldHVybiBpKHRoaXMsZnVuY3Rpb24oaSl7dHJ5e2lmKHI9dGhpcy5vcHRpbWl6YXRpb25TdGF0ZSxuPXIubkVwb2NocyxhPXIuY3VycmVudEVwb2NoLGg9dGhpcy5vcHRpbWl6ZUxheW91dFN0ZXAoYSksdT0hMT09PXQoaCksbD1oPT09bix1fHxsKXJldHVyblsyLGUobCldO3MoKX1jYXRjaCh0KXtvKHQpfXJldHVyblsyXX0pfSl9O3MoKX0pfSx0LnByb3RvdHlwZS5nZXRORXBvY2hzPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5ncmFwaDtpZih0aGlzLm5FcG9jaHM+MClyZXR1cm4gdGhpcy5uRXBvY2hzO3ZhciByPXQublJvd3M7cmV0dXJuIHI8PTI1MDA/NTAwOnI8PTVlMz80MDA6cjw9NzUwMD8zMDA6MjAwfSx0fSgpO2Z1bmN0aW9uIG0odCxyKXtmb3IodmFyIGU9MCxuPTA7bjx0Lmxlbmd0aDtuKyspZSs9TWF0aC5wb3codFtuXS1yW25dLDIpO3JldHVybiBNYXRoLnNxcnQoZSl9ci5VTUFQPWMsci5ldWNsaWRlYW49bSxyLmNvc2luZT1mdW5jdGlvbih0LHIpe2Zvcih2YXIgZT0wLG49MCxpPTAsbz0wO288dC5sZW5ndGg7bysrKWUrPXRbb10qcltvXSxuKz1NYXRoLnBvdyh0W29dLDIpLGkrPU1hdGgucG93KHJbb10sMik7cmV0dXJuIDA9PT1uJiYwPT09aT8wOjA9PT1ufHwwPT09aT8xOjEtZS9NYXRoLnNxcnQobippKX07dmFyIGc9ZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLmN1cnJlbnRFcG9jaD0wLHRoaXMuaXNJbml0aWFsaXplZD0hMSx0aGlzLmhlYWRFbWJlZGRpbmc9W10sdGhpcy50YWlsRW1iZWRkaW5nPVtdLHRoaXMuaGVhZD1bXSx0aGlzLnRhaWw9W10sdGhpcy5lcG9jaHNQZXJTYW1wbGU9W10sdGhpcy5lcG9jaE9mTmV4dFNhbXBsZT1bXSx0aGlzLmVwb2NoT2ZOZXh0TmVnYXRpdmVTYW1wbGU9W10sdGhpcy5lcG9jaHNQZXJOZWdhdGl2ZVNhbXBsZT1bXSx0aGlzLm1vdmVPdGhlcj0hMCx0aGlzLmluaXRpYWxBbHBoYT0xLHRoaXMuYWxwaGE9MSx0aGlzLmdhbW1hPTEsdGhpcy5hPTEuNTc2OTQzNDYwMzExMzA3Nyx0aGlzLmI9Ljg5NTA2MDg3NzkxMDk3MzMsdGhpcy5kaW09Mix0aGlzLm5FcG9jaHM9NTAwLHRoaXMublZlcnRpY2VzPTB9fSgpO2Z1bmN0aW9uIHYodCxyKXtyZXR1cm4gdD5yP3I6dDwtcj8tcjp0fWZ1bmN0aW9uIHAodCxyKXtmb3IodmFyIGU9MCxuPTA7bjx0Lmxlbmd0aDtuKyspZSs9TWF0aC5wb3codFtuXS1yW25dLDIpO3JldHVybiBlfWZ1bmN0aW9uIHcodCxyKXt2YXIgZT1sLmxpbmVhcigwLDMqdCwzMDApLm1hcChmdW5jdGlvbih0KXtyZXR1cm4gdDxyPzE6dH0pLG49bC56ZXJvcyhlLmxlbmd0aCkubWFwKGZ1bmN0aW9uKG4saSl7cmV0dXJuIGVbaV0+PXI/TWF0aC5leHAoLShlW2ldLXIpL3QpOm59KSxpPWYoe3g6ZSx5Om59LGZ1bmN0aW9uKHQpe3ZhciByPW8odCwyKSxlPXJbMF0sbj1yWzFdO3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gMS8oMStlKk1hdGgucG93KHQsMipuKSl9fSx7ZGFtcGluZzoxLjUsaW5pdGlhbFZhbHVlczpbLjUsLjVdLGdyYWRpZW50RGlmZmVyZW5jZTouMSxtYXhJdGVyYXRpb25zOjEwMCxlcnJvclRvbGVyYW5jZTouMDF9KS5wYXJhbWV0ZXJWYWx1ZXMscz1vKGksMik7cmV0dXJue2E6c1swXSxiOnNbMV19fWZ1bmN0aW9uIGQodCxyLGUsbil7cmV0dXJuIHZvaWQgMD09PWUmJihlPTEpLHZvaWQgMD09PW4mJihuPTUpLHQubWFwKGZ1bmN0aW9uKHQsaSxvKXtyZXR1cm4tMT09PXJbaV18fC0xPT09cltvXT90Kk1hdGguZXhwKC1lKTpyW2ldIT09cltvXT90Kk1hdGguZXhwKC1uKTp0fSl9ZnVuY3Rpb24geSh0KXt0PWEubm9ybWFsaXplKHQsIm1heCIpO3ZhciByPWEudHJhbnNwb3NlKHQpLGU9YS5wYWlyd2lzZU11bHRpcGx5KHIsdCk7cmV0dXJuIHQ9YS5hZGQodCxhLnN1YnRyYWN0KHIsZSkpLGEuZWxpbWluYXRlWmVyb3ModCl9ci5maW5kQUJQYXJhbXM9dyxyLmZhc3RJbnRlcnNlY3Rpb249ZCxyLnJlc2V0TG9jYWxDb25uZWN0aXZpdHk9eX0sZnVuY3Rpb24odCxyLGUpeyJ1c2Ugc3RyaWN0Ijt2YXIgbixpPXRoaXMmJnRoaXMuX19yZWFkfHxmdW5jdGlvbih0LHIpe3ZhciBlPSJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJnRbU3ltYm9sLml0ZXJhdG9yXTtpZighZSlyZXR1cm4gdDt2YXIgbixpLG89ZS5jYWxsKHQpLHM9W107dHJ5e2Zvcig7KHZvaWQgMD09PXJ8fHItLSA+MCkmJiEobj1vLm5leHQoKSkuZG9uZTspcy5wdXNoKG4udmFsdWUpfWNhdGNoKHQpe2k9e2Vycm9yOnR9fWZpbmFsbHl7dHJ5e24mJiFuLmRvbmUmJihlPW8ucmV0dXJuKSYmZS5jYWxsKG8pfWZpbmFsbHl7aWYoaSl0aHJvdyBpLmVycm9yfX1yZXR1cm4gc30sbz10aGlzJiZ0aGlzLl9fc3ByZWFkfHxmdW5jdGlvbigpe2Zvcih2YXIgdD1bXSxyPTA7cjxhcmd1bWVudHMubGVuZ3RoO3IrKyl0PXQuY29uY2F0KGkoYXJndW1lbnRzW3JdKSk7cmV0dXJuIHR9LHM9dGhpcyYmdGhpcy5fX3ZhbHVlc3x8ZnVuY3Rpb24odCl7dmFyIHI9ImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmdFtTeW1ib2wuaXRlcmF0b3JdLGU9MDtyZXR1cm4gcj9yLmNhbGwodCk6e25leHQ6ZnVuY3Rpb24oKXtyZXR1cm4gdCYmZT49dC5sZW5ndGgmJih0PXZvaWQgMCkse3ZhbHVlOnQmJnRbZSsrXSxkb25lOiF0fX19fTtPYmplY3QuZGVmaW5lUHJvcGVydHkociwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIGE9ZSgxKSxoPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LHIsZSxuKXt0aGlzLmVudHJpZXM9bmV3IE1hcCx0aGlzLm5Sb3dzPTAsdGhpcy5uQ29scz0wLHRoaXMucm93cz1vKHQpLHRoaXMuY29scz1vKHIpLHRoaXMudmFsdWVzPW8oZSk7Zm9yKHZhciBpPTA7aTxlLmxlbmd0aDtpKyspe3ZhciBzPXRoaXMubWFrZUtleSh0aGlzLnJvd3NbaV0sdGhpcy5jb2xzW2ldKTt0aGlzLmVudHJpZXMuc2V0KHMsaSl9dGhpcy5uUm93cz1uWzBdLHRoaXMubkNvbHM9blswXX1yZXR1cm4gdC5wcm90b3R5cGUubWFrZUtleT1mdW5jdGlvbih0LHIpe3JldHVybiB0KyI6IityfSx0LnByb3RvdHlwZS5jaGVja0RpbXM9ZnVuY3Rpb24odCxyKXtpZighKHQ8dGhpcy5uUm93cyYmcjx0aGlzLm5Db2xzKSl0aHJvdyBuZXcgRXJyb3IoImFycmF5IGluZGV4IG91dCBvZiBib3VuZHMiKX0sdC5wcm90b3R5cGUuc2V0PWZ1bmN0aW9uKHQscixlKXt0aGlzLmNoZWNrRGltcyh0LHIpO3ZhciBuPXRoaXMubWFrZUtleSh0LHIpO2lmKHRoaXMuZW50cmllcy5oYXMobikpe3ZhciBpPXRoaXMuZW50cmllcy5nZXQobik7dGhpcy52YWx1ZXNbaV09ZX1lbHNlIHRoaXMucm93cy5wdXNoKHQpLHRoaXMuY29scy5wdXNoKHIpLHRoaXMudmFsdWVzLnB1c2goZSksdGhpcy5lbnRyaWVzLnNldChuLHRoaXMudmFsdWVzLmxlbmd0aC0xKX0sdC5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKHQscixlKXt2b2lkIDA9PT1lJiYoZT0wKSx0aGlzLmNoZWNrRGltcyh0LHIpO3ZhciBuPXRoaXMubWFrZUtleSh0LHIpO2lmKHRoaXMuZW50cmllcy5oYXMobikpe3ZhciBpPXRoaXMuZW50cmllcy5nZXQobik7cmV0dXJuIHRoaXMudmFsdWVzW2ldfXJldHVybiBlfSx0LnByb3RvdHlwZS5nZXREaW1zPWZ1bmN0aW9uKCl7cmV0dXJuW3RoaXMublJvd3MsdGhpcy5uQ29sc119LHQucHJvdG90eXBlLmdldFJvd3M9ZnVuY3Rpb24oKXtyZXR1cm4gbyh0aGlzLnJvd3MpfSx0LnByb3RvdHlwZS5nZXRDb2xzPWZ1bmN0aW9uKCl7cmV0dXJuIG8odGhpcy5jb2xzKX0sdC5wcm90b3R5cGUuZ2V0VmFsdWVzPWZ1bmN0aW9uKCl7cmV0dXJuIG8odGhpcy52YWx1ZXMpfSx0LnByb3RvdHlwZS5mb3JFYWNoPWZ1bmN0aW9uKHQpe2Zvcih2YXIgcj0wO3I8dGhpcy52YWx1ZXMubGVuZ3RoO3IrKyl0KHRoaXMudmFsdWVzW3JdLHRoaXMucm93c1tyXSx0aGlzLmNvbHNbcl0pfSx0LnByb3RvdHlwZS5tYXA9ZnVuY3Rpb24ocil7Zm9yKHZhciBlPVtdLG49MDtuPHRoaXMudmFsdWVzLmxlbmd0aDtuKyspZS5wdXNoKHIodGhpcy52YWx1ZXNbbl0sdGhpcy5yb3dzW25dLHRoaXMuY29sc1tuXSkpO3ZhciBpPVt0aGlzLm5Sb3dzLHRoaXMubkNvbHNdO3JldHVybiBuZXcgdCh0aGlzLnJvd3MsdGhpcy5jb2xzLGUsaSl9LHQucHJvdG90eXBlLnRvQXJyYXk9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcyxyPWEuZW1wdHkodGhpcy5uUm93cykubWFwKGZ1bmN0aW9uKCl7cmV0dXJuIGEuemVyb3ModC5uQ29scyl9KSxlPTA7ZTx0aGlzLnZhbHVlcy5sZW5ndGg7ZSsrKXJbdGhpcy5yb3dzW2VdXVt0aGlzLmNvbHNbZV1dPXRoaXMudmFsdWVzW2VdO3JldHVybiByfSx0fSgpO3IuU3BhcnNlTWF0cml4PWgsci50cmFuc3Bvc2U9ZnVuY3Rpb24odCl7dmFyIHI9W10sZT1bXSxuPVtdO3QuZm9yRWFjaChmdW5jdGlvbih0LGksbyl7ci5wdXNoKGkpLGUucHVzaChvKSxuLnB1c2godCl9KTt2YXIgaT1bdC5uQ29scyx0Lm5Sb3dzXTtyZXR1cm4gbmV3IGgoZSxyLG4saSl9LHIuaWRlbnRpdHk9ZnVuY3Rpb24odCl7Zm9yKHZhciByPWkodCwxKVswXSxlPW5ldyBoKFtdLFtdLFtdLHQpLG49MDtuPHI7bisrKWUuc2V0KG4sbiwxKTtyZXR1cm4gZX0sci5wYWlyd2lzZU11bHRpcGx5PWZ1bmN0aW9uKHQscil7cmV0dXJuIGwodCxyLGZ1bmN0aW9uKHQscil7cmV0dXJuIHQqcn0pfSxyLmFkZD1mdW5jdGlvbih0LHIpe3JldHVybiBsKHQscixmdW5jdGlvbih0LHIpe3JldHVybiB0K3J9KX0sci5zdWJ0cmFjdD1mdW5jdGlvbih0LHIpe3JldHVybiBsKHQscixmdW5jdGlvbih0LHIpe3JldHVybiB0LXJ9KX0sci5tdWx0aXBseVNjYWxhcj1mdW5jdGlvbih0LHIpe3JldHVybiB0Lm1hcChmdW5jdGlvbih0KXtyZXR1cm4gdCpyfSl9LHIuZWxpbWluYXRlWmVyb3M9ZnVuY3Rpb24odCl7Zm9yKHZhciByPW5ldyBTZXQsZT10LmdldFZhbHVlcygpLG49dC5nZXRSb3dzKCksaT10LmdldENvbHMoKSxvPTA7bzxlLmxlbmd0aDtvKyspMD09PWVbb10mJnIuYWRkKG8pO3ZhciBzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIXIuaGFzKGUpfSxhPWUuZmlsdGVyKHMpLHU9bi5maWx0ZXIocyksbD1pLmZpbHRlcihzKTtyZXR1cm4gbmV3IGgodSxsLGEsdC5nZXREaW1zKCkpfSxyLm5vcm1hbGl6ZT1mdW5jdGlvbih0LHIpe3ZhciBlLG47dm9pZCAwPT09ciYmKHI9ImwyIik7dmFyIGk9dVtyXSxvPW5ldyBNYXA7dC5mb3JFYWNoKGZ1bmN0aW9uKHQscixlKXt2YXIgbj1vLmdldChyKXx8W107bi5wdXNoKGUpLG8uc2V0KHIsbil9KTt2YXIgYT1uZXcgaChbXSxbXSxbXSx0LmdldERpbXMoKSksbD1mdW5jdGlvbihyKXtmb3IodmFyIGU9by5nZXQocikuc29ydCgpLG49ZS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIHQuZ2V0KHIsZSl9KSxzPWkobiksaD0wO2g8cy5sZW5ndGg7aCsrKWEuc2V0KHIsZVtoXSxzW2hdKX07dHJ5e2Zvcih2YXIgZj1zKG8ua2V5cygpKSxjPWYubmV4dCgpOyFjLmRvbmU7Yz1mLm5leHQoKSlsKGMudmFsdWUpfWNhdGNoKHQpe2U9e2Vycm9yOnR9fWZpbmFsbHl7dHJ5e2MmJiFjLmRvbmUmJihuPWYucmV0dXJuKSYmbi5jYWxsKGYpfWZpbmFsbHl7aWYoZSl0aHJvdyBlLmVycm9yfX1yZXR1cm4gYX07dmFyIHU9KChuPXt9KS5tYXg9ZnVuY3Rpb24odCl7Zm9yKHZhciByPS0xLzAsZT0wO2U8dC5sZW5ndGg7ZSsrKXI9dFtlXT5yP3RbZV06cjtyZXR1cm4gdC5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIHQvcn0pfSxuLmwxPWZ1bmN0aW9uKHQpe2Zvcih2YXIgcj0wLGU9MDtlPHQubGVuZ3RoO2UrKylyKz10W2VdO3JldHVybiB0Lm1hcChmdW5jdGlvbih0KXtyZXR1cm4gdC9yfSl9LG4ubDI9ZnVuY3Rpb24odCl7Zm9yKHZhciByPTAsZT0wO2U8dC5sZW5ndGg7ZSsrKXIrPU1hdGgucG93KHRbZV0sMik7cmV0dXJuIHQubWFwKGZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLnNxcnQoTWF0aC5wb3codCwyKS9yKX0pfSxuKTtmdW5jdGlvbiBsKHQscixlKXtmb3IodmFyIG49bmV3IFNldCxpPVtdLG89W10scz1bXSxhPWZ1bmN0aW9uKG4sYSl7aS5wdXNoKG4pLG8ucHVzaChhKTt2YXIgaD1lKHQuZ2V0KG4sYSksci5nZXQobixhKSk7cy5wdXNoKGgpfSx1PXQuZ2V0VmFsdWVzKCksbD10LmdldFJvd3MoKSxmPXQuZ2V0Q29scygpLGM9MDtjPHUubGVuZ3RoO2MrKyl7dmFyIG09KHc9bFtjXSkrIjoiKyhkPWZbY10pO24uYWRkKG0pLGEodyxkKX12YXIgZz1yLmdldFZhbHVlcygpLHY9ci5nZXRSb3dzKCkscD1yLmdldENvbHMoKTtmb3IoYz0wO2M8Zy5sZW5ndGg7YysrKXt2YXIgdyxkO209KHc9dltjXSkrIjoiKyhkPXBbY10pO24uaGFzKG0pfHxhKHcsZCl9dmFyIHk9W3QublJvd3MsdC5uQ29sc107cmV0dXJuIG5ldyBoKGksbyxzLHkpfX0sZnVuY3Rpb24odCxyLGUpeyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkociwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIG49ZSg2KSxpPWUoMSk7ci5tYWtlTk5EZXNjZW50PWZ1bmN0aW9uKHQscil7cmV0dXJuIGZ1bmN0aW9uKGUsbyxzLGEsaCx1LGwsZil7dm9pZCAwPT09YSYmKGE9MTApLHZvaWQgMD09PWgmJihoPTUwKSx2b2lkIDA9PT11JiYodT0uMDAxKSx2b2lkIDA9PT1sJiYobD0uNSksdm9pZCAwPT09ZiYmKGY9ITApO2Zvcih2YXIgYz1lLmxlbmd0aCxtPW4ubWFrZUhlYXAoZS5sZW5ndGgscyksZz0wO2c8ZS5sZW5ndGg7ZysrKWZvcih2YXIgdj1uLnJlamVjdGlvblNhbXBsZShzLGUubGVuZ3RoLHIpLHA9MDtwPHYubGVuZ3RoO3ArKyl7dmFyIHc9dChlW2ddLGVbdltwXV0pO24uaGVhcFB1c2gobSxnLHcsdltwXSwxKSxuLmhlYXBQdXNoKG0sdltwXSx3LGcsMSl9aWYoZilmb3IodmFyIGQ9MDtkPG8ubGVuZ3RoO2QrKylmb3IoZz0wO2c8b1tkXS5sZW5ndGgmJiEob1tkXVtnXTwwKTtnKyspZm9yKHA9ZysxO3A8b1tkXS5sZW5ndGgmJiEob1tkXVtwXTwwKTtwKyspdz10KGVbb1tkXVtnXV0sZVtvW2RdW3BdXSksbi5oZWFwUHVzaChtLG9bZF1bZ10sdyxvW2RdW3BdLDEpLG4uaGVhcFB1c2gobSxvW2RdW3BdLHcsb1tkXVtnXSwxKTtmb3IoZD0wO2Q8YTtkKyspe3ZhciB5PW4uYnVpbGRDYW5kaWRhdGVzKG0sYyxzLGgsciksYj0wO2ZvcihnPTA7ZzxjO2crKylmb3IocD0wO3A8aDtwKyspe3ZhciBNPU1hdGguZmxvb3IoeVswXVtnXVtwXSk7aWYoIShNPDB8fGkudGF1UmFuZChyKTxsKSlmb3IodmFyIHg9MDt4PGg7eCsrKXt2YXIgUz1NYXRoLmZsb29yKHlbMF1bZ11beF0pLEU9eVsyXVtnXVtwXSxSPXlbMl1bZ11beF07UzwwfHwhRSYmIVJ8fCh3PXQoZVtNXSxlW1NdKSxiKz1uLmhlYXBQdXNoKG0sTSx3LFMsMSksYis9bi5oZWFwUHVzaChtLFMsdyxNLDEpKX19aWYoYjw9dSpzKmUubGVuZ3RoKWJyZWFrfXJldHVybiBuLmRlaGVhcFNvcnQobSl9fX0sZnVuY3Rpb24odCxyLGUpeyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkociwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIG49ZSgxKTtmdW5jdGlvbiBpKHQscil7dmFyIGU9ZnVuY3Rpb24oZSl7cmV0dXJuIG4uZW1wdHkodCkubWFwKGZ1bmN0aW9uKCl7cmV0dXJuIG4uZmlsbGVkKHIsZSl9KX0saT1bXTtyZXR1cm4gaS5wdXNoKGUoLTEpKSxpLnB1c2goZSgxLzApKSxpLnB1c2goZSgwKSksaX1mdW5jdGlvbiBvKHQscixlLG4saSl7cj1NYXRoLmZsb29yKHIpO3ZhciBvPXRbMF1bcl0scz10WzFdW3JdLGE9dFsyXVtyXTtpZihlPj1zWzBdKXJldHVybiAwO2Zvcih2YXIgaD0wO2g8by5sZW5ndGg7aCsrKWlmKG49PT1vW2hdKXJldHVybiAwO3NbMF09ZSxvWzBdPW4sYVswXT1pO2Zvcih2YXIgdT0wLGw9MDs7KXt2YXIgZj0yKnUrMSxjPWYrMSxtPXRbMF1bMF0ubGVuZ3RoO2lmKGY+PW0pYnJlYWs7aWYoYz49bSl7aWYoIShzW2ZdPmUpKWJyZWFrO2w9Zn1lbHNlIGlmKHNbZl0+PXNbY10pe2lmKCEoZTxzW2ZdKSlicmVhaztsPWZ9ZWxzZXtpZighKGU8c1tjXSkpYnJlYWs7bD1jfXNbdV09c1tsXSxvW3VdPW9bbF0sYVt1XT1hW2xdLHU9bH1yZXR1cm4gc1t1XT1lLG9bdV09bixhW3VdPWksMX1mdW5jdGlvbiBzKHQscixlLG4pe2Zvcig7MipuKzE8ZTspe3ZhciBpPTIqbisxLG89aSsxLHM9bjtpZih0W3NdPHRbaV0mJihzPWkpLG88ZSYmdFtzXTx0W29dJiYocz1vKSxzPT09bilicmVhazt2YXIgYT10W25dO3Rbbl09dFtzXSx0W3NdPWE7dmFyIGg9cltuXTtyW25dPXJbc10scltzXT1oLG49c319ci5tYWtlSGVhcD1pLHIucmVqZWN0aW9uU2FtcGxlPWZ1bmN0aW9uKHQscixlKXtmb3IodmFyIGk9bi56ZXJvcyh0KSxvPTA7bzx0O28rKyl7Zm9yKHZhciBzPSEwLGE9MDtzOyl7YT1uLnRhdVJhbmRJbnQocixlKTtmb3IodmFyIGg9ITEsdT0wO3U8bzt1KyspaWYoYT09PWlbdV0pe2g9ITA7YnJlYWt9aHx8KHM9ITEpfWlbb109YX1yZXR1cm4gaX0sci5oZWFwUHVzaD1vLHIuYnVpbGRDYW5kaWRhdGVzPWZ1bmN0aW9uKHQscixlLHMsYSl7Zm9yKHZhciBoPWkocixzKSx1PTA7dTxyO3UrKylmb3IodmFyIGw9MDtsPGU7bCsrKWlmKCEodFswXVt1XVtsXTwwKSl7dmFyIGY9dFswXVt1XVtsXSxjPXRbMl1bdV1bbF0sbT1uLnRhdVJhbmQoYSk7byhoLHUsbSxmLGMpLG8oaCxmLG0sdSxjKSx0WzJdW3VdW2xdPTB9cmV0dXJuIGh9LHIuZGVoZWFwU29ydD1mdW5jdGlvbih0KXtmb3IodmFyIHI9dFswXSxlPXRbMV0sbj0wO248ci5sZW5ndGg7bisrKWZvcih2YXIgaT1yW25dLG89ZVtuXSxhPTA7YTxpLmxlbmd0aC0xO2ErKyl7dmFyIGg9aS5sZW5ndGgtYS0xLHU9by5sZW5ndGgtYS0xLGw9aVswXTtpWzBdPWlbaF0saVtoXT1sO3ZhciBmPW9bMF07b1swXT1vW3VdLG9bdV09ZixzKG8saSx1LDApfXJldHVybntpbmRpY2VzOnIsd2VpZ2h0czplfX19LGZ1bmN0aW9uKHQscixlKXsidXNlIHN0cmljdCI7dmFyIG49dGhpcyYmdGhpcy5fX3JlYWR8fGZ1bmN0aW9uKHQscil7dmFyIGU9ImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmdFtTeW1ib2wuaXRlcmF0b3JdO2lmKCFlKXJldHVybiB0O3ZhciBuLGksbz1lLmNhbGwodCkscz1bXTt0cnl7Zm9yKDsodm9pZCAwPT09cnx8ci0tID4wKSYmIShuPW8ubmV4dCgpKS5kb25lOylzLnB1c2gobi52YWx1ZSl9Y2F0Y2godCl7aT17ZXJyb3I6dH19ZmluYWxseXt0cnl7biYmIW4uZG9uZSYmKGU9by5yZXR1cm4pJiZlLmNhbGwobyl9ZmluYWxseXtpZihpKXRocm93IGkuZXJyb3J9fXJldHVybiBzfSxpPXRoaXMmJnRoaXMuX19zcHJlYWR8fGZ1bmN0aW9uKCl7Zm9yKHZhciB0PVtdLHI9MDtyPGFyZ3VtZW50cy5sZW5ndGg7cisrKXQ9dC5jb25jYXQobihhcmd1bWVudHNbcl0pKTtyZXR1cm4gdH0sbz10aGlzJiZ0aGlzLl9fdmFsdWVzfHxmdW5jdGlvbih0KXt2YXIgcj0iZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiZ0W1N5bWJvbC5pdGVyYXRvcl0sZT0wO3JldHVybiByP3IuY2FsbCh0KTp7bmV4dDpmdW5jdGlvbigpe3JldHVybiB0JiZlPj10Lmxlbmd0aCYmKHQ9dm9pZCAwKSx7dmFsdWU6dCYmdFtlKytdLGRvbmU6IXR9fX19O09iamVjdC5kZWZpbmVQcm9wZXJ0eShyLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgcz1lKDEpLGE9ZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24odCxyLGUsbil7dGhpcy5oeXBlcnBsYW5lcz10LHRoaXMub2Zmc2V0cz1yLHRoaXMuY2hpbGRyZW49ZSx0aGlzLmluZGljZXM9bn19KCk7ci5GbGF0VHJlZT1hLHIubWFrZUZvcmVzdD1mdW5jdGlvbih0LHIsZSxuKXt2YXIgbz1NYXRoLm1heCgxMCxyKTtyZXR1cm4gcy5yYW5nZShlKS5tYXAoZnVuY3Rpb24ocixlKXtyZXR1cm4gZnVuY3Rpb24odCxyLGUsbil7dm9pZCAwPT09ciYmKHI9MzApO3ZhciBpPXMucmFuZ2UodC5sZW5ndGgpO3JldHVybiBmdW5jdGlvbiB0KHIsZSxuLGksbyl7aWYodm9pZCAwPT09biYmKG49MzApLGUubGVuZ3RoPm4pe3ZhciBhPWZ1bmN0aW9uKHQscixlKXt2YXIgbj10WzBdLmxlbmd0aCxpPXMudGF1UmFuZEludChyLmxlbmd0aCxlKSxvPXMudGF1UmFuZEludChyLmxlbmd0aCxlKTtvPShvKz1pPT09bz8xOjApJXIubGVuZ3RoO2Zvcih2YXIgYT1yW2ldLGg9cltvXSx1PTAsbD1zLnplcm9zKG4pLGY9MDtmPGwubGVuZ3RoO2YrKylsW2ZdPXRbYV1bZl0tdFtoXVtmXSx1LT1sW2ZdKih0W2FdW2ZdK3RbaF1bZl0pLzI7Zm9yKHZhciBjPTAsbT0wLGc9cy56ZXJvcyhyLmxlbmd0aCksZj0wO2Y8ci5sZW5ndGg7ZisrKXtmb3IodmFyIHY9dSxwPTA7cDxuO3ArKyl2Kz1sW3BdKnRbcltmXV1bcF07MD09PXY/KGdbZl09cy50YXVSYW5kSW50KDIsZSksMD09PWdbZl0/Yys9MTptKz0xKTp2PjA/KGdbZl09MCxjKz0xKTooZ1tmXT0xLG0rPTEpfXZhciB3PXMuemVyb3MoYyksZD1zLnplcm9zKG0pO2Zvcih2YXIgZiBpbiBjPTAsbT0wLHMucmFuZ2UoZy5sZW5ndGgpKTA9PT1nW2ZdPyh3W2NdPXJbZl0sYys9MSk6KGRbbV09cltmXSxtKz0xKTtyZXR1cm57aW5kaWNlc0xlZnQ6dyxpbmRpY2VzUmlnaHQ6ZCxoeXBlcnBsYW5lOmwsb2Zmc2V0OnV9fShyLGUsbyksaD1hLmluZGljZXNMZWZ0LHU9YS5pbmRpY2VzUmlnaHQsbD1hLmh5cGVycGxhbmUsZj1hLm9mZnNldCxjPXQocixoLG4saSsxLG8pLG09dChyLHUsbixpKzEsbyksZz17bGVmdENoaWxkOmMscmlnaHRDaGlsZDptLGlzTGVhZjohMSxoeXBlcnBsYW5lOmwsb2Zmc2V0OmZ9O3JldHVybiBnfXZhciBnPXtpbmRpY2VzOmUsaXNMZWFmOiEwfTtyZXR1cm4gZ30odCxpLHIsZSxuKX0odCxvLGUsbil9KS5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKHQscil7dmFyIGU9ZnVuY3Rpb24gdChyKXtyZXR1cm4gci5pc0xlYWY/MToxK3Qoci5sZWZ0Q2hpbGQpK3Qoci5yaWdodENoaWxkKX0odCksbj1mdW5jdGlvbiB0KHIpe3JldHVybiByLmlzTGVhZj8xOnQoci5sZWZ0Q2hpbGQpK3Qoci5yaWdodENoaWxkKX0odCksbz1zLnJhbmdlKGUpLm1hcChmdW5jdGlvbigpe3JldHVybiBzLnplcm9zKHQuaHlwZXJwbGFuZS5sZW5ndGgpfSksaD1zLnplcm9zKGUpLHU9cy5yYW5nZShlKS5tYXAoZnVuY3Rpb24oKXtyZXR1cm5bLTEsLTFdfSksbD1zLnJhbmdlKG4pLm1hcChmdW5jdGlvbigpe3JldHVybiBzLnJhbmdlKHIpLm1hcChmdW5jdGlvbigpe3JldHVybi0xfSl9KTtyZXR1cm4gZnVuY3Rpb24gdChyLGUsbixvLHMsYSxoKXt2YXIgdTtpZihyLmlzTGVhZilyZXR1cm4gb1thXVswXT0taCwodT1zW2hdKS5zcGxpY2UuYXBwbHkodSxpKFswLHIuaW5kaWNlcy5sZW5ndGhdLHIuaW5kaWNlcykpLHtub2RlTnVtOmEsbGVhZk51bTpoKz0xfTtlW2FdPXIuaHlwZXJwbGFuZSxuW2FdPXIub2Zmc2V0LG9bYV1bMF09YSsxO3ZhciBsPWEsZj10KHIubGVmdENoaWxkLGUsbixvLHMsYSsxLGgpO3JldHVybiBhPWYubm9kZU51bSxoPWYubGVhZk51bSxvW2xdWzFdPWErMSx7bm9kZU51bTooZj10KHIucmlnaHRDaGlsZCxlLG4sbyxzLGErMSxoKSkubm9kZU51bSxsZWFmTnVtOmYubGVhZk51bX19KHQsbyxoLHUsbCwwLDApLG5ldyBhKG8saCx1LGwpfSh0LG8pfSl9LHIubWFrZUxlYWZBcnJheT1mdW5jdGlvbih0KXt2YXIgcixlO2lmKHQubGVuZ3RoPjApe3ZhciBuPVtdO3RyeXtmb3IodmFyIHM9byh0KSxhPXMubmV4dCgpOyFhLmRvbmU7YT1zLm5leHQoKSl7dmFyIGg9YS52YWx1ZTtuLnB1c2guYXBwbHkobixpKGguaW5kaWNlcykpfX1jYXRjaCh0KXtyPXtlcnJvcjp0fX1maW5hbGx5e3RyeXthJiYhYS5kb25lJiYoZT1zLnJldHVybikmJmUuY2FsbChzKX1maW5hbGx5e2lmKHIpdGhyb3cgci5lcnJvcn19cmV0dXJuIG59cmV0dXJuW1stMV1dfX0sZnVuY3Rpb24odCxyLGUpeyJ1c2Ugc3RyaWN0Ijt2YXIgbj1lKDkpO2Z1bmN0aW9uIGkodCxyLGUpe3ZhciBuPTA7Y29uc3QgaT1lKHIpO2Zvcih2YXIgbz0wO288dC54Lmxlbmd0aDtvKyspbis9TWF0aC5hYnModC55W29dLWkodC54W29dKSk7cmV0dXJuIG59ZnVuY3Rpb24gbyh0LHIsZSxpLG8pe3ZhciBzPW4uTWF0cml4LmV5ZShyLmxlbmd0aCkubXVsKGUqaSppKSxhPXQueC5sZW5ndGgsaD1uZXcgQXJyYXkoYSk7Y29uc3QgdT1vKHIpO2Zvcih2YXIgbD0wO2w8YTtsKyspaFtsXT11KHQueFtsXSk7dmFyIGY9ZnVuY3Rpb24odCxyLGUsaSxvKXtjb25zdCBzPWUubGVuZ3RoLGE9dC54Lmxlbmd0aDtmb3IodmFyIGg9bmV3IEFycmF5KHMpLHU9MDt1PHM7dSsrKXtoW3VdPW5ldyBBcnJheShhKTt2YXIgbD1lLmNvbmNhdCgpO2xbdV0rPWk7Zm9yKHZhciBmPW8obCksYz0wO2M8YTtjKyspaFt1XVtjXT1yW2NdLWYodC54W2NdKX1yZXR1cm4gbmV3IG4uTWF0cml4KGgpfSh0LGgscixpLG8pLGM9ZnVuY3Rpb24odCxyKXtjb25zdCBlPXQueC5sZW5ndGg7Zm9yKHZhciBpPW5ldyBBcnJheShlKSxvPTA7bzxlO28rKylpW29dPXQueVtvXS1yW29dO3JldHVybiBuZXcgbi5NYXRyaXgoW2ldKX0odCxoKS50cmFuc3Bvc2VWaWV3KCksbT1uLmludmVyc2Uocy5hZGQoZi5tbXVsKGYudHJhbnNwb3NlVmlldygpKSkpO3JldHVybihyPShyPW5ldyBuLk1hdHJpeChbcl0pKS5zdWIobS5tbXVsKGYpLm1tdWwoYykubXVsKGkpLnRyYW5zcG9zZVZpZXcoKSkpLnRvMURBcnJheSgpfXQuZXhwb3J0cz1mdW5jdGlvbih0LHIsZT17fSl7bGV0e21heEl0ZXJhdGlvbnM6bj0xMDAsZ3JhZGllbnREaWZmZXJlbmNlOnM9LjEsZGFtcGluZzphPTAsZXJyb3JUb2xlcmFuY2U6aD0uMDEsaW5pdGlhbFZhbHVlczp1fT1lO2lmKGE8PTApdGhyb3cgbmV3IEVycm9yKCJUaGUgZGFtcGluZyBvcHRpb24gbXVzdCBiZSBhIHBvc2l0aXZlIG51bWJlciIpO2lmKCF0Lnh8fCF0LnkpdGhyb3cgbmV3IEVycm9yKCJUaGUgZGF0YSBwYXJhbWV0ZXIgbXVzdCBoYXZlIHggYW5kIHkgZWxlbWVudHMiKTtpZighQXJyYXkuaXNBcnJheSh0LngpfHx0LngubGVuZ3RoPDJ8fCFBcnJheS5pc0FycmF5KHQueSl8fHQueS5sZW5ndGg8Mil0aHJvdyBuZXcgRXJyb3IoIlRoZSBkYXRhIHBhcmFtZXRlciBlbGVtZW50cyBtdXN0IGJlIGFuIGFycmF5IHdpdGggbW9yZSB0aGFuIDIgcG9pbnRzIik7aWYodC54Lmxlbmd0aCE9PXQueS5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJUaGUgZGF0YSBwYXJhbWV0ZXIgZWxlbWVudHMgbXVzdCBoYXZlIHRoZSBzYW1lIHNpemUiKTt2YXIgbD11fHxuZXcgQXJyYXkoci5sZW5ndGgpLmZpbGwoMSk7aWYoIUFycmF5LmlzQXJyYXkobCkpdGhyb3cgbmV3IEVycm9yKCJpbml0aWFsVmFsdWVzIG11c3QgYmUgYW4gYXJyYXkiKTtmb3IodmFyIGY9aSh0LGwsciksYz1mPD1oLG09MDttPG4mJiFjO20rKyljPShmPWkodCxsPW8odCxsLGEscyxyKSxyKSk8PWg7cmV0dXJue3BhcmFtZXRlclZhbHVlczpsLHBhcmFtZXRlckVycm9yOmYsaXRlcmF0aW9uczptfX19LGZ1bmN0aW9uKHQscixlKXsidXNlIHN0cmljdCI7ZS5yKHIpO3ZhciBuPWUoMCksaT1lLm4obik7dmFyIG89ZnVuY3Rpb24odCl7aWYoIWkoKSh0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJpbnB1dCBtdXN0IGJlIGFuIGFycmF5Iik7aWYoMD09PXQubGVuZ3RoKXRocm93IG5ldyBUeXBlRXJyb3IoImlucHV0IG11c3Qgbm90IGJlIGVtcHR5Iik7Zm9yKHZhciByPXRbMF0sZT0xO2U8dC5sZW5ndGg7ZSsrKXRbZV0+ciYmKHI9dFtlXSk7cmV0dXJuIHJ9O3ZhciBzPWZ1bmN0aW9uKHQpe2lmKCFpKCkodCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiaW5wdXQgbXVzdCBiZSBhbiBhcnJheSIpO2lmKDA9PT10Lmxlbmd0aCl0aHJvdyBuZXcgVHlwZUVycm9yKCJpbnB1dCBtdXN0IG5vdCBiZSBlbXB0eSIpO2Zvcih2YXIgcj10WzBdLGU9MTtlPHQubGVuZ3RoO2UrKyl0W2VdPHImJihyPXRbZV0pO3JldHVybiByfTt2YXIgYT1mdW5jdGlvbih0KXt2YXIgcixlPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTp7fTtpZighaSgpKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoImlucHV0IG11c3QgYmUgYW4gYXJyYXkiKTtpZigwPT09dC5sZW5ndGgpdGhyb3cgbmV3IFR5cGVFcnJvcigiaW5wdXQgbXVzdCBub3QgYmUgZW1wdHkiKTtpZih2b2lkIDAhPT1lLm91dHB1dCl7aWYoIWkoKShlLm91dHB1dCkpdGhyb3cgbmV3IFR5cGVFcnJvcigib3V0cHV0IG9wdGlvbiBtdXN0IGJlIGFuIGFycmF5IGlmIHNwZWNpZmllZCIpO3I9ZS5vdXRwdXR9ZWxzZSByPW5ldyBBcnJheSh0Lmxlbmd0aCk7dmFyIG49cyh0KSxhPW8odCk7aWYobj09PWEpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIm1pbmltdW0gYW5kIG1heGltdW0gaW5wdXQgdmFsdWVzIGFyZSBlcXVhbC4gQ2Fubm90IHJlc2NhbGUgYSBjb25zdGFudCBhcnJheSIpO3ZhciBoPWUubWluLHU9dm9pZCAwPT09aD9lLmF1dG9NaW5NYXg/bjowOmgsbD1lLm1heCxmPXZvaWQgMD09PWw/ZS5hdXRvTWluTWF4P2E6MTpsO2lmKHU+PWYpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIm1pbiBvcHRpb24gbXVzdCBiZSBzbWFsbGVyIHRoYW4gbWF4IG9wdGlvbiIpO2Zvcih2YXIgYz0oZi11KS8oYS1uKSxtPTA7bTx0Lmxlbmd0aDttKyspclttXT0odFttXS1uKSpjK3U7cmV0dXJuIHJ9O2NsYXNzIGh7Y29uc3RydWN0b3IodCl7dmFyIHIsZSxuLGksbyxzLGEsaCx1LGw9KHQ9UC5jaGVja01hdHJpeCh0KSkuY2xvbmUoKSxmPWwucm93cyxjPWwuY29sdW1ucyxtPW5ldyBBcnJheShmKSxnPTE7Zm9yKHI9MDtyPGY7cisrKW1bcl09cjtmb3IoaD1uZXcgQXJyYXkoZiksZT0wO2U8YztlKyspe2ZvcihyPTA7cjxmO3IrKyloW3JdPWwuZ2V0KHIsZSk7Zm9yKHI9MDtyPGY7cisrKXtmb3IodT1NYXRoLm1pbihyLGUpLG89MCxuPTA7bjx1O24rKylvKz1sLmdldChyLG4pKmhbbl07aFtyXS09byxsLnNldChyLGUsaFtyXSl9Zm9yKGk9ZSxyPWUrMTtyPGY7cisrKU1hdGguYWJzKGhbcl0pPk1hdGguYWJzKGhbaV0pJiYoaT1yKTtpZihpIT09ZSl7Zm9yKG49MDtuPGM7bisrKXM9bC5nZXQoaSxuKSxsLnNldChpLG4sbC5nZXQoZSxuKSksbC5zZXQoZSxuLHMpO2E9bVtpXSxtW2ldPW1bZV0sbVtlXT1hLGc9LWd9aWYoZTxmJiYwIT09bC5nZXQoZSxlKSlmb3Iocj1lKzE7cjxmO3IrKylsLnNldChyLGUsbC5nZXQocixlKS9sLmdldChlLGUpKX10aGlzLkxVPWwsdGhpcy5waXZvdFZlY3Rvcj1tLHRoaXMucGl2b3RTaWduPWd9aXNTaW5ndWxhcigpe2Zvcih2YXIgdD10aGlzLkxVLHI9dC5jb2x1bW5zLGU9MDtlPHI7ZSsrKWlmKDA9PT10W2VdW2VdKXJldHVybiEwO3JldHVybiExfXNvbHZlKHQpe3Q9SS5jaGVja01hdHJpeCh0KTt2YXIgcj10aGlzLkxVO2lmKHIucm93cyE9PXQucm93cyl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgbWF0cml4IGRpbWVuc2lvbnMiKTtpZih0aGlzLmlzU2luZ3VsYXIoKSl0aHJvdyBuZXcgRXJyb3IoIkxVIG1hdHJpeCBpcyBzaW5ndWxhciIpO3ZhciBlLG4saSxvPXQuY29sdW1ucyxzPXQuc3ViTWF0cml4Um93KHRoaXMucGl2b3RWZWN0b3IsMCxvLTEpLGE9ci5jb2x1bW5zO2ZvcihpPTA7aTxhO2krKylmb3IoZT1pKzE7ZTxhO2UrKylmb3Iobj0wO248bztuKyspc1tlXVtuXS09c1tpXVtuXSpyW2VdW2ldO2ZvcihpPWEtMTtpPj0wO2ktLSl7Zm9yKG49MDtuPG87bisrKXNbaV1bbl0vPXJbaV1baV07Zm9yKGU9MDtlPGk7ZSsrKWZvcihuPTA7bjxvO24rKylzW2VdW25dLT1zW2ldW25dKnJbZV1baV19cmV0dXJuIHN9Z2V0IGRldGVybWluYW50KCl7dmFyIHQ9dGhpcy5MVTtpZighdC5pc1NxdWFyZSgpKXRocm93IG5ldyBFcnJvcigiTWF0cml4IG11c3QgYmUgc3F1YXJlIik7Zm9yKHZhciByPXRoaXMucGl2b3RTaWduLGU9dC5jb2x1bW5zLG49MDtuPGU7bisrKXIqPXRbbl1bbl07cmV0dXJuIHJ9Z2V0IGxvd2VyVHJpYW5ndWxhck1hdHJpeCgpe2Zvcih2YXIgdD10aGlzLkxVLHI9dC5yb3dzLGU9dC5jb2x1bW5zLG49bmV3IEkocixlKSxpPTA7aTxyO2krKylmb3IodmFyIG89MDtvPGU7bysrKW5baV1bb109aT5vP3RbaV1bb106aT09PW8/MTowO3JldHVybiBufWdldCB1cHBlclRyaWFuZ3VsYXJNYXRyaXgoKXtmb3IodmFyIHQ9dGhpcy5MVSxyPXQucm93cyxlPXQuY29sdW1ucyxuPW5ldyBJKHIsZSksaT0wO2k8cjtpKyspZm9yKHZhciBvPTA7bzxlO28rKyluW2ldW29dPWk8PW8/dFtpXVtvXTowO3JldHVybiBufWdldCBwaXZvdFBlcm11dGF0aW9uVmVjdG9yKCl7cmV0dXJuIHRoaXMucGl2b3RWZWN0b3Iuc2xpY2UoKX19ZnVuY3Rpb24gdSh0LHIpe3ZhciBlPTA7cmV0dXJuIE1hdGguYWJzKHQpPk1hdGguYWJzKHIpPyhlPXIvdCxNYXRoLmFicyh0KSpNYXRoLnNxcnQoMStlKmUpKTowIT09cj8oZT10L3IsTWF0aC5hYnMocikqTWF0aC5zcXJ0KDErZSplKSk6MH1mdW5jdGlvbiBsKHQscixlKXtmb3IodmFyIG49bmV3IEFycmF5KHQpLGk9MDtpPHQ7aSsrKXtuW2ldPW5ldyBBcnJheShyKTtmb3IodmFyIG89MDtvPHI7bysrKW5baV1bb109ZX1yZXR1cm4gbn1jbGFzcyBme2NvbnN0cnVjdG9yKHQscj17fSl7dmFyIGU9KHQ9UC5jaGVja01hdHJpeCh0KSkucm93cyxuPXQuY29sdW1ucztjb25zdHtjb21wdXRlTGVmdFNpbmd1bGFyVmVjdG9yczppPSEwLGNvbXB1dGVSaWdodFNpbmd1bGFyVmVjdG9yczpvPSEwLGF1dG9UcmFuc3Bvc2U6cz0hMX09cjt2YXIgYSxoPUJvb2xlYW4oaSksZj1Cb29sZWFuKG8pLGM9ITE7aWYoZTxuKWlmKHMpe2U9KGE9dC50cmFuc3Bvc2UoKSkucm93cyxuPWEuY29sdW1ucyxjPSEwO3ZhciBtPWg7aD1mLGY9bX1lbHNlIGE9dC5jbG9uZSgpLGNvbnNvbGUud2FybigiQ29tcHV0aW5nIFNWRCBvbiBhIG1hdHJpeCB3aXRoIG1vcmUgY29sdW1ucyB0aGFuIHJvd3MuIENvbnNpZGVyIGVuYWJsaW5nIGF1dG9UcmFuc3Bvc2UiKTtlbHNlIGE9dC5jbG9uZSgpO3ZhciBnPU1hdGgubWluKGUsbiksdj1NYXRoLm1pbihlKzEsbikscD1uZXcgQXJyYXkodiksdz1sKGUsZywwKSxkPWwobixuLDApLHk9bmV3IEFycmF5KG4pLGI9bmV3IEFycmF5KGUpLE09bmV3IEFycmF5KHYpO2ZvcihsZXQgdD0wO3Q8djt0KyspTVt0XT10O3ZhciB4PU1hdGgubWluKGUtMSxuKSxTPU1hdGgubWF4KDAsTWF0aC5taW4obi0yLGUpKSxFPU1hdGgubWF4KHgsUyk7Zm9yKGxldCB0PTA7dDxFO3QrKyl7aWYodDx4KXtwW3RdPTA7Zm9yKGxldCByPXQ7cjxlO3IrKylwW3RdPXUocFt0XSxhW3JdW3RdKTtpZigwIT09cFt0XSl7YVt0XVt0XTwwJiYocFt0XT0tcFt0XSk7Zm9yKGxldCByPXQ7cjxlO3IrKylhW3JdW3RdLz1wW3RdO2FbdF1bdF0rPTF9cFt0XT0tcFt0XX1mb3IobGV0IHI9dCsxO3I8bjtyKyspe2lmKHQ8eCYmMCE9PXBbdF0pe2xldCBuPTA7Zm9yKGxldCBpPXQ7aTxlO2krKyluKz1hW2ldW3RdKmFbaV1bcl07bj0tbi9hW3RdW3RdO2ZvcihsZXQgaT10O2k8ZTtpKyspYVtpXVtyXSs9biphW2ldW3RdfXlbcl09YVt0XVtyXX1pZihoJiZ0PHgpZm9yKGxldCByPXQ7cjxlO3IrKyl3W3JdW3RdPWFbcl1bdF07aWYodDxTKXt5W3RdPTA7Zm9yKGxldCByPXQrMTtyPG47cisrKXlbdF09dSh5W3RdLHlbcl0pO2lmKDAhPT15W3RdKXt5W3QrMV08MCYmKHlbdF09MC15W3RdKTtmb3IobGV0IHI9dCsxO3I8bjtyKyspeVtyXS89eVt0XTt5W3QrMV0rPTF9aWYoeVt0XT0teVt0XSx0KzE8ZSYmMCE9PXlbdF0pe2ZvcihsZXQgcj10KzE7cjxlO3IrKyliW3JdPTA7Zm9yKGxldCByPXQrMTtyPGU7cisrKWZvcihsZXQgZT10KzE7ZTxuO2UrKyliW3JdKz15W2VdKmFbcl1bZV07Zm9yKGxldCByPXQrMTtyPG47cisrKXtsZXQgbj0teVtyXS95W3QrMV07Zm9yKGxldCBpPXQrMTtpPGU7aSsrKWFbaV1bcl0rPW4qYltpXX19aWYoZilmb3IobGV0IHI9dCsxO3I8bjtyKyspZFtyXVt0XT15W3JdfX1sZXQgUj1NYXRoLm1pbihuLGUrMSk7aWYoeDxuJiYocFt4XT1hW3hdW3hdKSxlPFImJihwW1ItMV09MCksUysxPFImJih5W1NdPWFbU11bUi0xXSkseVtSLTFdPTAsaCl7Zm9yKGxldCB0PXg7dDxnO3QrKyl7Zm9yKGxldCByPTA7cjxlO3IrKyl3W3JdW3RdPTA7d1t0XVt0XT0xfWZvcihsZXQgdD14LTE7dD49MDt0LS0paWYoMCE9PXBbdF0pe2ZvcihsZXQgcj10KzE7cjxnO3IrKyl7bGV0IG49MDtmb3IobGV0IGk9dDtpPGU7aSsrKW4rPXdbaV1bdF0qd1tpXVtyXTtuPS1uL3dbdF1bdF07Zm9yKGxldCBpPXQ7aTxlO2krKyl3W2ldW3JdKz1uKndbaV1bdF19Zm9yKGxldCByPXQ7cjxlO3IrKyl3W3JdW3RdPS13W3JdW3RdO3dbdF1bdF09MSt3W3RdW3RdO2ZvcihsZXQgcj0wO3I8dC0xO3IrKyl3W3JdW3RdPTB9ZWxzZXtmb3IobGV0IHI9MDtyPGU7cisrKXdbcl1bdF09MDt3W3RdW3RdPTF9fWlmKGYpZm9yKGxldCB0PW4tMTt0Pj0wO3QtLSl7aWYodDxTJiYwIT09eVt0XSlmb3IobGV0IHI9dCsxO3I8bjtyKyspe2xldCBlPTA7Zm9yKGxldCBpPXQrMTtpPG47aSsrKWUrPWRbaV1bdF0qZFtpXVtyXTtlPS1lL2RbdCsxXVt0XTtmb3IobGV0IGk9dCsxO2k8bjtpKyspZFtpXVtyXSs9ZSpkW2ldW3RdfWZvcihsZXQgcj0wO3I8bjtyKyspZFtyXVt0XT0wO2RbdF1bdF09MX1mb3IodmFyIGs9Ui0xLEE9TnVtYmVyLkVQU0lMT047Uj4wOyl7bGV0IHQscjtmb3IodD1SLTI7dD49LTEmJi0xIT09dDt0LS0pe2NvbnN0IHI9TnVtYmVyLk1JTl9WQUxVRStBKk1hdGguYWJzKHBbdF0rTWF0aC5hYnMocFt0KzFdKSk7aWYoTWF0aC5hYnMoeVt0XSk8PXJ8fE51bWJlci5pc05hTih5W3RdKSl7eVt0XT0wO2JyZWFrfX1pZih0PT09Ui0yKXI9NDtlbHNle2xldCBlO2ZvcihlPVItMTtlPj10JiZlIT09dDtlLS0pe2xldCByPShlIT09Uj9NYXRoLmFicyh5W2VdKTowKSsoZSE9PXQrMT9NYXRoLmFicyh5W2UtMV0pOjApO2lmKE1hdGguYWJzKHBbZV0pPD1BKnIpe3BbZV09MDticmVha319ZT09PXQ/cj0zOmU9PT1SLTE/cj0xOihyPTIsdD1lKX1zd2l0Y2godCsrLHIpe2Nhc2UgMTp7bGV0IHI9eVtSLTJdO3lbUi0yXT0wO2ZvcihsZXQgZT1SLTI7ZT49dDtlLS0pe2xldCBpPXUocFtlXSxyKSxvPXBbZV0vaSxzPXIvaTtpZihwW2VdPWksZSE9PXQmJihyPS1zKnlbZS0xXSx5W2UtMV09byp5W2UtMV0pLGYpZm9yKGxldCB0PTA7dDxuO3QrKylpPW8qZFt0XVtlXStzKmRbdF1bUi0xXSxkW3RdW1ItMV09LXMqZFt0XVtlXStvKmRbdF1bUi0xXSxkW3RdW2VdPWl9YnJlYWt9Y2FzZSAyOntsZXQgcj15W3QtMV07eVt0LTFdPTA7Zm9yKGxldCBuPXQ7bjxSO24rKyl7bGV0IGk9dShwW25dLHIpLG89cFtuXS9pLHM9ci9pO2lmKHBbbl09aSxyPS1zKnlbbl0seVtuXT1vKnlbbl0saClmb3IobGV0IHI9MDtyPGU7cisrKWk9byp3W3JdW25dK3Mqd1tyXVt0LTFdLHdbcl1bdC0xXT0tcyp3W3JdW25dK28qd1tyXVt0LTFdLHdbcl1bbl09aX1icmVha31jYXNlIDM6e2NvbnN0IHI9TWF0aC5tYXgoTWF0aC5hYnMocFtSLTFdKSxNYXRoLmFicyhwW1ItMl0pLE1hdGguYWJzKHlbUi0yXSksTWF0aC5hYnMocFt0XSksTWF0aC5hYnMoeVt0XSkpLGk9cFtSLTFdL3Isbz1wW1ItMl0vcixzPXlbUi0yXS9yLGE9cFt0XS9yLGw9eVt0XS9yLGM9KChvK2kpKihvLWkpK3MqcykvMixtPWkqcyooaSpzKTtsZXQgZz0wOzA9PT1jJiYwPT09bXx8KGc9bS8oYysoZz1jPDA/MC1NYXRoLnNxcnQoYypjK20pOk1hdGguc3FydChjKmMrbSkpKSk7bGV0IHY9KGEraSkqKGEtaSkrZyxiPWEqbDtmb3IobGV0IHI9dDtyPFItMTtyKyspe2xldCBpPXUodixiKTswPT09aSYmKGk9TnVtYmVyLk1JTl9WQUxVRSk7bGV0IG89di9pLHM9Yi9pO2lmKHIhPT10JiYoeVtyLTFdPWkpLHY9bypwW3JdK3MqeVtyXSx5W3JdPW8qeVtyXS1zKnBbcl0sYj1zKnBbcisxXSxwW3IrMV09bypwW3IrMV0sZilmb3IobGV0IHQ9MDt0PG47dCsrKWk9bypkW3RdW3JdK3MqZFt0XVtyKzFdLGRbdF1bcisxXT0tcypkW3RdW3JdK28qZFt0XVtyKzFdLGRbdF1bcl09aTtpZigwPT09KGk9dSh2LGIpKSYmKGk9TnVtYmVyLk1JTl9WQUxVRSksbz12L2kscz1iL2kscFtyXT1pLHY9byp5W3JdK3MqcFtyKzFdLHBbcisxXT0tcyp5W3JdK28qcFtyKzFdLGI9cyp5W3IrMV0seVtyKzFdPW8qeVtyKzFdLGgmJnI8ZS0xKWZvcihsZXQgdD0wO3Q8ZTt0KyspaT1vKndbdF1bcl0rcyp3W3RdW3IrMV0sd1t0XVtyKzFdPS1zKndbdF1bcl0rbyp3W3RdW3IrMV0sd1t0XVtyXT1pfXlbUi0yXT12LDE7YnJlYWt9Y2FzZSA0OmlmKHBbdF08PTAmJihwW3RdPXBbdF08MD8tcFt0XTowLGYpKWZvcihsZXQgcj0wO3I8PWs7cisrKWRbcl1bdF09LWRbcl1bdF07Zm9yKDt0PGsmJiEocFt0XT49cFt0KzFdKTspe2xldCByPXBbdF07aWYocFt0XT1wW3QrMV0scFt0KzFdPXIsZiYmdDxuLTEpZm9yKGxldCBlPTA7ZTxuO2UrKylyPWRbZV1bdCsxXSxkW2VdW3QrMV09ZFtlXVt0XSxkW2VdW3RdPXI7aWYoaCYmdDxlLTEpZm9yKGxldCBuPTA7bjxlO24rKylyPXdbbl1bdCsxXSx3W25dW3QrMV09d1tuXVt0XSx3W25dW3RdPXI7dCsrfTAsUi0tfX1pZihjKXt2YXIgTj1kO2Q9dyx3PU59dGhpcy5tPWUsdGhpcy5uPW4sdGhpcy5zPXAsdGhpcy5VPXcsdGhpcy5WPWR9c29sdmUodCl7dmFyIHI9dCxlPXRoaXMudGhyZXNob2xkLG49dGhpcy5zLmxlbmd0aCxpPUkuemVyb3MobixuKTtmb3IobGV0IHQ9MDt0PG47dCsrKU1hdGguYWJzKHRoaXMuc1t0XSk8PWU/aVt0XVt0XT0wOmlbdF1bdF09MS90aGlzLnNbdF07dmFyIG89dGhpcy5VLHM9dGhpcy5yaWdodFNpbmd1bGFyVmVjdG9ycyxhPXMubW11bChpKSxoPXMucm93cyx1PW8ubGVuZ3RoLGw9SS56ZXJvcyhoLHUpO2ZvcihsZXQgdD0wO3Q8aDt0KyspZm9yKGxldCByPTA7cjx1O3IrKyl7bGV0IGU9MDtmb3IobGV0IGk9MDtpPG47aSsrKWUrPWFbdF1baV0qb1tyXVtpXTtsW3RdW3JdPWV9cmV0dXJuIGwubW11bChyKX1zb2x2ZUZvckRpYWdvbmFsKHQpe3JldHVybiB0aGlzLnNvbHZlKEkuZGlhZyh0KSl9aW52ZXJzZSgpe3ZhciB0PXRoaXMuVixyPXRoaXMudGhyZXNob2xkLGU9dC5sZW5ndGgsbj10WzBdLmxlbmd0aCxpPW5ldyBJKGUsdGhpcy5zLmxlbmd0aCk7Zm9yKGxldCBvPTA7bzxlO28rKylmb3IobGV0IGU9MDtlPG47ZSsrKU1hdGguYWJzKHRoaXMuc1tlXSk+cj9pW29dW2VdPXRbb11bZV0vdGhpcy5zW2VdOmlbb11bZV09MDt2YXIgbz10aGlzLlUscz1vLmxlbmd0aCxhPW9bMF0ubGVuZ3RoLGg9bmV3IEkoZSxzKTtmb3IobGV0IHQ9MDt0PGU7dCsrKWZvcihsZXQgcj0wO3I8cztyKyspe2xldCBlPTA7Zm9yKGxldCBuPTA7bjxhO24rKyllKz1pW3RdW25dKm9bcl1bbl07aFt0XVtyXT1lfXJldHVybiBofWdldCBjb25kaXRpb24oKXtyZXR1cm4gdGhpcy5zWzBdL3RoaXMuc1tNYXRoLm1pbih0aGlzLm0sdGhpcy5uKS0xXX1nZXQgbm9ybTIoKXtyZXR1cm4gdGhpcy5zWzBdfWdldCByYW5rKCl7Zm9yKHZhciB0PU1hdGgubWF4KHRoaXMubSx0aGlzLm4pKnRoaXMuc1swXSpOdW1iZXIuRVBTSUxPTixyPTAsZT10aGlzLnMsbj0wLGk9ZS5sZW5ndGg7bjxpO24rKyllW25dPnQmJnIrKztyZXR1cm4gcn1nZXQgZGlhZ29uYWwoKXtyZXR1cm4gdGhpcy5zfWdldCB0aHJlc2hvbGQoKXtyZXR1cm4gTnVtYmVyLkVQU0lMT04vMipNYXRoLm1heCh0aGlzLm0sdGhpcy5uKSp0aGlzLnNbMF19Z2V0IGxlZnRTaW5ndWxhclZlY3RvcnMoKXtyZXR1cm4gSS5pc01hdHJpeCh0aGlzLlUpfHwodGhpcy5VPW5ldyBJKHRoaXMuVSkpLHRoaXMuVX1nZXQgcmlnaHRTaW5ndWxhclZlY3RvcnMoKXtyZXR1cm4gSS5pc01hdHJpeCh0aGlzLlYpfHwodGhpcy5WPW5ldyBJKHRoaXMuVikpLHRoaXMuVn1nZXQgZGlhZ29uYWxNYXRyaXgoKXtyZXR1cm4gSS5kaWFnKHRoaXMucyl9fWZ1bmN0aW9uIGModCxyLGUpe3ZhciBuPWU/dC5yb3dzOnQucm93cy0xO2lmKHI8MHx8cj5uKXRocm93IG5ldyBSYW5nZUVycm9yKCJSb3cgaW5kZXggb3V0IG9mIHJhbmdlIil9ZnVuY3Rpb24gbSh0LHIsZSl7dmFyIG49ZT90LmNvbHVtbnM6dC5jb2x1bW5zLTE7aWYocjwwfHxyPm4pdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkNvbHVtbiBpbmRleCBvdXQgb2YgcmFuZ2UiKX1mdW5jdGlvbiBnKHQscil7aWYoci50bzFEQXJyYXkmJihyPXIudG8xREFycmF5KCkpLHIubGVuZ3RoIT09dC5jb2x1bW5zKXRocm93IG5ldyBSYW5nZUVycm9yKCJ2ZWN0b3Igc2l6ZSBtdXN0IGJlIHRoZSBzYW1lIGFzIHRoZSBudW1iZXIgb2YgY29sdW1ucyIpO3JldHVybiByfWZ1bmN0aW9uIHYodCxyKXtpZihyLnRvMURBcnJheSYmKHI9ci50bzFEQXJyYXkoKSksci5sZW5ndGghPT10LnJvd3MpdGhyb3cgbmV3IFJhbmdlRXJyb3IoInZlY3RvciBzaXplIG11c3QgYmUgdGhlIHNhbWUgYXMgdGhlIG51bWJlciBvZiByb3dzIik7cmV0dXJuIHJ9ZnVuY3Rpb24gcCh0LHIsZSl7cmV0dXJue3Jvdzp3KHQsciksY29sdW1uOmQodCxlKX19ZnVuY3Rpb24gdyh0LHIpe2lmKCJvYmplY3QiIT10eXBlb2Ygcil0aHJvdyBuZXcgVHlwZUVycm9yKCJ1bmV4cGVjdGVkIHR5cGUgZm9yIHJvdyBpbmRpY2VzIik7aWYoci5zb21lKHI9PnI8MHx8cj49dC5yb3dzKSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigicm93IGluZGljZXMgYXJlIG91dCBvZiByYW5nZSIpO3JldHVybiBBcnJheS5pc0FycmF5KHIpfHwocj1BcnJheS5mcm9tKHIpKSxyfWZ1bmN0aW9uIGQodCxyKXtpZigib2JqZWN0IiE9dHlwZW9mIHIpdGhyb3cgbmV3IFR5cGVFcnJvcigidW5leHBlY3RlZCB0eXBlIGZvciBjb2x1bW4gaW5kaWNlcyIpO2lmKHIuc29tZShyPT5yPDB8fHI+PXQuY29sdW1ucykpdGhyb3cgbmV3IFJhbmdlRXJyb3IoImNvbHVtbiBpbmRpY2VzIGFyZSBvdXQgb2YgcmFuZ2UiKTtyZXR1cm4gQXJyYXkuaXNBcnJheShyKXx8KHI9QXJyYXkuZnJvbShyKSkscn1mdW5jdGlvbiB5KHQscixlLG4saSl7aWYoNSE9PWFyZ3VtZW50cy5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoImV4cGVjdGVkIDQgYXJndW1lbnRzIik7aWYoYigic3RhcnRSb3ciLHIpLGIoImVuZFJvdyIsZSksYigic3RhcnRDb2x1bW4iLG4pLGIoImVuZENvbHVtbiIsaSkscj5lfHxuPml8fHI8MHx8cj49dC5yb3dzfHxlPDB8fGU+PXQucm93c3x8bjwwfHxuPj10LmNvbHVtbnN8fGk8MHx8aT49dC5jb2x1bW5zKXRocm93IG5ldyBSYW5nZUVycm9yKCJTdWJtYXRyaXggaW5kaWNlcyBhcmUgb3V0IG9mIHJhbmdlIil9ZnVuY3Rpb24gYih0LHIpe2lmKCJudW1iZXIiIT10eXBlb2Ygcil0aHJvdyBuZXcgVHlwZUVycm9yKGAke3R9IG11c3QgYmUgYSBudW1iZXJgKX1jbGFzcyBNIGV4dGVuZHMoQygpKXtjb25zdHJ1Y3Rvcih0LHIsZSl7c3VwZXIoKSx0aGlzLm1hdHJpeD10LHRoaXMucm93cz1yLHRoaXMuY29sdW1ucz1lfXN0YXRpYyBnZXRbU3ltYm9sLnNwZWNpZXNdKCl7cmV0dXJuIEl9fWNsYXNzIHggZXh0ZW5kcyBNe2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQsdC5jb2x1bW5zLHQucm93cyl9c2V0KHQscixlKXtyZXR1cm4gdGhpcy5tYXRyaXguc2V0KHIsdCxlKSx0aGlzfWdldCh0LHIpe3JldHVybiB0aGlzLm1hdHJpeC5nZXQocix0KX19Y2xhc3MgUyBleHRlbmRzIE17Y29uc3RydWN0b3IodCxyKXtzdXBlcih0LDEsdC5jb2x1bW5zKSx0aGlzLnJvdz1yfXNldCh0LHIsZSl7cmV0dXJuIHRoaXMubWF0cml4LnNldCh0aGlzLnJvdyxyLGUpLHRoaXN9Z2V0KHQscil7cmV0dXJuIHRoaXMubWF0cml4LmdldCh0aGlzLnJvdyxyKX19Y2xhc3MgRSBleHRlbmRzIE17Y29uc3RydWN0b3IodCxyLGUsbixpKXt5KHQscixlLG4saSksc3VwZXIodCxlLXIrMSxpLW4rMSksdGhpcy5zdGFydFJvdz1yLHRoaXMuc3RhcnRDb2x1bW49bn1zZXQodCxyLGUpe3JldHVybiB0aGlzLm1hdHJpeC5zZXQodGhpcy5zdGFydFJvdyt0LHRoaXMuc3RhcnRDb2x1bW4rcixlKSx0aGlzfWdldCh0LHIpe3JldHVybiB0aGlzLm1hdHJpeC5nZXQodGhpcy5zdGFydFJvdyt0LHRoaXMuc3RhcnRDb2x1bW4rcil9fWNsYXNzIFIgZXh0ZW5kcyBNe2NvbnN0cnVjdG9yKHQscixlKXt2YXIgbj1wKHQscixlKTtzdXBlcih0LG4ucm93Lmxlbmd0aCxuLmNvbHVtbi5sZW5ndGgpLHRoaXMucm93SW5kaWNlcz1uLnJvdyx0aGlzLmNvbHVtbkluZGljZXM9bi5jb2x1bW59c2V0KHQscixlKXtyZXR1cm4gdGhpcy5tYXRyaXguc2V0KHRoaXMucm93SW5kaWNlc1t0XSx0aGlzLmNvbHVtbkluZGljZXNbcl0sZSksdGhpc31nZXQodCxyKXtyZXR1cm4gdGhpcy5tYXRyaXguZ2V0KHRoaXMucm93SW5kaWNlc1t0XSx0aGlzLmNvbHVtbkluZGljZXNbcl0pfX1jbGFzcyBrIGV4dGVuZHMgTXtjb25zdHJ1Y3Rvcih0LHIpe3N1cGVyKHQsKHI9dyh0LHIpKS5sZW5ndGgsdC5jb2x1bW5zKSx0aGlzLnJvd0luZGljZXM9cn1zZXQodCxyLGUpe3JldHVybiB0aGlzLm1hdHJpeC5zZXQodGhpcy5yb3dJbmRpY2VzW3RdLHIsZSksdGhpc31nZXQodCxyKXtyZXR1cm4gdGhpcy5tYXRyaXguZ2V0KHRoaXMucm93SW5kaWNlc1t0XSxyKX19Y2xhc3MgQSBleHRlbmRzIE17Y29uc3RydWN0b3IodCxyKXtyPWQodCxyKSxzdXBlcih0LHQucm93cyxyLmxlbmd0aCksdGhpcy5jb2x1bW5JbmRpY2VzPXJ9c2V0KHQscixlKXtyZXR1cm4gdGhpcy5tYXRyaXguc2V0KHQsdGhpcy5jb2x1bW5JbmRpY2VzW3JdLGUpLHRoaXN9Z2V0KHQscil7cmV0dXJuIHRoaXMubWF0cml4LmdldCh0LHRoaXMuY29sdW1uSW5kaWNlc1tyXSl9fWNsYXNzIE4gZXh0ZW5kcyBNe2NvbnN0cnVjdG9yKHQscil7c3VwZXIodCx0LnJvd3MsMSksdGhpcy5jb2x1bW49cn1zZXQodCxyLGUpe3JldHVybiB0aGlzLm1hdHJpeC5zZXQodCx0aGlzLmNvbHVtbixlKSx0aGlzfWdldCh0KXtyZXR1cm4gdGhpcy5tYXRyaXguZ2V0KHQsdGhpcy5jb2x1bW4pfX1jbGFzcyBWIGV4dGVuZHMgTXtjb25zdHJ1Y3Rvcih0KXtzdXBlcih0LHQucm93cyx0LmNvbHVtbnMpfXNldCh0LHIsZSl7cmV0dXJuIHRoaXMubWF0cml4LnNldCh0aGlzLnJvd3MtdC0xLHIsZSksdGhpc31nZXQodCxyKXtyZXR1cm4gdGhpcy5tYXRyaXguZ2V0KHRoaXMucm93cy10LTEscil9fWNsYXNzIHogZXh0ZW5kcyBNe2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQsdC5yb3dzLHQuY29sdW1ucyl9c2V0KHQscixlKXtyZXR1cm4gdGhpcy5tYXRyaXguc2V0KHQsdGhpcy5jb2x1bW5zLXItMSxlKSx0aGlzfWdldCh0LHIpe3JldHVybiB0aGlzLm1hdHJpeC5nZXQodCx0aGlzLmNvbHVtbnMtci0xKX19ZnVuY3Rpb24gQyh0KXt2b2lkIDA9PT10JiYodD1PYmplY3QpO2NsYXNzIHIgZXh0ZW5kcyB0e3N0YXRpYyBnZXRbU3ltYm9sLnNwZWNpZXNdKCl7cmV0dXJuIHRoaXN9c3RhdGljIGZyb20xREFycmF5KHQscixlKXtpZih0KnIhPT1lLmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiRGF0YSBsZW5ndGggZG9lcyBub3QgbWF0Y2ggZ2l2ZW4g
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment