@curless/sinocare-demo 0.60.0 → 0.62.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +1924 -2216
- package/dist/index.js.map +1 -1
- package/package.json +7 -6
- package/dist/__tests__/checkout-card.test.d.ts +0 -2
- package/dist/__tests__/checkout-card.test.d.ts.map +0 -1
- package/dist/__tests__/checkout-card.test.js +0 -315
- package/dist/__tests__/checkout-card.test.js.map +0 -1
- package/dist/checkout-card.generated.d.ts +0 -2
- package/dist/checkout-card.generated.d.ts.map +0 -1
- package/dist/checkout-card.generated.js +0 -6
- package/dist/checkout-card.generated.js.map +0 -1
- package/dist/index.d.ts +0 -3
- package/dist/index.d.ts.map +0 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../../../packages/internal/sinocare-storefront/src/catalog.ts","../../../packages/internal/sinocare-storefront/src/card.ts","../../../packages/internal/sinocare-storefront/src/checkout.ts","../../../packages/internal/sinocare-storefront/src/instructions.ts","../../../packages/internal/sinocare-storefront/src/tools.ts","../../../packages/internal/sinocare-storefront/src/views.ts","../src/checkout-card.generated.ts"],"sourcesContent":["#!/usr/bin/env node\n// Buyer-side AP2: sign the PaymentMandate as a real ES256 JWS bound to the cart.\nimport { createHash } from 'node:crypto';\nimport { readFileSync, renameSync, rmSync, writeFileSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\n// What this storefront and the wallet connector say and show in common — the\n// aisles, the card metadata, the model instructions, the twelve shared tools,\n// and the catalogue/order views. Private to this repo, so it is bundled into\n// dist rather than resolved by name (see tsup.config.ts).\nimport {\n CARD_MIME,\n type CheckoutGroup,\n type Product,\n type ToolDef,\n buildInstructions,\n categoryQuery,\n checkoutView,\n ordersView,\n priceDisplayOf,\n productsView,\n resolveProduct,\n servesCardUri,\n storefrontTools,\n uiMeta,\n widgetMeta,\n} from '@agentbank/sinocare-storefront';\n// Buyer-side MPP · Tempo — parse the 402 challenge, pay the on-chain TIP-20\n// transfer, build the Payment credential. Same SDK, different subpath.\nimport {\n type AcpClientOptions,\n completeCheckout,\n purchaseOf,\n readCheckoutSession,\n totalOf,\n} from '@curless/agentbank-protocols/acp';\nimport {\n type Ap2IntentMandate,\n signIntentMandate,\n signPaymentMandate,\n} from '@curless/agentbank-protocols/ap2';\n// Buyer-side USDC-over-Solana x402 — build + partially sign an SPL transfer, the\n// facilitator co-signs feePayer + submits. Same SDK, different subpath.\nimport {\n type SolanaX402Requirements,\n addressFromSecretKey,\n secretKeyFromString,\n signSolanaX402Payment,\n} from '@curless/agentbank-protocols/solana';\nimport { payMppTempoChallenge } from '@curless/agentbank-protocols/tempo';\n// Buyer-side x402 lives in the SDK — sign EIP-3009, encode X-PAYMENT, read USDC\n// balance. The demo never hand-rolls the signing.\nimport {\n type Eip712Signer,\n type X402PaymentRequirements,\n cdpAccountSigner,\n encodeXPaymentHeader,\n signX402Payment,\n signerFromPrivateKey,\n usdcBalance,\n} from '@curless/agentbank-protocols/x402';\n// Buyer-side RLUSD/XRPL x402 — sign an Ed25519 Payment, encode X-PAYMENT. Same\n// SDK, different subpath. encodeXPaymentHeader collides with /x402's, so alias it.\nimport {\n type XrplPaymentRequirements,\n encodeXPaymentHeader as encodeXrplXPaymentHeader,\n signXrplPayment,\n} from '@curless/agentbank-protocols/xrpl';\nimport { type PaymentCredential, createBuyerSession } from '@curless/agentbank-sdk';\nimport { Server } from '@modelcontextprotocol/sdk/server/index.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport {\n CallToolRequestSchema,\n ListResourcesRequestSchema,\n ListToolsRequestSchema,\n ReadResourceRequestSchema,\n} from '@modelcontextprotocol/sdk/types.js';\nimport type { Hex } from 'viem';\nimport { generatePrivateKey } from 'viem/accounts';\nimport { Client as XrplClient, Wallet as XrplWallet } from 'xrpl';\n// The checkout MCP App card (a single self-contained HTML), built from\n// examples/sinocare-demo/widget and served as a ui:// resource.\nimport { CHECKOUT_CARD_HTML } from './checkout-card.generated.js';\n\n// @curless/sinocare-demo — a SIMULATED \"Sinocare\" storefront MCP for the BUYER.\n// Booking is end-to-end agentic:\n// 1. browse + start a booking via Sinocare's merchant backend\n// (mcp.curless.ai/sinocare) — the merchant prices it and opens a\n// merchant-quoted ACP checkout session with its own key;\n// 2. THIS buyer agent completes the charge over ACP with its own payment\n// credential (test card) — the merchant set the price, the agent pays.\n// The storefront never sees the merchant's key; it holds only its OWN buyer\n// token, exactly like a real agent buyer.\n//\n// Run (Claude Desktop / any MCP client):\n// npx -y @curless/sinocare-demo\n// with env:\n// AGENTBANK_AGENT_TOKEN the buyer's agentbank agent key (agb_…, agent:execute).\n// SINOCARE_BUYER_NAME / SINOCARE_BUYER_EMAIL who this agent buys for (optional;\n// unset = anonymous bookings, as before)\n// Use a TEST, no-org key (the demo org is shared).\n// AGENTBANK_API_URL base URL (default https://mcp.curless.ai; set\n// http://localhost:3000 for local dev).\n// AGENTBANK_PAYMENT_TOKEN delegated card token (default pm_card_visa).\n// Real ACP credential (optional) — mint a Shared Payment Token per booking\n// instead of reusing a plain card token. This is what a buyer's WALLET does\n// when an agent asks to spend: the token is scoped to one seller, one amount,\n// one currency and a short expiry, so it can buy nothing else.\n// STRIPE_AGENT_SECRET_KEY the BUYER side's Stripe key (the wallet's PSP).\n// Must be a DIFFERENT Stripe account from the\n// seller's — an SPT cannot be granted to yourself.\n// AGENTBANK_SELLER_PROFILE the seller's Stripe profile id (profile_…) that\n// the gateway redeems with.\n// STRIPE_AGENT_PAYMENT_METHOD optional pm_… to mint from; in test mode a\n// throwaway one is created from tok_visa.\n// Set all of these and buy_sinocare_product_acp pays with a real spt_; leave\n// them unset and it falls back to AGENTBANK_PAYMENT_TOKEN.\n// Two guards, both OFF by default — a booking here is one click in the card,\n// and a Sinocare room is €1,280–2,900:\n// SINOCARE_ALLOW_LIVE_WALLET=1 allow minting with a LIVE key (REAL money).\n// SINOCARE_WALLET_FALLBACK=1 if minting fails, pay with the plain card\n// token instead of failing the booking.\n// Without them a live key refuses to mint, and a mint failure fails the\n// booking rather than silently paying with an unscoped credential.\n// x402 USDC (EVM) — pick ONE signer:\n// X402_SIGNER=cdp a CDP Server Wallet, zero raw key (for MAINNET);\n// needs CDP_API_KEY_ID/_SECRET/_WALLET_SECRET.\n// X402_PAYER_PRIVATE_KEY a local funded wallet key (testnet or mainnet).\n// The gateway's mode (test/live key) decides the network it quotes; fund the\n// buyer wallet with USDC on that network.\n// x402 RLUSD (XRP Ledger) — for buy_sinocare_product_rlusd / xrpl_buyer_wallet:\n// XRPL_BUYER_SEED an `sEd…` testnet seed (Ed25519) holding RLUSD + a\n// little test XRP for the fee/reserve.\n// XRPL_TESTNET_WSS RPC (default wss://s.altnet.rippletest.net:51233).\n// XRPL_RLUSD_ISSUER RLUSD issuer r-address (default = testnet issuer).\n//\n// IMPORTANT: only JSON-RPC may be written to stdout (the MCP stdio transport).\n// Never console.log here — diagnostics go to stderr.\n\nconst API_BASE = (process.env.AGENTBANK_API_URL ?? 'https://mcp.curless.ai').replace(/\\/$/, '');\nconst SINOCARE = `${API_BASE}/sinocare`;\n\n// The buyer's ACP client. Every booking below reads the session's real total\n// and completes through this rather than hand-writing /acp/... — the two calls\n// were written out twice already, and both copies re-derived that the\n// authoritative amount is on the session, not in the backend's display string.\nconst acp = (merchantId: string): AcpClientOptions => {\n // Throw rather than send an empty bearer. Every caller below already refuses\n // to open a checkout without a token, so reaching here without one is a bug\n // in this file — and an empty Authorization header would surface as a 401\n // from the gateway, which reads like a credential problem on the buyer's end.\n if (!TOKEN) throw new Error('AGENTBANK_AGENT_TOKEN is not set');\n return { baseUrl: API_BASE, merchantId, token: TOKEN };\n};\nconst TOKEN = process.env.AGENTBANK_AGENT_TOKEN;\n\n// WHO this agent is buying for. A buyer agent is the only party that knows its\n// user's identity — the merchant never meets them — so it is the only place this\n// can enter the system. Sent on every checkout, and from there it reaches the\n// order, the card provider's customer record, the Curless mirror and the Shopify\n// order.\n//\n// Unset → nothing is sent, and every booking stays anonymous exactly as before.\n// Deliberately NOT defaulted to a placeholder: a fabricated buyer would travel\n// into a merchant's financial records and Shopify would email the address.\nconst BUYER = (() => {\n const name = process.env.SINOCARE_BUYER_NAME?.trim();\n const email = process.env.SINOCARE_BUYER_EMAIL?.trim();\n if (!name && !email) return undefined;\n return { ...(name ? { name } : {}), ...(email ? { email } : {}) };\n})();\nconst PAYMENT_TOKEN = process.env.AGENTBANK_PAYMENT_TOKEN ?? 'pm_card_visa';\nconst STRIPE_AGENT_KEY = process.env.STRIPE_AGENT_SECRET_KEY;\nconst SELLER_PROFILE = process.env.AGENTBANK_SELLER_PROFILE;\n\n// The BUYER's Curless wallet, signed into at runtime by the person booking —\n// not configuration. Two ways to pay by card now sit side by side: the agent's\n// own Stripe key (STRIPE_AGENT_SECRET_KEY above, the demo's original path), and\n// this, where the credential is minted from the card the buyer bound and capped\n// by the limits the buyer set. Both stay: the wallet is the one being built,\n// and the agent-key path is what still works when nobody has signed in.\nconst wallet = createBuyerSession({ baseUrl: API_BASE });\n\n// One browser sign-in at a time, shared by whoever asks. Two cards (or a card\n// and the model) each starting their own would show the person two different\n// codes for the same wallet, and only one of them would ever complete.\nlet pending: Awaited<ReturnType<typeof wallet.startDeviceLogin>> | null = null;\n\n/**\n * The signed-in wallet owner, as a buyer block — or undefined when nobody is\n * signed in (the agent-key ACP path, which keeps SINOCARE_BUYER_EMAIL).\n */\nconst walletBuyer = (): { buyer: { email: string; name?: string } } | undefined => {\n const who = wallet.current();\n if (!who) return undefined;\n return { buyer: { email: who.email, ...(who.name ? { name: who.name } : {}) } };\n};\n\n// Whether a sign-in was ever STARTED here. `pending` alone cannot say: it is\n// null both before anyone begins and after one times out, and reporting those\n// two as the same thing is how \"nobody has signed in yet\" got told to someone\n// as \"your code expired\".\nlet loginEverStarted = false;\n\nconst pendingLogin = async (): Promise<NonNullable<typeof pending>> => {\n if (pending) return pending;\n const started = await wallet.startDeviceLogin();\n pending = started;\n loginEverStarted = true;\n // The session adopts itself when the person finishes; this just clears the\n // slot so a later sign-in starts fresh. Errors are the poller's to report —\n // swallowing them here would leave a dead login pinned forever.\n started\n .wait()\n .catch(() => undefined)\n .finally(() => {\n pending = null;\n });\n return started;\n};\n\n// The gateway's spend-policy reasons, said to the PERSON. Mirrors the codes\n// `evaluatePolicy` emits; anything unmapped falls through to the gateway's own\n// wording rather than being swallowed, so a new code shows up as English text\n// instead of disappearing.\n// The gateway's refusals, said to the PERSON — each with its OWN next step.\n// One shared \"想付的话可以先调高限额\" tail was wrong for every reason that is\n// not a limit: it told someone whose wallet has no card at all to go raise a\n// cap, which sends them to the wrong screen and leaves the actual problem\n// unmentioned.\nconst REFUSALS: Array<[RegExp, string, string]> = [\n [/per_transaction_limit/, '超过了你设的单笔上限', '可以在钱包里调高单笔上限。'],\n [/daily_limit/, '超过了你设的当日上限', '可以调高当日上限,或者明天再来。'],\n [/monthly_limit/, '超过了你设的当月上限', '可以调高当月上限,或者下个月再来。'],\n [/merchant_not_allowed/, '这个商家不在你的白名单里', '把它加进白名单就能付。'],\n [/mcc_not_allowed/, '这个商家类别不在你的白名单里', '把这个类别加进白名单就能付。'],\n [\n /no approval step yet/,\n '金额超过了你设的\"需要我批准\"的门槛,而现在还没有审批环节',\n '把这个门槛调高或清掉就能付。',\n ],\n [/no card is bound/, '这个钱包还没绑卡', '去钱包页面绑一张卡再回来付。'],\n];\n\n// A wallet refusal is not a payment failure, and the difference matters to the\n// person: nothing was charged. Rendered through the card's `message`, so it has\n// to be JSON and it has to be readable.\nconst walletRefusal = (\n err: Error,\n): { content: Array<{ type: 'text'; text: string }>; isError: true } => {\n const raw = err.message;\n const hit = REFUSALS.find(([re]) => re.test(raw));\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n walletRefused: true,\n message: hit\n ? `钱包没付这笔 —— ${hit[1]}。没有扣款。${hit[2]}`\n : `钱包没付这笔:${raw}。没有扣款。`,\n // The wallet page is where every one of these is fixed, so the card\n // can hand the person somewhere to go rather than a dead end.\n walletUrl: `${API_BASE}/buyer/wallet`,\n next: \"this is the BUYER'S OWN limit, not a payment failure. Tell them which limit stopped it and offer to raise it with wallet_set_limits — do NOT retry with another payment method.\",\n }),\n },\n ],\n isError: true,\n };\n};\nconst AGENT_PM = process.env.STRIPE_AGENT_PAYMENT_METHOD;\nconst STRIPE_AGENT_SECRET_KEY_IS_LIVE = !!STRIPE_AGENT_KEY?.startsWith('sk_live_');\n// Two deliberate escape hatches, both off by default:\n// SINOCARE_ALLOW_LIVE_WALLET=1 — mint with a live key (real money, see below).\n// SINOCARE_WALLET_FALLBACK=1 — if minting fails, pay with the plain card\n// token anyway instead of failing the booking.\nconst WALLET_LIVE_OK = process.env.SINOCARE_ALLOW_LIVE_WALLET === '1';\nconst WALLET_FALLBACK_OK = process.env.SINOCARE_WALLET_FALLBACK === '1';\n\n// Mint a REAL ACP Shared Payment Token for exactly this booking — the buyer\n// wallet's half of agentic commerce. Scoped to the seller's profile, this\n// amount, this currency, 15 minutes; the agent can spend it nowhere else.\n// Returns null when the wallet side isn't configured, so the demo falls back to\n// the plain card token it has always used. Plain fetch — no Stripe SDK here.\n// ⚠️ The throwaway card is minted FRESH per booking, deliberately. A\n// PaymentMethod built from a single-use token (tok_visa) and never attached to\n// a Customer is CONSUMED once a PaymentIntent draws on it — Stripe then refuses\n// to issue an SPT against it (\"The payment method is in a consumed or deleted\n// state\"). Caching one per process therefore broke every booking after the\n// first. One extra test-mode API call per booking is the price of a wallet that\n// works twice.\n\nconst mintSharedPaymentToken = async (\n amountMinor: number,\n currency: string,\n): Promise<string | null> => {\n if (!STRIPE_AGENT_KEY || !SELLER_PROFILE) return null;\n // A live key here means a booking charges a REAL card for the full product\n // price (€1,280–2,900) the moment someone clicks pay in the card — with no\n // confirmation step anywhere. Refuse unless that is explicitly what you want.\n if (STRIPE_AGENT_SECRET_KEY_IS_LIVE && !WALLET_LIVE_OK) {\n throw new Error(\n 'refusing to mint with a LIVE Stripe key — a booking would charge a real card for the full product price. Set SINOCARE_ALLOW_LIVE_WALLET=1 if that is genuinely intended.',\n );\n }\n const post = async (\n path: string,\n body: Record<string, string>,\n preview = false,\n ): Promise<Record<string, unknown>> => {\n const res = await fetch(`https://api.stripe.com/v1/${path}`, {\n method: 'POST',\n headers: {\n authorization: `Bearer ${STRIPE_AGENT_KEY}`,\n 'content-type': 'application/x-www-form-urlencoded',\n ...(preview ? { 'stripe-version': '2026-04-22.preview' } : {}),\n },\n body: new URLSearchParams(body),\n });\n const json = (await res.json()) as { id?: string; error?: { message?: string } };\n if (!res.ok) throw new Error(`stripe ${path} -> ${res.status}: ${json.error?.message ?? ''}`);\n return json as Record<string, unknown>;\n };\n // The card the token draws on. A real wallet uses the customer's saved card;\n // in test mode a fresh throwaway one stands in for every booking (see above).\n const pm =\n AGENT_PM ??\n String((await post('payment_methods', { type: 'card', 'card[token]': 'tok_visa' })).id);\n const spt = await post(\n 'shared_payment/issued_tokens',\n {\n payment_method: pm,\n 'seller_details[network_business_profile]': SELLER_PROFILE,\n 'usage_limits[currency]': currency.toLowerCase(),\n 'usage_limits[max_amount]': String(amountMinor),\n 'usage_limits[expires_at]': String(Math.floor(Date.now() / 1000) + 900),\n },\n true,\n ).catch((err: unknown) => {\n // A PINNED card hits the same one-shot wall, and there we can't just mint a\n // new one — say so instead of surfacing Stripe's bare message.\n if (AGENT_PM && /consumed or deleted/i.test(String(err))) {\n throw new Error(\n `STRIPE_AGENT_PAYMENT_METHOD (${AGENT_PM}) is spent — a payment method built from a single-use token can back exactly one charge. Unset it and the demo mints a fresh throwaway card per booking, or pin one attached to a Customer.`,\n );\n }\n throw err;\n });\n return String(spt.id);\n};\n\n// Sinocare backend (public — no buyer token; the merchant key lives there).\nconst backend = async <T>(path: string, init: RequestInit = {}): Promise<T> => {\n const res = await fetch(`${SINOCARE}${path}`, {\n ...init,\n headers: { 'content-type': 'application/json', ...(init.headers ?? {}) },\n });\n if (!res.ok) {\n throw new Error(\n `sinocare-backend ${path} -> ${res.status}: ${await res.text().catch(() => '')}`,\n );\n }\n return (await res.json()) as T;\n};\n\n// --- x402 (stablecoin) payment --------------------------------------------\n// x402 settles USDC. The amount is now MERCHANT-QUOTED: sinocare-backend opens a\n// merchant-quoted x402 session via the SDK and sets the USDC price (a small\n// fixed test charge on testnet). The buyer just signs + pays the session — it\n// never computes or passes the amount.\n\n// The buyer's x402 signer, resolved once and cached:\n// • X402_SIGNER=cdp → a Coinbase CDP Server Wallet (zero raw key; for\n// mainnet — needs CDP_API_KEY_ID/_SECRET/_WALLET_SECRET)\n// • X402_PAYER_PRIVATE_KEY → a local key (testnet/mainnet)\n// • neither → null (signX402 falls back to a throwaway key,\n// which only settles under a STUB facilitator)\n// Returning the Eip712Signer (address + signTypedData) lets both the balance\n// pre-flight and the wallet tool read .address regardless of signer kind.\nconst useCdpSigner = process.env.X402_SIGNER === 'cdp';\nlet buyerSignerPromise: Promise<Eip712Signer | null> | undefined;\nconst buyerSigner = (): Promise<Eip712Signer | null> => {\n buyerSignerPromise ??= (async () => {\n if (useCdpSigner) return cdpAccountSigner();\n const k = process.env.X402_PAYER_PRIVATE_KEY as Hex | undefined;\n return k ? signerFromPrivateKey(k) : null;\n })();\n return buyerSignerPromise;\n};\nconst fmtUsdc = (baseUnits: bigint): string => `${(Number(baseUnits) / 1e6).toFixed(2)} USDC`;\n\n// Answer an x402 402 challenge: sign an EIP-3009 transferWithAuthorization (via\n// the buyer x402 SDK) → base64 X-PAYMENT header. With a REAL facilitator (Base\n// Sepolia or mainnet) the signer must hold USDC on that chain — configure a CDP\n// wallet or X402_PAYER_PRIVATE_KEY; without either a throwaway key signs, which\n// only settles under a STUB facilitator.\nconst signX402 = async (r: X402PaymentRequirements): Promise<string> => {\n const signer = (await buyerSigner()) ?? (await signerFromPrivateKey(generatePrivateKey()));\n return encodeXPaymentHeader(await signX402Payment({ signer, requirements: r }));\n};\n\n// --- RLUSD (XRP Ledger) x402 payment --------------------------------------\n// The buyer's XRPL wallet, from XRPL_BUYER_SEED (an `sEd…` seed → Ed25519). A\n// real buyer holds this in a wallet; the demo derives it from env. Null when\n// unset — the RLUSD tool then tells the user to configure it. Unlike USDC there\n// is no throwaway fallback: settling RLUSD needs a funded, trust-lined account.\nconst XRPL_SEED = process.env.XRPL_BUYER_SEED;\nconst XRPL_RPC = process.env.XRPL_TESTNET_WSS ?? 'wss://s.altnet.rippletest.net:51233';\nlet xrplWalletCache: XrplWallet | null = null;\nconst xrplBuyer = (): XrplWallet | null => {\n if (xrplWalletCache) return xrplWalletCache;\n if (!XRPL_SEED) return null;\n xrplWalletCache = XrplWallet.fromSeed(XRPL_SEED);\n return xrplWalletCache;\n};\n\n// USDC-over-Solana buyer: SOLANA_BUYER_SECRET is a devnet Solana secret key (a\n// solana-keygen JSON array or a base58 string) holding devnet USDC. Cached as a\n// promise (base58 decode is async). SOLANA_RPC fetches balances + a blockhash.\nconst SOLANA_RPC = process.env.SOLANA_RPC_URL ?? 'https://api.devnet.solana.com';\nlet solanaSecretPromise: Promise<Uint8Array | null> | undefined;\nconst solanaBuyerSecret = (): Promise<Uint8Array | null> => {\n solanaSecretPromise ??= (async () => {\n const s = process.env.SOLANA_BUYER_SECRET;\n if (!s) return null;\n try {\n return await secretKeyFromString(s);\n } catch {\n return null;\n }\n })();\n return solanaSecretPromise;\n};\n\n// The buyer's USDC balance (base units) across its token accounts for a mint, via\n// a raw Solana JSON-RPC call (no SPL SDK). null on any RPC error → skip pre-flight.\nconst solanaUsdcBalance = async (owner: string, mint: string): Promise<number | null> => {\n try {\n const res = await fetch(SOLANA_RPC, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({\n jsonrpc: '2.0',\n id: 1,\n method: 'getTokenAccountsByOwner',\n params: [owner, { mint }, { encoding: 'jsonParsed' }],\n }),\n });\n // biome-ignore lint/suspicious/noExplicitAny: raw JSON-RPC shape\n const j = (await res.json()) as any;\n const accounts = j?.result?.value ?? [];\n let total = 0;\n for (const a of accounts) {\n total += Number(a?.account?.data?.parsed?.info?.tokenAmount?.amount ?? 0);\n }\n return total;\n } catch {\n return null;\n }\n};\n\n// Skyfire KYAPay — the BUYER mints a Skyfire-SIGNED PAY token (Skyfire's key signs\n// it; unlike the crypto rails the buyer can't self-sign) and presents it to the\n// MERCHANT backend, which charges it via the merchant SDK. SKYFIRE_BUYER_API_KEY\n// mints (buyer agent key from the Skyfire dashboard); SKYFIRE_SELLER_SERVICE_ID is\n// the seller service the payment authorizes. The agentbank key that verifies +\n// charges is the MERCHANT backend's, not the demo's.\nconst SKYFIRE_API = process.env.SKYFIRE_API_URL ?? 'https://api.skyfire.xyz';\nconst SKYFIRE_BUYER_API_KEY = process.env.SKYFIRE_BUYER_API_KEY;\nconst SKYFIRE_SELLER_SERVICE_ID = process.env.SKYFIRE_SELLER_SERVICE_ID;\n// A small fixed test charge (USD quote → settles USDC). Pin with SKYFIRE_TEST_AMOUNT.\n// 0.001 keeps each test charge tiny so a small Skyfire balance covers many runs.\nconst SKYFIRE_TEST_AMOUNT = process.env.SKYFIRE_TEST_AMOUNT ?? '0.001';\n\n// --- MPP · Tempo — on-chain TIP-20 settlement (Tempo payments chain, testnet) ---\n// MPP's `tempo` method: agentbank answers with a 402 whose signed challenge carries\n// the on-chain terms; the buyer wallet (TEMPO_BUYER_PRIVATE_KEY, funded pathUSD via\n// the Tempo faucet) pays with transferWithMemo; agentbank verifies the transfer\n// on-chain by tx hash. The buyer side (pay + credential) is the SDK\n// @curless/agentbank-protocols/tempo — the demo only holds config. A tiny fixed\n// amount so a small balance covers many runs.\nconst TEMPO_RPC = process.env.TEMPO_RPC_URL ?? 'https://rpc.moderato.tempo.xyz';\nconst TEMPO_BUYER_PRIVATE_KEY = process.env.TEMPO_BUYER_PRIVATE_KEY as Hex | undefined;\nconst MPP_TEMPO_TEST_AMOUNT = Number(process.env.MPP_TEMPO_TEST_AMOUNT ?? 10000); // 0.01 pathUSD (6dp)\n\n// Mint a Skyfire PAY token (Skyfire ES256-signs it) authorizing `amountUsd` to our\n// seller service — returned as a JWT the buyer presents in the x-kyapay-token header.\nconst mintSkyfirePayToken = async (amountUsd: string): Promise<string> => {\n if (!SKYFIRE_BUYER_API_KEY) throw new Error('set SKYFIRE_BUYER_API_KEY');\n if (!SKYFIRE_SELLER_SERVICE_ID) throw new Error('set SKYFIRE_SELLER_SERVICE_ID');\n const expiresAt = Math.floor(Date.now() / 1000) + 300;\n const res = await fetch(`${SKYFIRE_API}/api/v1/tokens`, {\n method: 'POST',\n headers: { 'content-type': 'application/json', 'skyfire-api-key': SKYFIRE_BUYER_API_KEY },\n body: JSON.stringify({\n type: 'pay',\n buyerTag: `sinocare-${Date.now()}`,\n tokenAmount: amountUsd,\n sellerServiceId: SKYFIRE_SELLER_SERVICE_ID,\n expiresAt,\n }),\n });\n if (!res.ok) {\n throw new Error(`skyfire mint -> ${res.status}: ${(await res.text()).slice(0, 200)}`);\n }\n const { token } = (await res.json()) as { token?: string };\n if (!token) throw new Error('skyfire mint returned no token');\n return token;\n};\n\n// Run a callback with a connected XRPL client, always disconnecting after — so a\n// booking opens ONE connection for the balance pre-flight AND the signing autofill\n// instead of one each.\nconst withXrplClient = async <T>(fn: (c: XrplClient) => Promise<T>): Promise<T> => {\n const client = new XrplClient(XRPL_RPC);\n await client.connect();\n try {\n return await fn(client);\n } finally {\n await client.disconnect().catch(() => undefined);\n }\n};\n\n// Read the buyer's balance of an XRPL IOU (RLUSD) via account_lines — the trust\n// line to the issuer for that currency. Returns the decimal string balance, '0'\n// if no trust line / no funds. Uses the caller's connected client.\nconst rlusdBalance = async (\n client: XrplClient,\n owner: string,\n currencyHex: string,\n issuer: string,\n): Promise<string> => {\n try {\n const res = await client.request({ command: 'account_lines', account: owner, peer: issuer });\n const line = res.result.lines.find((l) => l.currency === currencyHex && l.account === issuer);\n return line?.balance ?? '0';\n } catch {\n return '0';\n }\n};\n\n// Answer an XRPL x402 402 challenge: sign a standard Payment (Ed25519, invoice\n// bound as a Memo) via the buyer /xrpl SDK → base64 X-PAYMENT, using the caller's\n// connected client for autofill. The wallet must hold RLUSD + a little test XRP.\nconst signXrpl = async (\n client: XrplClient,\n r: XrplPaymentRequirements,\n wallet: XrplWallet,\n): Promise<string> =>\n encodeXrplXPaymentHeader(await signXrplPayment({ requirements: r, wallet, client }));\n\n// A standing AP2 IntentMandate (delegated booking authority). The user signs it\n// ONCE via authorize_agent_budget; buy_sinocare_product_ucp then attaches it so\n// the agent can complete bookings within the cap without confirming each one.\n// In-memory for the session (a real buyer wallet would persist + re-sign it).\ntype AgentBudget = { mandate: Ap2IntentMandate; maxAmountEur: number; expiresAt: string };\n\n// Persist the standing authorization across restarts. It's a delegation the user\n// signs ONCE (authorize_agent_budget); keeping it only in memory meant a process\n// restart silently dropped the cap, letting an over-budget booking slip through.\n// The mandate is a self-contained signed JWS, so persisting + re-presenting it\n// stays cryptographically valid (we store it, we don't re-sign). Keyed to the\n// agent token so a different buyer can't inherit a stale grant; an expired grant\n// is dropped on load. Override the path with SINOCARE_DEMO_BUDGET_FILE.\nconst BUDGET_FILE =\n process.env.SINOCARE_DEMO_BUDGET_FILE ?? join(homedir(), '.agentbank-sinocare-budget.json');\nconst tokenFp = TOKEN ? createHash('sha256').update(TOKEN).digest('hex').slice(0, 16) : '';\n\nconst saveBudget = (b: AgentBudget | null): void => {\n try {\n // mode 0o600: the file holds a signed IntentMandate (a bearer authorization);\n // keep it owner-only, not world-readable, even in a demo home dir.\n if (b)\n writeFileSync(BUDGET_FILE, JSON.stringify({ tokenFp, budget: b }), {\n encoding: 'utf8',\n mode: 0o600,\n });\n else rmSync(BUDGET_FILE, { force: true });\n } catch {\n /* best-effort: a demo persistence hiccup must never break booking */\n }\n};\n\nconst loadBudget = (): AgentBudget | null => {\n try {\n const saved = JSON.parse(readFileSync(BUDGET_FILE, 'utf8')) as {\n tokenFp?: string;\n budget?: AgentBudget;\n };\n const b = saved.budget;\n // Ignore a grant signed for a different token, or one that has expired.\n if (saved.tokenFp !== tokenFp || !b?.expiresAt || Date.parse(b.expiresAt) < Date.now()) {\n rmSync(BUDGET_FILE, { force: true });\n return null;\n }\n return b;\n } catch {\n return null;\n }\n};\n\nlet agentBudget: AgentBudget | null = loadBudget();\n\n// The last checkout the card was opened for. The MCP-App host doesn't reliably\n// deliver the initial tool result to the widget (it self-heals by re-invoking\n// start_sinocare_checkout with NO args) — so we replay the last pick here, or the\n// card would hang on \"Loading…\". Mirrors the merchant card's read-tools-work-\n// with-empty-args behavior.\ntype CheckoutPick = {\n sku: string;\n name: string;\n priceEur: string;\n quantity: number;\n imageUrl?: string;\n externalShopify?: boolean; // the external link lands on Shopify checkout\n // Has THIS pick been paid? Drives picker-vs-receipt on rehydrate without\n // deleting the booking record — a fresh re-open of an already-booked product\n // stays a picker (booked=false) while its past receipt is kept intact.\n booked?: boolean;\n};\nlet lastCheckout: CheckoutPick | null = null;\n\n// Completed bookings, by sku — so a checkout card that gets REHYDRATED (the host\n// re-invokes start_sinocare_checkout when the user leaves the conversation and\n// comes back) shows the receipt for that product instead of resetting to the\n// payment picker. Booking hands off to the conversation (card → sendMessage →\n// the agent runs buy_sinocare_product_*), so the card's own DOM \"已发起\" note is\n// lost on reload; without this the reloaded card always re-rendered the picker\n// even though the product was already paid for. In-memory for the process (same\n// lifetime + same-process assumption as lastCheckout — one long-lived stdio\n// server per Claude session). Keyed by sku, which the card passes to book_* with\n// the exact sku it opened the checkout for, so the keys line up. PERSISTED to\n// disk (see below): without that, opening the card from another conversation — a\n// fresh stdio process with an empty map — lost every booking, so a paid product's\n// card rehydrated to the payment picker as if never booked.\ntype BookingReceipt = {\n sku: string;\n name: string;\n protocol?: string;\n total?: string; // human total: amountDisplay / priceEur / paidUsdc / paidRlusd\n status?: string;\n orderId?: string;\n txHash?: string;\n explorer?: string;\n message?: string;\n};\nconst completedBookings = new Map<string, BookingReceipt>();\n\n// Persist the card's checkout state (last pick + booking receipts) across restarts\n// and conversations, so returning to a paid product's card shows its receipt\n// instead of resetting to the picker — and so a fresh \"book it again\" starts\n// clean. Keyed to the agent token so a different buyer starts empty. Override the\n// path with SINOCARE_DEMO_STATE_FILE.\nconst STATE_FILE =\n process.env.SINOCARE_DEMO_STATE_FILE ?? join(homedir(), '.agentbank-sinocare-checkout.json');\nconst saveCheckoutState = (): void => {\n // No buyer token → no stable identity to key on. Persisting under an empty\n // tokenFp would pool every anonymous buyer into one shared file (and let one\n // clobber another), so keep this session's state in memory only.\n if (!tokenFp) return;\n try {\n // Read-merge-write: a sibling process (another conversation for the SAME\n // buyer) may have booked between our startup snapshot and now. Union its\n // bookings with ours — ours wins ties (we just acted) — so our stale\n // snapshot never clobbers a booking another conversation recorded.\n const merged = new Map(completedBookings);\n try {\n const disk = JSON.parse(readFileSync(STATE_FILE, 'utf8')) as {\n tokenFp?: string;\n bookings?: Array<[string, BookingReceipt]>;\n };\n if (disk.tokenFp === tokenFp) {\n for (const [k, v] of disk.bookings ?? []) if (!merged.has(k)) merged.set(k, v);\n }\n } catch {\n /* no readable prior file — just write ours */\n }\n // Fold the union back into memory so this long-lived process also sees a\n // sibling conversation's bookings on its next rehydrate (no restart needed).\n for (const [k, v] of merged) if (!completedBookings.has(k)) completedBookings.set(k, v);\n // Atomic replace: write a temp then rename, so a concurrent reader never\n // observes a half-written file.\n const tmp = `${STATE_FILE}.${process.pid}.tmp`;\n writeFileSync(tmp, JSON.stringify({ tokenFp, lastCheckout, bookings: [...merged] }), {\n encoding: 'utf8',\n mode: 0o600,\n });\n renameSync(tmp, STATE_FILE);\n } catch {\n /* best-effort: a demo persistence hiccup must never break the card */\n }\n};\nif (tokenFp) {\n try {\n const saved = JSON.parse(readFileSync(STATE_FILE, 'utf8')) as {\n tokenFp?: string;\n lastCheckout?: CheckoutPick | null;\n bookings?: Array<[string, BookingReceipt]>;\n };\n // Ignore state saved under a different buyer token.\n if (saved.tokenFp === tokenFp) {\n // ⚠️ `bookings` ONLY. `lastCheckout` is deliberately NOT restored.\n //\n // It exists for one case: a card self-healing with no arguments, where\n // the server replays the last pick so the widget fills instead of\n // hanging. Restored from disk it does that to a card belonging to a\n // DIFFERENT product — restart the app, ask for a new hotel, and the card\n // renders the previous booking's receipt, which reads as having booked\n // something you did not.\n //\n // `bookings` is safe to restore because it is keyed by sku: it is only\n // ever consulted for a product someone actually asked about.\n for (const [k, v] of saved.bookings ?? []) completedBookings.set(k, v);\n }\n } catch {\n /* no persisted state yet — start empty */\n }\n}\n\n// Record a completed booking (only when it actually settled) and return the tool\n// result — so every buy_sinocare_product_* success is remembered for rehydration\n// in ONE place. Pulls the human fields off the result value the tool already\n// built (total shape differs by rail: total / paidUsdc / paidRlusd / priceEur).\nconst finishBooking = (\n sku: string,\n value: Record<string, unknown> & {\n booked?: boolean;\n /**\n * What ACTUALLY paid — required, so a new payment path cannot forget it.\n *\n * The card used to label a receipt with the button the person clicked. When\n * a chosen method could not go through and the booking settled another way,\n * that filed the charge under a method with no part in it: four real\n * payments were shown as \"paid by the Curless wallet\" while the wallet had\n * never been signed in.\n */\n payer: string;\n },\n) => {\n if (sku && value.booked) {\n // Record the sale on the Shopify side, if the catalog is Shopify-backed.\n // Fire-and-forget: the booking already settled through agentbank, so a\n // writeback failure must never affect the tool result. The backend no-ops\n // when Shopify isn't configured, so this is safe to call unconditionally.\n void backend('/shopify-order', {\n method: 'POST',\n body: JSON.stringify({\n sku,\n quantity: value.quantity,\n protocol: value.protocol,\n // Canonical writeback idempotency key: the settled order/PI id (also the\n // searchable Shopify tag), falling back to the checkout session id so\n // EVERY protocol dedups. A missing key means no dedup, and a hung-call\n // re-fire would then create a duplicate Shopify order.\n orderId: value.orderId ?? value.sessionId ?? value.paymentIntentId,\n // So the Shopify order lands under a customer, not anonymously.\n ...(BUYER ? { buyer: BUYER } : {}),\n }),\n }).catch(() => {});\n completedBookings.set(sku, {\n sku,\n name: String(value.product ?? ''),\n protocol: value.protocol as string | undefined,\n total: (value.total ?? value.paidUsdc ?? value.paidRlusd ?? value.priceEur) as\n | string\n | undefined,\n status: value.status as string | undefined,\n orderId: value.orderId as string | undefined,\n txHash: value.txHash as string | undefined,\n explorer: value.explorer as string | undefined,\n message: value.message as string | undefined,\n });\n // Mark this pick as paid so a later rehydrate resolves to the receipt — not\n // by the presence of a booking record (which we now keep across re-opens),\n // but by whether THIS checkout was actually completed.\n if (lastCheckout?.sku === sku) lastCheckout.booked = true;\n saveCheckoutState();\n }\n return text(value);\n};\n\n// ── what the checkout card offers ────────────────────────────────────────────\n/**\n * The two axes agentbank spans (money × protocol), laid out by GROUP.\n *\n * ⚠️ This is SERVER-side now, and that is what lets one card serve both shops:\n * the wallet connector sends its own three rows to the same card. A card that\n * hard-codes the payment table has to be forked per storefront, which is\n * exactly how there came to be two of them.\n *\n * • Curless 钱包 — first, and standing alone. Filing it under \"卡 · Stripe\"\n * would describe the plumbing rather than the choice:\n * everything below is how the AGENT pays, this is how the\n * PERSON pays. Three rows, because there are three\n * genuinely different ways a wallet reaches a merchant,\n * and which applies is decided by what the BUYER has\n * installed. Least-setup-required is last.\n * • 外链 — the other thing a PERSON does: leave the conversation\n * and pay on the merchant's own page.\n * • 卡 · Stripe — ACP / UCP. No coin/chain axis, so the protocol is the row.\n * • 稳定币 · 公链 — USDC·Base / USDC·Solana / RLUSD·XRPL. The chain is\n * independent of the PROTOCOL: bare x402 AND a UCP session\n * both settle any chain, so each row offers the protocol as\n * a sub-choice. UCP therefore appears under both 卡 and\n * 稳定币 — that is the two-axis point.\n * • 稳定币 · Agent 原生 — Skyfire and MPP·Tempo. These are STABLECOINS TOO; they\n * were once titled by protocol, which flipped the axis and\n * made them look like a different KIND of money. Skyfire\n * settles USDC on BASE — the same coin and chain as the\n * x402 row above. What differs is CUSTODY, not the money:\n * x402 = the buyer signs from their OWN wallet (EIP-3009);\n * Skyfire = the buyer PRE-FUNDS a Skyfire wallet and\n * Skyfire signs on their behalf, which is why that rail\n * reports a remaining balance and never a tx hash.\n */\nconst SINOCARE_GROUPS: CheckoutGroup[] = [\n {\n label: 'Curless 钱包',\n rows: [\n {\n title: 'Curless 买家钱包',\n sub: '登录后用自己绑的卡 · 受自己设的限额约束',\n actions: [{ label: '付款', tool: 'buy_sinocare_product_wallet' }],\n },\n {\n title: '钱包连接器(独立 MCP)',\n sub: '你自己装的 Curless 钱包铸凭据 · 在聊天里完成',\n actions: [{ label: '在聊天里付款', tool: 'start_sinocare_wallet_handoff', chat: true }],\n },\n {\n title: '浏览器里确认付款',\n sub: '什么都不用装 · 打开链接看清金额再批准',\n actions: [{ label: '生成付款链接', tool: 'pay_sinocare_hosted' }],\n },\n ],\n },\n {\n label: '外链 · 商家收银台',\n rows: [\n {\n title: 'Shopify / Payment Link',\n sub: '在浏览器里打开商家的收银页 · 卡',\n actions: [{ label: '打开付款页', tool: 'create_sinocare_payment_link', ext: true }],\n },\n ],\n },\n {\n label: '卡 · Stripe',\n rows: [\n {\n title: 'ACP',\n sub: 'Stripe 卡轨 · 对话内',\n actions: [{ label: '付款', tool: 'buy_sinocare_product_acp' }],\n },\n {\n title: 'UCP',\n sub: 'AP2 授权 · Stripe 卡轨 · 对话内',\n actions: [{ label: '付款', tool: 'buy_sinocare_product_ucp', args: { pay: 'card' } }],\n },\n ],\n },\n {\n label: '稳定币 · 公链(x402 / UCP)',\n rows: [\n {\n title: 'USDC · Base',\n sub: 'EVM · EIP-3009 签',\n actions: [\n { label: 'x402', tool: 'buy_sinocare_product_x402' },\n { label: '经 UCP', tool: 'buy_sinocare_product_ucp', args: { pay: 'usdc' } },\n ],\n },\n {\n title: 'USDC · Solana',\n sub: 'SVM · 部分签 · facilitator 代付 gas',\n actions: [\n { label: 'x402', tool: 'buy_sinocare_product_x402', args: { chain: 'solana' } },\n { label: '经 UCP', tool: 'buy_sinocare_product_ucp', args: { pay: 'usdc-sol' } },\n ],\n },\n {\n title: 'RLUSD · XRP Ledger',\n sub: 'Ed25519 签 · 自建 facilitator',\n actions: [\n { label: 'x402', tool: 'buy_sinocare_product_rlusd' },\n { label: '经 UCP', tool: 'buy_sinocare_product_ucp', args: { pay: 'rlusd' } },\n ],\n },\n ],\n },\n {\n label: '稳定币 · Agent 原生协议',\n rows: [\n {\n title: 'USDC · Base(Skyfire 托管)',\n sub: 'Skyfire 签 JWT · KYA 身份 + 付款授权 · 买家预充值余额',\n actions: [{ label: 'KYAPay', tool: 'buy_sinocare_product_skyfire' }],\n },\n {\n title: 'pathUSD · Tempo',\n sub: 'HTTP-402 · 链上 TIP-20 transferWithMemo',\n actions: [{ label: 'MPP', tool: 'buy_sinocare_product_mpp' }],\n },\n ],\n },\n];\n\n/**\n * The payment table for THIS product. The 外链 row names Shopify only when this\n * product is Shopify-backed (its link lands on Shopify's own checkout); the\n * static wording stays generic otherwise, so the label never lies.\n */\nconst groupsFor = (pick: CheckoutPick): CheckoutGroup[] =>\n pick.externalShopify !== true\n ? SINOCARE_GROUPS\n : SINOCARE_GROUPS.map((g) =>\n g.label.startsWith('外链')\n ? {\n ...g,\n rows: g.rows.map((r) => ({\n ...r,\n title: 'Shopify 结账',\n sub: '在 Shopify 收银台支付(Shopify Payments)',\n actions: r.actions.map((a) => ({ ...a, label: '去 Shopify 支付' })),\n })),\n }\n : g,\n );\n\n/**\n * The checkout card's payload for a pick — the picker, or the receipt when THIS\n * checkout is the one that was paid.\n */\nconst pickView = (pick: CheckoutPick, r?: BookingReceipt) =>\n checkoutView({\n product: {\n sku: pick.sku,\n name: pick.name,\n priceDisplay: pick.priceEur,\n imageUrl: pick.imageUrl,\n },\n quantity: pick.quantity,\n groups: groupsFor(pick),\n lang: 'zh',\n receipt: r && {\n protocol: r.protocol,\n total: r.total ?? pick.priceEur,\n status: r.status,\n orderId: r.orderId,\n txHash: r.txHash,\n explorer: r.explorer,\n message: r.message,\n },\n });\n\n// MCP App card (a single ui:// resource, TWO views chosen by structuredContent.\n// view). start_sinocare_checkout → the payment-method picker; list_my_orders → the\n// buyer's bookings (each refundable). Both advertise it on BOTH their tool\n// definition AND their result via _meta.ui.resourceUri (mirrors the merchant card\n// — the host needs it on the tool to know it renders a widget); each returns its\n// data as structuredContent, and the card calls the book_* / request_refund /\n// create_sinocare_payment_link tools back.\n// ⚠️ BUMP THIS WHENEVER widget/ CHANGES. The host caches the card's HTML by\n// this URI, so shipping new widget code under the old one leaves every\n// existing conversation rendering the previous build — the server returns\n// corrected data and the old JS draws the old picture. Three widget changes\n// went out today without a bump, and the receipt/picker fix appeared to have\n// no effect at all because of it.\nconst CHECKOUT_URI_PREFIX = 'ui://sinocare/';\nconst CHECKOUT_URI = `${CHECKOUT_URI_PREFIX}card-v28.html`;\n// The mime type, the two host namespaces and the image allow-list all live in\n// the shared package now. Each of them fails SILENTLY when wrong — an omitted\n// `resourceDomains` blocks every product photo before it leaves the starting\n// line — and two copies meant a fix could look applied while this shop still\n// rendered a row of broken images.\nconst CHECKOUT_UI_META = uiMeta(CHECKOUT_URI);\n// No `widgetDomain`: this one is stdio and has no public origin to name.\nconst WIDGET_META = widgetMeta();\n\n// The twelve tools BOTH Sinocare storefronts advertise — same names, same\n// schemas, same wording. They were two tables until 2026-08-14, and the copies\n// had drifted into telling two models two different things about the same\n// purchase: one was told a wallet refusal must stop the sale, the other was not.\n// Only the checkout card's payment vocabulary is ours.\nconst SHARED_TOOLS = storefrontTools({\n checkoutOffers:\n 'It offers Card (ACP) / UCP / USDC (x402) / RLUSD (XRP Ledger) in the conversation, the buyer\\u2019s own Curless wallet, and an external hosted Payment Link page.',\n});\n\n// This storefront's own — the other six rails, the AP2 standing authorization\n// and the two on-chain wallet read-outs. The wallet connector advertises none\n// of them, which is the entire difference between the two shops.\nconst RAIL_TOOLS: ToolDef[] = [\n {\n name: 'create_sinocare_payment_link',\n description:\n \"Create a Payment Link for a product — a PUBLIC hosted checkout page (like a Stripe Payment Link) the user opens in a browser to pay (test-mode card). Returns the URL. Mostly invoked by the checkout card's 'Payment Link' button; the external-link payment path.\",\n inputSchema: {\n type: 'object',\n required: ['sku'],\n properties: {\n sku: { type: 'string' },\n quantity: { type: 'integer', description: 'how many, default 1' },\n },\n },\n },\n {\n name: 'buy_sinocare_product_acp',\n description:\n 'Book a Sinocare product over ACP (Agentic Commerce Protocol) — Sinocare prices the product and opens a merchant-quoted checkout session; this agent completes it with a delegated card credential, settling on the card rail (test mode). One of THREE ways to pay: ACP (card) / UCP (card) / x402 (USDC). The card rail is an implementation detail, not a separate payment choice. Returns the booked order.',\n inputSchema: {\n type: 'object',\n required: ['sku'],\n properties: {\n sku: { type: 'string' },\n quantity: { type: 'integer', description: 'how many, default 1' },\n },\n },\n },\n {\n name: 'buy_sinocare_product_ucp',\n description:\n 'Book a Sinocare product over UCP (Universal Commerce Protocol, ucp.dev) — Sinocare prices it and opens a UCP checkout session. UCP \"supports x402\", and x402 is chain-agnostic, so the SAME UCP session settles FOUR ways (pass `pay`): `card` (default) → the agent authorizes with an AP2 PaymentMandate bound to the cart, settled on the card rail (test mode, same as ACP); `usdc` → the gateway freezes an x402 challenge and the agent pays with a signed EIP-3009 X-PAYMENT (USDC on Base/EVM); `usdc-sol` → same, on Solana — the agent partially signs an SPL transfer the facilitator co-signs + submits (USDC on Solana, buyer needs no SOL); `rlusd` → an XRPL x402 challenge, a signed XRPL Payment (Ed25519, no gas), on the XRP Ledger. The three stablecoin ways all settle on-chain over the stablecoin rail — currency + chain just pick the rail. The standing authorization (authorize_agent_budget) is attached on the card path. Returns the booked order.',\n inputSchema: {\n type: 'object',\n required: ['sku'],\n properties: {\n sku: { type: 'string' },\n quantity: { type: 'integer', description: 'how many, default 1' },\n pay: {\n type: 'string',\n enum: ['card', 'usdc', 'usdc-sol', 'rlusd'],\n description:\n 'payment method for this UCP session: card (default), usdc (x402 · USDC on Base/EVM), usdc-sol (x402 · USDC on Solana), or rlusd (x402 · RLUSD on the XRP Ledger)',\n },\n },\n },\n },\n {\n name: 'authorize_agent_budget',\n description:\n 'Delegate autonomous Sinocare booking to this agent via an AP2 IntentMandate: you sign a STANDING authorization (a spend cap per booking + a time window) ONCE, and the agent can then complete UCP bookings within it without confirming each purchase. Bookings over the cap (or after it expires) are rejected by the gateway. This is the AP2 \"user authorizes intent, agent acts within it\" delegation.',\n inputSchema: {\n type: 'object',\n required: ['maxAmountEur'],\n properties: {\n maxAmountEur: {\n type: 'number',\n description: 'spend cap PER booking, in EUR (e.g. 2000)',\n },\n hours: {\n type: 'integer',\n description: 'how long the authorization lasts, in hours (default 24)',\n },\n },\n },\n },\n {\n name: 'agent_budget_status',\n description:\n 'Show the current standing AP2 booking authorization (spend cap + expiry), or that none is set.',\n inputSchema: { type: 'object', properties: {} },\n },\n {\n name: 'revoke_agent_budget',\n description:\n 'Revoke the standing AP2 booking authorization — the agent must get a fresh one (authorize_agent_budget) to book autonomously again.',\n inputSchema: { type: 'object', properties: {} },\n },\n {\n name: 'buy_sinocare_product_x402',\n description:\n 'Book a Sinocare product and pay in USDC over x402. `chain` picks the USDC chain: `base` (default) → EVM, a signed EIP-3009 authorization; `solana` → an SVM transfer the buyer partially signs and the facilitator co-signs (feePayer) + submits (buyer needs no SOL). The merchant receives USDC at its address on that chain. Returns the booking + the USDC amount paid (+ the Solana tx on the solana path).',\n inputSchema: {\n type: 'object',\n required: ['sku'],\n properties: {\n sku: { type: 'string' },\n quantity: { type: 'integer', description: 'how many, default 1' },\n chain: {\n type: 'string',\n enum: ['base', 'solana'],\n description: 'USDC chain: base (default, EVM) or solana',\n },\n },\n },\n },\n {\n name: 'x402_buyer_wallet',\n description:\n 'Show the wallet that pays for x402 (USDC) bookings — its address and USDC balance on Base Sepolia (testnet) + Base (mainnet), and where to top it up. Use this to check funds before booking with USDC.',\n inputSchema: { type: 'object', properties: {} },\n },\n {\n name: 'buy_sinocare_product_rlusd',\n description:\n \"Book a Sinocare product and pay in RLUSD (Ripple USD) over x402 on the XRP Ledger. Sinocare opens a merchant-quoted RLUSD session; this agent signs a standard XRPL Payment (Ed25519, no gas — the buyer pays the tiny XRPL fee) and Curless's self-hosted facilitator submits it on-ledger. Same x402 protocol as the USDC tool, different chain. Returns the booking + the RLUSD amount paid + the XRPL tx.\",\n inputSchema: {\n type: 'object',\n required: ['sku'],\n properties: {\n sku: { type: 'string' },\n quantity: { type: 'integer', description: 'how many, default 1' },\n },\n },\n },\n {\n name: 'buy_sinocare_product_skyfire',\n description:\n \"Book a Sinocare product over Skyfire KYAPay (agent-native JWT payments). The buyer mints a Skyfire-SIGNED PAY token (via Skyfire, authorizing a small USDC charge to Sinocare — unlike the crypto rails the buyer can't self-sign, Skyfire signs it) and presents it to the Sinocare merchant backend, which charges it via the merchant SDK; agentbank verifies it against Skyfire's live JWKS — proving the agent's identity (Know Your Agent) AND the payment authorization — and records the USDC payment intent. PRODUCTION Skyfire (real token, real verify). Needs SKYFIRE_BUYER_API_KEY + SKYFIRE_SELLER_SERVICE_ID (to mint). Returns the verification + the recorded payment intent (agentbank verifies + records the authorization; it does not auto-capture).\",\n inputSchema: {\n type: 'object',\n required: ['sku'],\n properties: {\n sku: { type: 'string' },\n quantity: { type: 'integer', description: 'how many, default 1' },\n },\n },\n },\n {\n name: 'buy_sinocare_product_mpp',\n description:\n \"Book a Sinocare product over MPP (Machine Payments Protocol) settled on the Tempo payments chain. agentbank answers the unpaid request with an HTTP-402 Payment challenge whose SIGNED terms carry the on-chain payment (TIP-20 pathUSD token, merchant recipient, memo=challenge binding); the buyer's Tempo wallet pays it with transferWithMemo; the credential proves it by tx HASH and agentbank VERIFIES the on-chain transfer read-only, then captures the payment intent. Real Tempo testnet, on-chain stablecoin — no card, no gateway signing. Needs AGENTBANK_AGENT_TOKEN + TEMPO_BUYER_PRIVATE_KEY (a funded Tempo testnet key).\",\n inputSchema: {\n type: 'object',\n required: ['sku'],\n properties: {\n sku: { type: 'string' },\n quantity: { type: 'integer', description: 'how many, default 1' },\n },\n },\n },\n {\n name: 'xrpl_buyer_wallet',\n description:\n 'Show the XRPL wallet that pays for RLUSD bookings — its classic r-address and RLUSD trust-line balance on the XRP Ledger testnet. Use this to check funds before booking with RLUSD.',\n inputSchema: { type: 'object', properties: {} },\n },\n];\n\nconst TOOLS: ToolDef[] = [...SHARED_TOOLS, ...RAIL_TOOLS];\n\n// ⚠️ A card declaration is a promise that THIS result is renderable by THAT\n// card, so it goes only on tools whose result the card can draw. Attaching it\n// to everything told the host that a product LIST renders the checkout card:\n// the host drew the card, the card found no view it knew, and it sat on\n// \"Loading…\" for ever under a tool that had answered perfectly.\nconst CARD_TOOLS = new Set(['list_sinocare_products', 'start_sinocare_checkout', 'list_my_orders']);\n\nconst text = (value: unknown) => ({\n content: [{ type: 'text' as const, text: JSON.stringify(value, null, 2) }],\n});\n\n// Server instructions — hosts (Claude Desktop) inject these into the model's\n// context. The point: when the user wants to buy, OPEN THE CARD, don't retype\n// the payment menu as prose. Left to its own devices the model reads the seven\n// buy_* tools and helpfully lists ACP / UCP / x402 / RLUSD as a text bullet\n// list and asks — but the whole UX is the visual card, where the user clicks a\n// method and pays in place. So make the card the default and the text list a\n// non-UI fallback only.\n//\n// The shape and the hard rules are shared with the wallet connector; the\n// payment sentence is not, and must not be — that shop has one method in three\n// shapes and this one has seven rails to explain.\nconst INSTRUCTIONS = buildInstructions({\n opening:\n 'Sinocare storefront (buyer side). The card IS the shop. When the user wants to buy something — \"buy\", \"order\", \"我要买…\", \"再来一盒试纸\" — call start_sinocare_checkout (pass the product `sku`, or a `query` name such as \"Safe-Accu\") to open the visual checkout card, where they pick a payment method and pay by clicking.',\n paymentCard:\n 'Do NOT enumerate the payment methods (ACP / UCP / x402 / RLUSD / Curless wallet / Payment Link) as text and ask which one — that is what the card is for.',\n orderedField: 'booked',\n extra: [\n 'Call the buy_sinocare_product_* tools directly only when the card is unavailable or the user explicitly asked for a specific rail in a plain-text flow.',\n ],\n});\n\nconst server = new Server(\n { name: 'sinocare', version: '0.5.0' },\n { capabilities: { tools: {}, resources: {} }, instructions: INSTRUCTIONS },\n);\n\nserver.setRequestHandler(ListToolsRequestSchema, async () => ({\n tools: TOOLS.map((t) => (CARD_TOOLS.has(t.name) ? { ...t, _meta: CHECKOUT_UI_META } : t)),\n}));\n\nserver.setRequestHandler(ListResourcesRequestSchema, async () => ({\n resources: [\n { uri: CHECKOUT_URI, name: 'Sinocare checkout', mimeType: CARD_MIME, _meta: WIDGET_META },\n ],\n}));\nserver.setRequestHandler(ReadResourceRequestSchema, async (req) => {\n // ANY version of our card uri gets the CURRENT card — see the note in the\n // wallet connector. Bumping the uri busts a host's cache; refusing the old\n // one turns a stale card into \"there was a problem displaying content\", with\n // nothing the person can do about it.\n const asked = req.params.uri;\n if (!servesCardUri(CHECKOUT_URI_PREFIX, asked)) throw new Error(`unknown resource: ${asked}`);\n return {\n contents: [{ uri: asked, mimeType: CARD_MIME, text: CHECKOUT_CARD_HTML, _meta: WIDGET_META }],\n };\n});\n\nserver.setRequestHandler(CallToolRequestSchema, async (req) => {\n const args = (req.params.arguments ?? {}) as Record<string, unknown>;\n try {\n if (req.params.name === 'list_sinocare_products') {\n // `products`, and a `view` the card dispatches on. This returned\n // `{currency, count, products}` — the product storefront's shape, left\n // behind by a rename that changed identifiers and not payloads. The card\n // reads `products`, got undefined, and drew nothing.\n // The aisles and the \"an unknown one means all of them\" rule are shared\n // with the wallet connector — they were written out four times between\n // the two shops, and adding an aisle only ever fixed half of them.\n const { items } = await backend<{ items: Product[] }>(\n `/catalog${categoryQuery(args.category)}`,\n );\n const view = productsView(items);\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(view) }],\n structuredContent: view,\n _meta: CHECKOUT_UI_META,\n };\n }\n\n if (req.params.name === 'get_sinocare_product') {\n const sku = String(args.sku ?? '');\n const product = await backend<Product>(`/catalog/${encodeURIComponent(sku)}`);\n return text(product);\n }\n\n // Visual checkout: return the MCP App card (payment picker) + the product as\n // structuredContent. The card's buttons call the book_* /\n // create_sinocare_payment_link tools; the card renders their results.\n if (req.params.name === 'start_sinocare_checkout') {\n // Accept a `sku` (exact) OR a `query`/`product`/`name` (e.g. \"Safe AQ Smart\")\n // so the agent doesn't need the exact sku to open the card.\n const idOrName = String(args.sku ?? args.query ?? args.product ?? args.name ?? '').trim();\n const quantity = Math.max(Number(args.quantity) || 1, 1);\n // The card sets __rehydrate when it re-invokes to fill itself (reload /\n // self-heal), never on a fresh agent-initiated checkout. Only on rehydrate\n // do we show a completed booking's receipt instead of the picker — so an\n // explicit \"book X again\" from the agent still opens the picker.\n const rehydrate =\n args.__rehydrate === true || args.__rehydrate === 1 || args.__rehydrate === '1';\n\n // No product given = the card self-healing (empty-arg re-invoke) — replay the\n // last pick so the widget fills in instead of hanging on \"Loading…\". If that\n // last checkout has since been booked, show its receipt on rehydrate.\n if (!idOrName) {\n if (rehydrate && lastCheckout?.booked) {\n const receipt = completedBookings.get(lastCheckout.sku);\n if (receipt) {\n return {\n content: [{ type: 'text' as const, text: `Booked ${lastCheckout.name}.` }],\n structuredContent: pickView(lastCheckout, receipt),\n _meta: CHECKOUT_UI_META,\n };\n }\n }\n // Nothing to replay: answer \"pick a product\" rather than volunteering\n // whichever one came last. The card shows its own empty state.\n if (!lastCheckout) {\n return {\n content: [\n {\n type: 'text' as const,\n text: 'Pick a product first (list_sinocare_products), then open its checkout.',\n },\n ],\n isError: true,\n };\n }\n return {\n content: [{ type: 'text' as const, text: `Checkout for ${lastCheckout.name}.` }],\n structuredContent: pickView(lastCheckout),\n _meta: CHECKOUT_UI_META,\n };\n }\n\n // Resolve: try the exact sku first, then the shared resolver over the\n // catalog. It never guesses between several matches — \"Safe-Accu\" and\n // \"Safe-Accu2\" differ by one character, and this card ends in a charge.\n let product: Product | null = null;\n let candidates: Product[] = [];\n try {\n product = await backend<Product>(`/catalog/${encodeURIComponent(idOrName)}`);\n } catch {\n const { items } = await backend<{ items: Product[] }>('/catalog');\n const match = resolveProduct(items, { sku: idOrName });\n if (match.kind === 'found') product = match.product;\n else if (match.kind === 'ambiguous') candidates = match.candidates;\n }\n if (!product) {\n return {\n content: [\n {\n type: 'text' as const,\n // Named the wrong kind of shop — \"度假村\" is left over from the\n // resort demo this storefront was forked from, in a shop that\n // sells blood-glucose meters.\n text: candidates.length\n ? `“${idOrName}” 对上了 ${candidates.length} 件商品 —— 说清是哪件:${candidates\n .map((c) => `${c.name}(${c.sku})`)\n .join('、')}`\n : `目录里没有 “${idOrName}” —— 用 list_sinocare_products 看可选项,或传它的 sku。`,\n },\n ],\n isError: true,\n };\n }\n\n const priceEur = priceDisplayOf(product);\n // Rehydrating an already-BOOKED product's card → show its receipt, not the\n // picker (fixes: pay, leave the conversation, come back, and the card had\n // reset to the payment selection). The card self-heals by re-invoking with\n // its ORIGINAL args (the sku) + __rehydrate. EXCEPTION: a deliberate \"book\n // it again\" is a fresh (non-rehydrate) open that leaves THIS sku's pick\n // unbooked; its immediate self-heal must resolve to the picker, so suppress\n // the receipt only while this sku is the one being freshly re-opened. Past\n // receipts are kept intact (never deleted), so #6's cross-conversation\n // records — and OTHER booked cards in the same conversation — still\n // rehydrate to their receipts.\n // Is THIS checkout paid? Not \"has this product ever been bought\".\n //\n // The receipt used to be looked up by sku, which treats a product as a\n // purchase. It is not: opening a checkout for somewhere you booked last\n // week is a NEW order. With 42 of 44 products recorded, that lookup made\n // almost every card render as an already-paid receipt the moment it\n // self-healed — no payment involved — and hid the payment picker behind\n // a booking that had happened days ago.\n //\n // So the question is answered by the checkout in hand: the pick we just\n // had open, for this same product, that was actually paid. A fresh open\n // replaces it with an unpaid one (below), which is what makes \"book it\n // again\" resolve to the picker.\n const rehydratedReceipt =\n rehydrate && lastCheckout?.sku === product.sku && lastCheckout.booked\n ? completedBookings.get(product.sku)\n : undefined;\n lastCheckout = {\n sku: product.sku,\n name: product.name,\n priceEur,\n quantity,\n imageUrl: product.imageUrl,\n externalShopify: product.source === 'shopify',\n // Preserve booked only when rehydrating a paid pick; a fresh open is a\n // new, unpaid order (booked stays falsy → the card shows the picker).\n booked: rehydratedReceipt ? true : undefined,\n };\n saveCheckoutState(); // persist the new lastCheckout across processes\n const receipt = rehydratedReceipt;\n if (receipt) {\n return {\n content: [{ type: 'text' as const, text: `Booked ${product.name} (${priceEur}).` }],\n structuredContent: pickView(lastCheckout, receipt),\n _meta: CHECKOUT_UI_META,\n };\n }\n return {\n content: [\n {\n type: 'text' as const,\n text: `Checkout for ${product.name} (${priceEur}). Pick a payment method in the card — Card (ACP) / UCP / USDC (x402) / RLUSD (XRP Ledger), or a Payment Link (hosted page).`,\n },\n ],\n structuredContent: pickView(lastCheckout),\n _meta: CHECKOUT_UI_META,\n };\n }\n\n if (req.params.name === 'create_sinocare_payment_link') {\n const sku = String(args.sku ?? '');\n const quantity = Math.max(Number(args.quantity) || 1, 1);\n const link = await backend<{ url: string; amountDisplay: string; name: string }>(\n '/checkout-link',\n {\n method: 'POST',\n // Paying from the wallet means the WALLET's owner is the buyer, so\n // the merchant records that email. Otherwise the order is filed under\n // SINOCARE_BUYER_EMAIL and never appears in the wallet's own 订单 —\n // \"我的订单\" is joined on the email the order was placed with.\n body: JSON.stringify({\n sku,\n quantity,\n ...(walletBuyer() ?? (BUYER ? { buyer: BUYER } : {})),\n }),\n },\n );\n return text({\n url: link.url,\n amountDisplay: link.amountDisplay,\n name: link.name,\n message: `Payment page for ${link.name} — open ${link.url} to pay (${link.amountDisplay}).`,\n });\n }\n\n if (req.params.name === 'curless_wallet_logout') {\n const who = wallet.current();\n await wallet.logout();\n // Drop the pending browser sign-in too, if one is mid-flight — otherwise\n // \"signed out\" would be followed by that login completing and silently\n // signing them back in.\n pending = null;\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n signedOut: true,\n was: who?.email ?? null,\n message: who ? `已退出 ${who.email}。` : '本来就没有登录。',\n }),\n },\n ],\n };\n }\n\n if (req.params.name === 'curless_wallet_login_status') {\n const who = wallet.current();\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(\n who\n ? { signedIn: true, email: who.email, mode: who.mode, wallet: 'storefront' }\n : {\n signedIn: false,\n // Three answers, not two. \"waiting\" is a sign-in in flight,\n // \"expired\" is one that ran out, and neither is \"nobody\n // started one\" — which used to be reported as expired and\n // read back to the person as \"your code timed out\" when\n // they had never been given a code.\n waiting: Boolean(pending),\n expired: !pending && loginEverStarted,\n neverStarted: !pending && !loginEverStarted,\n // WHICH wallet. This storefront holds its own buyer session\n // for the in-card method; a separately-installed Curless\n // wallet connector holds a different one, and this tool can\n // say nothing about that. Reported as contradicting each\n // other otherwise — reasonably, since both were called \"the\n // wallet\".\n wallet: 'storefront',\n note: 'this is the session THIS storefront holds (the in-card wallet method). A separately-installed Curless wallet connector has its own session — ask that connector, not this tool.',\n },\n ),\n },\n ],\n };\n }\n\n // ACP, twice over: the agent mints the credential from ITS OWN Stripe key\n // (buy_sinocare_product_acp), or the buyer's Curless wallet mints it from the\n // card that buyer bound (buy_sinocare_product_wallet). Everything after the\n // credential — the session, the complete, the writeback — is identical, so\n // it is one handler: two code paths would drift, and the difference that\n // matters is only WHERE the token comes from and WHOSE limits applied.\n if (\n req.params.name === 'buy_sinocare_product_acp' ||\n req.params.name === 'buy_sinocare_product_wallet'\n ) {\n const viaWallet = req.params.name === 'buy_sinocare_product_wallet';\n // Check the signature BEFORE asking Sinocare to price anything. Opening a\n // checkout session we already know cannot be paid leaves the merchant an\n // order that will never complete, and shows the person a backend error\n // when the actual problem is that nobody signed in.\n if (viaWallet && !wallet.current()) {\n // Start the browser sign-in HERE, before Sinocare is asked to price\n // anything: a checkout session opened for someone who cannot pay is an\n // order the merchant will never see completed.\n //\n // JSON, not prose — the card renders `message` and the model reads\n // `next`. Prose fails the card's JSON.parse and gets shown to the person\n // verbatim, which is how an instruction meant for the model once ended\n // up on screen in English.\n const login = await pendingLogin();\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n needsLogin: true,\n loginUrl: login.verificationUriComplete,\n userCode: login.userCode,\n message:\n '在浏览器里登录你的 Curless 钱包,登录完这张卡会自己接上。登录后就能用你自己绑的卡付款,并受你自己设的限额约束。',\n next: 'show the person the login link; the card polls on its own. Do NOT ask them for an email here — the sign-in happens in their browser.',\n }),\n },\n ],\n isError: true,\n };\n }\n\n const sku = String(args.sku ?? '');\n const quantity = Math.max(Number(args.quantity) || 1, 1);\n // 1. Sinocare prices the product + opens a merchant-quoted ACP session.\n const session = await backend<{\n sessionId: string;\n merchantId: string;\n name: string;\n amountDisplay: string;\n }>('/checkout-acp', {\n method: 'POST',\n body: JSON.stringify({ sku, quantity, ...(BUYER ? { buyer: BUYER } : {}) }),\n });\n // 2. Ask the buyer's wallet for a credential scoped to THIS booking. The\n // session's real total has to come off the session itself — the backend\n // only hands back a display string (\"€1,920\"), and an SPT's cap is an\n // integer in minor units. No wallet configured → keep the card token.\n let token = PAYMENT_TOKEN;\n if (viaWallet) {\n // The buyer's wallet decides. It reads the same real total off the ACP\n // session, checks the limits THAT PERSON set, and mints against the card\n // THEY bound — so a refusal here is the buyer's own cap, not a payment\n // failure, and it is reported that way rather than retried around.\n const { amount, currency } = totalOf(\n await readCheckoutSession(acp(session.merchantId), session.sessionId),\n );\n let credential: PaymentCredential;\n try {\n credential = await wallet.payCredential({\n amount,\n currency,\n merchantRef: session.merchantId,\n });\n } catch (err) {\n // The checkout session stays open and unpaid, which is correct — the\n // person may raise their limit and pay it. Nothing was charged.\n return walletRefusal(err as Error);\n }\n token = credential.token;\n process.stderr.write(\n `sinocare-demo: wallet minted ${credential.token} for ${amount} ${currency}\\n`,\n );\n } else if (!STRIPE_AGENT_KEY || !SELLER_PROFILE) {\n // Say so once, out loud: a silent fallback here looks identical to a\n // successful SPT payment from the outside (the seller mints its own pm_\n // either way), which is exactly how you end up believing you tested\n // something you didn't.\n process.stderr.write(\n 'sinocare-demo: paying ACP with the plain card token — set STRIPE_AGENT_SECRET_KEY and AGENTBANK_SELLER_PROFILE to mint a real SPT per booking\\n',\n );\n } else {\n // Which fetch failed matters, and node's \"fetch failed\" hides the real\n // reason in .cause — without both you get a message that says nothing.\n let step = 'read session';\n try {\n const { amount, currency } = totalOf(\n await readCheckoutSession(acp(session.merchantId), session.sessionId),\n );\n step = 'mint SPT';\n const minted = await mintSharedPaymentToken(amount, currency);\n if (minted) {\n token = minted;\n process.stderr.write(`sinocare-demo: minted ${minted} for ${amount} ${currency}\\n`);\n }\n } catch (err) {\n const e = err as Error & { cause?: { code?: string; message?: string } };\n const why = e.cause?.code ?? e.cause?.message ?? '';\n const what = `SPT FAILED at [${step}]: ${e.message}${why ? ` (cause: ${why})` : ''}`;\n // Strict by default. Configuring a wallet says you want a credential\n // bound to THIS seller, amount and expiry; quietly paying with an\n // unscoped card token instead is a downgrade, not graceful\n // degradation — and the booking still succeeds, so nobody notices.\n if (!WALLET_FALLBACK_OK) {\n throw new Error(\n `${what} — refusing to fall back to an unscoped card token. Set SINOCARE_WALLET_FALLBACK=1 to allow that.`,\n );\n }\n process.stderr.write(`sinocare-demo: ${what} — falling back to ${PAYMENT_TOKEN}\\n`);\n }\n }\n // 3. This buyer agent completes the charge over ACP with that credential.\n const order = (await completeCheckout(acp(session.merchantId), session.sessionId, token)) as {\n status?: string;\n order?: { id?: string };\n };\n return finishBooking(sku, {\n booked: order.status === 'completed',\n product: session.name,\n quantity,\n total: session.amountDisplay,\n protocol: 'acp',\n payer: viaWallet ? 'curless-wallet' : 'agent-key',\n status: order.status,\n // An ACP complete can omit order.id; fall back to the (always-present,\n // stable) checkout session id so the writeback always has a dedup key.\n orderId: order.order?.id ?? session.sessionId,\n message: `Booked ${session.name} × ${quantity} — ${session.amountDisplay} charged (${order.status}).`,\n });\n }\n\n // ── mode 2 · step 1: open a checkout for a wallet this server cannot reach ──\n if (req.params.name === 'start_sinocare_wallet_handoff') {\n if (!TOKEN) {\n return text({ error: 'sinocare-demo: AGENTBANK_AGENT_TOKEN is not set' });\n }\n const sku = String(args.sku ?? '');\n const quantity = Math.max(Number(args.quantity) || 1, 1);\n const session = await backend<{\n sessionId: string;\n merchantId: string;\n name: string;\n amountDisplay: string;\n }>('/checkout-acp', {\n method: 'POST',\n body: JSON.stringify({ sku, quantity, ...(BUYER ? { buyer: BUYER } : {}) }),\n });\n // The authoritative total, off the session — the backend's amountDisplay\n // is a string for a human (\"€1,920\") and a credential is capped by an\n // integer in minor units.\n const { amount, currency } = totalOf(\n await readCheckoutSession(acp(session.merchantId), session.sessionId),\n );\n return text({\n // This OPENED a checkout; it did not pay for one. Said explicitly\n // because a result that mentions neither used to render as a receipt.\n booked: false,\n awaitingPayment: true,\n message: '结账已开好。接下来在你自己的 Curless 钱包连接器里铸一张凭据,再回来完成付款。',\n sessionId: session.sessionId,\n merchantId: session.merchantId,\n amount,\n currency,\n product: session.name,\n total: session.amountDisplay,\n // Spells out the sign-in step. Without it the model calls\n // wallet_pay_credential, gets \"nobody is signed in\", and has to invent\n // what to do next — which is how a booking the person asked to pay\n // from their own wallet ends up settled some other way.\n next: `on the Curless wallet connector: if nobody is signed in, call wallet_login FIRST, show the person the link it returns, and wait until they say they have finished in their browser. Then wallet_pay_credential({ amount: ${amount}, currency: \"${currency}\", merchantRef: \"${session.merchantId}\" }), then pay_sinocare_with_token({ sessionId: \"${session.sessionId}\", merchantId: \"${session.merchantId}\", token }). If the wallet still refuses, STOP and tell the person what it said — do not pay this another way.`,\n });\n }\n\n // ── mode 2 · step 2: the merchant completes, with its own key ──\n if (req.params.name === 'pay_sinocare_with_token') {\n if (!TOKEN) {\n return text({ error: 'sinocare-demo: AGENTBANK_AGENT_TOKEN is not set' });\n }\n const sessionId = String(args.sessionId ?? '');\n const token = String(args.token ?? '');\n const merchantId = String(args.merchantId ?? '');\n if (!sessionId || !token || !merchantId) {\n return text({ error: 'pay_sinocare_with_token needs sessionId, merchantId and token' });\n }\n // What this checkout was for comes off the checkout, not out of this\n // process's memory — the confirmation can arrive in a different one.\n const bought = purchaseOf(await readCheckoutSession(acp(merchantId), sessionId));\n const order = (await completeCheckout(acp(merchantId), sessionId, token)) as {\n status?: string;\n order?: { id?: string };\n };\n const booked = order.status === 'completed';\n // Same exit as the other ten booking paths. Returning a bare result here\n // is what let someone pay the same holiday three times: the card had no\n // idea it had been bought, so it rehydrated to the picker.\n return finishBooking(bought?.sku ?? '', {\n booked,\n product: bought?.name,\n quantity: bought?.quantity,\n protocol: 'acp',\n payer: 'curless-wallet (separate connector)',\n status: order.status,\n orderId: order.order?.id ?? sessionId,\n message: `Checkout ${sessionId} completed with the credential the wallet minted (${order.status}).`,\n });\n }\n\n // ── mode 3: hand the person a link and let them approve in a browser ──\n if (req.params.name === 'pay_sinocare_hosted') {\n if (!TOKEN) {\n return text({ error: 'sinocare-demo: AGENTBANK_AGENT_TOKEN is not set' });\n }\n const sku = String(args.sku ?? '');\n const quantity = Math.max(Number(args.quantity) || 1, 1);\n const session = await backend<{\n sessionId: string;\n merchantId: string;\n name: string;\n amountDisplay: string;\n }>('/checkout-acp', {\n method: 'POST',\n body: JSON.stringify({ sku, quantity, ...(BUYER ? { buyer: BUYER } : {}) }),\n });\n return text({\n booked: false,\n awaitingPayment: true,\n message: '在浏览器里打开这个链接,看清金额再批准。这里还没有扣任何款。',\n payUrl: `${API_BASE}/buyer/pay?session=${encodeURIComponent(session.sessionId)}`,\n sessionId: session.sessionId,\n product: session.name,\n total: session.amountDisplay,\n // Say plainly that nothing has been paid yet. A tool that returns a\n // link and a product name reads like a receipt if it does not.\n paid: false,\n merchantId: session.merchantId,\n next: 'show the person this link. Nothing has been charged yet — they approve it in their browser. Then call get_sinocare_order_status with this sessionId.',\n });\n }\n\n if (req.params.name === 'get_sinocare_order_status') {\n if (!TOKEN) {\n return text({ error: 'sinocare-demo: AGENTBANK_AGENT_TOKEN is not set' });\n }\n const sessionId = String(args.sessionId ?? '');\n const merchantId = String(args.merchantId ?? '');\n const session = await readCheckoutSession(acp(merchantId), sessionId);\n const paid = session.status === 'completed';\n const bought = purchaseOf(session);\n // The approval happened in a browser, so THIS is the only moment the demo\n // learns of it. Record the booking here or it is never recorded at all.\n return finishBooking(paid ? (bought?.sku ?? '') : '', {\n booked: paid,\n paid,\n sessionId,\n status: session.status,\n product: bought?.name,\n quantity: bought?.quantity,\n protocol: 'acp',\n payer: 'curless-wallet (hosted approval)',\n orderId: sessionId,\n message: paid\n ? 'Paid — the buyer approved it in their browser.'\n : 'Not paid yet. They have not finished approving it.',\n });\n }\n\n if (req.params.name === 'buy_sinocare_product_ucp') {\n if (!TOKEN) {\n return {\n content: [{ type: 'text', text: 'set AGENTBANK_AGENT_TOKEN (a test agent:execute key)' }],\n isError: true,\n };\n }\n const sku = String(args.sku ?? '');\n const quantity = Math.max(Number(args.quantity) || 1, 1);\n const pay =\n args.pay === 'usdc'\n ? 'usdc'\n : args.pay === 'usdc-sol'\n ? 'usdc-sol'\n : args.pay === 'rlusd'\n ? 'rlusd'\n : 'card';\n\n // USDC path: the merchant quotes the UCP session in USDC (a small test\n // charge); the gateway freezes an x402 challenge on it, and this buyer pays\n // with an X-PAYMENT (EIP-3009) at /complete — settled over the stablecoin\n // rail, same money-movement as buy_sinocare_product_x402 but via a UCP\n // session (one protocol, two payment methods).\n if (pay === 'usdc') {\n const session = await backend<{\n sessionId: string;\n merchantId: string;\n name: string;\n amount: number;\n amountDisplay: string;\n x402?: { accepts: X402PaymentRequirements[] };\n }>('/checkout-ucp', {\n method: 'POST',\n body: JSON.stringify({ sku, quantity, pay: 'usdc', ...(BUYER ? { buyer: BUYER } : {}) }),\n });\n const reqs = session.x402?.accepts?.[0];\n if (!reqs) throw new Error('USDC UCP session missing its x402 requirements');\n\n // Pre-flight balance check (skipped in throwaway-key / STUB mode).\n const buyer = await buyerSigner();\n if (buyer) {\n const have = await usdcBalance({\n network: reqs.network,\n owner: buyer.address,\n token: reqs.asset,\n });\n if (have < BigInt(session.amount)) {\n const onTestnet = reqs.network === 'base-sepolia';\n return text({\n booked: false,\n reason: 'insufficient_usdc',\n wallet: buyer.address,\n network: reqs.network,\n have: fmtUsdc(have),\n need: fmtUsdc(BigInt(session.amount)),\n faucet: onTestnet ? 'https://faucet.circle.com' : undefined,\n message: `Buyer wallet ${buyer.address} has ${fmtUsdc(have)} on ${reqs.network}, needs ${fmtUsdc(BigInt(session.amount))}.${onTestnet ? ' Top up at https://faucet.circle.com and retry.' : ' Fund it with USDC on Base and retry.'}`,\n });\n }\n }\n\n // Sign the frozen challenge, then complete the UCP session with an\n // X-PAYMENT header — the gateway settles it over the stablecoin rail.\n const xPayment = await signX402(reqs);\n const paidRes = await fetch(\n `${API_BASE}/ucp/${encodeURIComponent(session.merchantId)}/checkout-sessions/${encodeURIComponent(session.sessionId)}/complete`,\n {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n authorization: `Bearer ${TOKEN}`,\n 'x-payment': xPayment,\n },\n body: JSON.stringify({ payment: {} }),\n },\n );\n const paid = (await paidRes.json()) as { status?: string; id?: string };\n if (paidRes.status !== 200) {\n throw new Error(`ucp usdc settle -> ${paidRes.status}: ${JSON.stringify(paid)}`);\n }\n const paidUsdc = fmtUsdc(BigInt(session.amount));\n return finishBooking(sku, {\n booked: paid.status === 'completed',\n product: session.name,\n quantity,\n protocol: 'ucp',\n payer: 'agent-key (UCP)',\n payWith: 'usdc',\n paidUsdc: `${paidUsdc} (fixed test charge, merchant-quoted)`,\n payTo: reqs.payTo,\n network: reqs.network,\n paymentAuthorization: 'x402 EIP-3009 (signed + settled over the stablecoin rail)',\n status: paid.status,\n orderId: paid.id,\n sessionId: session.sessionId,\n message: `Booked ${session.name} × ${quantity} — paid ${paidUsdc} via UCP + USDC (x402) to ${reqs.payTo} (${paid.status}).`,\n });\n }\n\n // USDC-on-Solana path: the merchant quotes the UCP session in USDC on Solana;\n // the gateway freezes an SVM x402 challenge on it, and this buyer PARTIALLY\n // signs an SPL transfer (facilitator co-signs feePayer + submits) at /complete —\n // same UCP wire as the EVM USDC path, only the chain flips. Proves \"UCP supports\n // x402\" is chain-agnostic.\n if (pay === 'usdc-sol') {\n const secretKey = await solanaBuyerSecret();\n if (!secretKey) {\n return {\n content: [\n {\n type: 'text',\n text: 'set SOLANA_BUYER_SECRET (a devnet Solana secret key holding USDC) to pay USDC-on-Solana over UCP',\n },\n ],\n isError: true,\n };\n }\n const session = await backend<{\n sessionId: string;\n merchantId: string;\n name: string;\n amount: number;\n amountDisplay: string;\n x402?: { accepts: SolanaX402Requirements[] };\n }>('/checkout-ucp', {\n method: 'POST',\n body: JSON.stringify({\n sku,\n quantity,\n pay: 'usdc-sol',\n ...(BUYER ? { buyer: BUYER } : {}),\n }),\n });\n const reqs = session.x402?.accepts?.[0];\n if (!reqs) throw new Error('USDC-Solana UCP session missing its x402 requirements');\n\n const owner = await addressFromSecretKey(secretKey);\n const have = await solanaUsdcBalance(owner, reqs.asset);\n const need = Number(reqs.maxAmountRequired);\n if (have !== null && have < need) {\n return text({\n booked: false,\n reason: 'insufficient_usdc_solana',\n wallet: owner,\n network: reqs.network,\n have: `${(have / 1e6).toFixed(6)} USDC`,\n need: `${(need / 1e6).toFixed(6)} USDC`,\n faucet: 'https://faucet.circle.com',\n message: `Buyer wallet ${owner} has ${(have / 1e6).toFixed(6)} USDC on ${reqs.network}, needs ${(need / 1e6).toFixed(6)}. Top up devnet USDC at https://faucet.circle.com (Solana Devnet) and retry.`,\n });\n }\n\n // Partially sign the frozen SVM challenge, then complete the UCP session with\n // the X-PAYMENT — the gateway settles it over the stablecoin rail (x402.org).\n const xPayment = await signSolanaX402Payment({\n requirements: reqs,\n secretKey,\n rpcUrl: SOLANA_RPC,\n });\n const paidRes = await fetch(\n `${API_BASE}/ucp/${encodeURIComponent(session.merchantId)}/checkout-sessions/${encodeURIComponent(session.sessionId)}/complete`,\n {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n authorization: `Bearer ${TOKEN}`,\n 'x-payment': xPayment,\n },\n body: JSON.stringify({ payment: {} }),\n },\n );\n const paid = (await paidRes.json()) as { status?: string; id?: string };\n if (paidRes.status !== 200) {\n throw new Error(`ucp usdc-sol settle -> ${paidRes.status}: ${JSON.stringify(paid)}`);\n }\n const paidUsdc = `${(need / 1e6).toFixed(6)} USDC`;\n return finishBooking(sku, {\n booked: paid.status === 'completed',\n product: session.name,\n quantity,\n protocol: 'ucp',\n payer: 'agent-key (UCP)',\n payWith: 'usdc-sol',\n paidUsdc: `${paidUsdc} (fixed test charge, merchant-quoted)`,\n payTo: reqs.payTo,\n network: reqs.network,\n paymentAuthorization:\n 'x402 SVM transfer (partially signed; facilitator co-signs feePayer + submits)',\n status: paid.status,\n orderId: paid.id,\n sessionId: session.sessionId,\n message: `Booked ${session.name} × ${quantity} — paid ${paidUsdc} via UCP + USDC on Solana to ${reqs.payTo} (${paid.status}).`,\n });\n }\n\n // RLUSD path: the merchant quotes the UCP session in RLUSD; the gateway\n // freezes an XRPL x402 challenge on it, and this buyer signs a standard XRPL\n // Payment (Ed25519, no gas — buyer pays the tiny XRPL fee) which the self-\n // hosted facilitator submits on-ledger. Same money-movement as\n // buy_sinocare_product_rlusd, but over a UCP session — the SAME UCP wire the\n // card/USDC paths use, only the currency flips the chain to the XRP Ledger.\n if (pay === 'rlusd') {\n const wallet = xrplBuyer();\n if (!wallet) {\n return {\n content: [\n {\n type: 'text',\n text: 'set XRPL_BUYER_SEED (an sEd… testnet seed holding RLUSD + a little test XRP) to pay RLUSD bookings',\n },\n ],\n isError: true,\n };\n }\n const session = await backend<{\n sessionId: string;\n merchantId: string;\n name: string;\n amount: number;\n amountDisplay: string;\n x402?: { accepts: XrplPaymentRequirements[] };\n }>('/checkout-ucp', {\n method: 'POST',\n body: JSON.stringify({ sku, quantity, pay: 'rlusd', ...(BUYER ? { buyer: BUYER } : {}) }),\n });\n const reqs = session.x402?.accepts?.[0];\n if (!reqs) throw new Error('RLUSD UCP session missing its x402 requirements');\n\n // One XRPL connection for the balance pre-flight AND the signing autofill\n // (same as buy_sinocare_product_rlusd): sign the merchant's frozen quote.\n const issuer = reqs.extra?.issuer;\n const preflight = await withXrplClient(async (client) => {\n const have = issuer\n ? await rlusdBalance(client, wallet.classicAddress, reqs.asset, issuer)\n : '0';\n if (Number(have) < Number(reqs.maxAmountRequired)) {\n return { have, xPayment: null as string | null };\n }\n return { have, xPayment: await signXrpl(client, reqs, wallet) };\n });\n if (preflight.xPayment === null) {\n return text({\n booked: false,\n reason: 'insufficient_rlusd',\n wallet: wallet.classicAddress,\n network: reqs.network,\n have: `${preflight.have} RLUSD`,\n need: `${reqs.maxAmountRequired} RLUSD`,\n message: `Buyer wallet ${wallet.classicAddress} holds ${preflight.have} RLUSD, needs ${reqs.maxAmountRequired}. Fund it with testnet RLUSD (+ a little test XRP for the fee) and retry.`,\n });\n }\n\n // Complete the UCP session with the signed XRPL Payment as an X-PAYMENT —\n // the gateway settles it over the stablecoin rail (XRPL facilitator).\n const paidRes = await fetch(\n `${API_BASE}/ucp/${encodeURIComponent(session.merchantId)}/checkout-sessions/${encodeURIComponent(session.sessionId)}/complete`,\n {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n authorization: `Bearer ${TOKEN}`,\n 'x-payment': preflight.xPayment,\n },\n body: JSON.stringify({ payment: {} }),\n },\n );\n const paid = (await paidRes.json()) as { status?: string; id?: string };\n if (paidRes.status !== 200) {\n throw new Error(`ucp rlusd settle -> ${paidRes.status}: ${JSON.stringify(paid)}`);\n }\n return finishBooking(sku, {\n booked: paid.status === 'completed',\n product: session.name,\n quantity,\n protocol: 'ucp',\n payer: 'agent-key (UCP)',\n payWith: 'rlusd',\n paidRlusd: `${reqs.maxAmountRequired} RLUSD (fixed test charge, merchant-quoted)`,\n payTo: reqs.payTo,\n network: reqs.network,\n paymentAuthorization:\n 'x402 XRPL Payment (Ed25519, signed + settled over the stablecoin rail)',\n status: paid.status,\n orderId: paid.id,\n sessionId: session.sessionId,\n message: `Booked ${session.name} × ${quantity} — paid ${reqs.maxAmountRequired} RLUSD via UCP + RLUSD (x402 on the XRP Ledger) to ${reqs.payTo} (${paid.status}).`,\n });\n }\n\n // CARD path (default).\n // 1. Sinocare prices the product + opens a merchant-quoted UCP session,\n // returning a merchant-signed AP2 CartMandate for it.\n const session = await backend<{\n sessionId: string;\n merchantId: string;\n name: string;\n amount: number;\n currency: string;\n amountDisplay: string;\n cartMandate: { cartHash: string };\n }>('/checkout-ucp', {\n method: 'POST',\n body: JSON.stringify({ sku, quantity, ...(BUYER ? { buyer: BUYER } : {}) }),\n });\n // 2. This buyer agent authorizes payment with an AP2 PaymentMandate — a\n // real ES256 JWS bound to the cart's hash (UCP AP2 Mandates extension).\n // Programmatic completion, no human trusted-UI handoff; the gateway\n // cryptographically verifies the mandate, then settles on the card rail.\n const paymentMandate = await signPaymentMandate({\n cartHash: session.cartMandate.cartHash,\n method: { handler: 'card', type: 'card', credential: PAYMENT_TOKEN },\n amount: session.amount,\n currency: session.currency,\n });\n // Attach the standing authorization if one is active — the gateway then\n // checks this booking is within the user's delegated cap. Drop it if expired.\n const mandate: { payment_mandate: typeof paymentMandate; intent_mandate?: Ap2IntentMandate } =\n { payment_mandate: paymentMandate };\n let underAuthorization = false;\n if (agentBudget) {\n if (Date.parse(agentBudget.expiresAt) < Date.now()) {\n agentBudget = null; // expired — book normally (no standing auth)\n saveBudget(null);\n } else {\n mandate.intent_mandate = agentBudget.mandate;\n underAuthorization = true;\n }\n }\n const url = `${API_BASE}/ucp/${encodeURIComponent(session.merchantId)}/checkout-sessions/${encodeURIComponent(session.sessionId)}/complete`;\n const res = await fetch(url, {\n method: 'POST',\n headers: { 'content-type': 'application/json', authorization: `Bearer ${TOKEN}` },\n body: JSON.stringify({ payment: { mandate } }),\n });\n if (!res.ok) {\n const errText = await res.text().catch(() => '');\n // A standing-authorization rejection (over cap / expired) → a clean,\n // explanatory result instead of a raw error, so the agent can react.\n if (\n underAuthorization &&\n /intent mandate rejected|exceeds_intent_max_amount|intent_mandate_expired/.test(errText)\n ) {\n return text({\n booked: false,\n blockedBy: 'standing-authorization',\n product: session.name,\n total: session.amountDisplay,\n authorizedCap: `€${agentBudget?.maxAmountEur.toLocaleString('en-IE')}`,\n message: `Blocked: ${session.name} (${session.amountDisplay}) is over your standing authorization (cap €${agentBudget?.maxAmountEur}, or it expired). Raise it with authorize_agent_budget, or book a cheaper product.`,\n });\n }\n throw new Error(`ucp complete -> ${res.status}: ${errText}`);\n }\n const out = (await res.json()) as { status?: string; id?: string };\n return finishBooking(sku, {\n booked: out.status === 'completed',\n product: session.name,\n quantity,\n total: session.amountDisplay,\n protocol: 'ucp',\n payer: 'agent-key (UCP)',\n // The payment was ALWAYS authorized by a signed AP2 PaymentMandate — this\n // says so explicitly so it can't be misread as \"unauthorized\".\n paymentAuthorization: 'AP2 PaymentMandate (signed + verified)',\n // The OPTIONAL standing budget (authorize_agent_budget): applied here, or\n // not set for this booking. \"not set\" ≠ unauthorized — see above.\n standingBudget: underAuthorization\n ? `applied (within your €${agentBudget?.maxAmountEur} cap, no per-booking confirm)`\n : 'not set',\n status: out.status,\n orderId: out.id,\n message: `Booked ${session.name} × ${quantity} — ${session.amountDisplay} charged via UCP + AP2 PaymentMandate (${out.status})${underAuthorization ? ` — under your standing €${agentBudget?.maxAmountEur} authorization, no per-booking confirm` : ''}.`,\n });\n }\n\n if (req.params.name === 'buy_sinocare_product_x402') {\n if (!TOKEN) {\n return {\n content: [{ type: 'text', text: 'set AGENTBANK_AGENT_TOKEN (a test agent:execute key)' }],\n isError: true,\n };\n }\n const sku = String(args.sku ?? '');\n const quantity = Math.max(Number(args.quantity) || 1, 1);\n\n // Solana path (chain=solana): USDC over Solana (SVM). The merchant quotes a\n // Solana USDC session; this buyer builds + PARTIALLY signs an SPL transfer,\n // the x402.org facilitator co-signs as feePayer + sponsors the fee + submits.\n // Same merchant-quoted session shape as the EVM/USDC path, only the chain flips.\n if (args.chain === 'solana') {\n const secretKey = await solanaBuyerSecret();\n if (!secretKey) {\n return {\n content: [\n {\n type: 'text',\n text: 'set SOLANA_BUYER_SECRET (a devnet Solana secret key — solana-keygen JSON array or base58 — holding devnet USDC) to pay USDC-on-Solana bookings',\n },\n ],\n isError: true,\n };\n }\n const { merchantId } = await backend<{ merchantId: string }>('/health');\n const session = await backend<{\n sessionId: string;\n name: string;\n accepts: SolanaX402Requirements[];\n amount: number;\n payTo: string;\n network: string;\n priceEur?: string;\n }>('/checkout-x402', {\n method: 'POST',\n body: JSON.stringify({ sku, quantity, currency: 'USDC', chain: 'solana' }),\n });\n const reqs = session.accepts?.[0];\n if (!reqs) throw new Error('merchant Solana USDC session missing payment requirements');\n\n // Balance pre-flight (skip on RPC error) against the merchant's quote.\n const owner = await addressFromSecretKey(secretKey);\n const have = await solanaUsdcBalance(owner, reqs.asset);\n const need = Number(reqs.maxAmountRequired);\n if (have !== null && have < need) {\n return text({\n booked: false,\n reason: 'insufficient_usdc_solana',\n wallet: owner,\n network: reqs.network,\n have: `${(have / 1e6).toFixed(6)} USDC`,\n need: `${(need / 1e6).toFixed(6)} USDC`,\n faucet: 'https://faucet.circle.com',\n message: `Buyer wallet ${owner} has ${(have / 1e6).toFixed(6)} USDC on ${reqs.network}, needs ${(need / 1e6).toFixed(6)}. Top up devnet USDC at https://faucet.circle.com (Solana Devnet) and retry.`,\n });\n }\n\n // Sign the frozen quote (facilitator sponsors the fee), then pay { sessionId }.\n const xPayment = await signSolanaX402Payment({\n requirements: reqs,\n secretKey,\n rpcUrl: SOLANA_RPC,\n });\n const paidRes = await fetch(`${API_BASE}/x402/${encodeURIComponent(merchantId)}/checkout`, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n authorization: `Bearer ${TOKEN}`,\n 'x-payment': xPayment,\n },\n body: JSON.stringify({ sessionId: session.sessionId }),\n });\n const paid = (await paidRes.json()) as {\n status?: string;\n txHash?: string;\n paymentIntentId?: string;\n };\n if (paidRes.status !== 200) {\n throw new Error(`solana x402 settle -> ${paidRes.status}: ${JSON.stringify(paid)}`);\n }\n const paidUsdc = `${(need / 1e6).toFixed(6)} USDC`;\n const cluster = reqs.network === 'solana-devnet' ? '?cluster=devnet' : '';\n // finishBooking (not text) so a Solana booking is recorded like every other\n // rail — the card rehydrates to a receipt on reload instead of the picker.\n return finishBooking(sku, {\n booked: paid.status === 'captured',\n product: session.name,\n quantity,\n protocol: 'x402',\n payer: 'buyer chain wallet (x402)',\n priceEur: session.priceEur,\n paidUsdc: `${paidUsdc} (fixed test charge, merchant-quoted)`,\n payTo: reqs.payTo,\n network: reqs.network,\n paymentAuthorization:\n 'x402 SVM transfer (partially signed; facilitator co-signs feePayer + submits + sponsors gas)',\n status: paid.status,\n txHash: paid.txHash,\n explorer: paid.txHash\n ? `https://explorer.solana.com/tx/${paid.txHash}${cluster}`\n : undefined,\n paymentIntentId: paid.paymentIntentId,\n sessionId: session.sessionId,\n message: `Booked ${session.name} × ${quantity} — paid ${paidUsdc} via x402 · USDC on Solana to ${reqs.payTo} (${paid.status}).`,\n });\n }\n\n const { merchantId } = await backend<{ merchantId: string }>('/health');\n\n // The MERCHANT opens a merchant-quoted x402 session — IT sets the USDC\n // price (the gateway has no Sinocare catalog). We just pay it; we never\n // compute or pass the amount. Same shape as the ACP `/checkout-acp` flow.\n const session = await backend<{\n sessionId: string;\n name: string;\n accepts: X402PaymentRequirements[];\n amount: number;\n payTo: string;\n network: string;\n priceEur?: string;\n }>('/checkout-x402', {\n method: 'POST',\n body: JSON.stringify({ sku, quantity, ...(BUYER ? { buyer: BUYER } : {}) }),\n });\n const reqs = session.accepts?.[0];\n if (!reqs) throw new Error('merchant x402 session missing payment requirements');\n\n // Pre-flight: a real payer key + a real facilitator + an empty wallet = a\n // cryptic on-chain decline. Check the balance first (skipped in throwaway-\n // key / STUB mode) against the MERCHANT's quoted amount.\n const buyer = await buyerSigner();\n if (buyer) {\n const have = await usdcBalance({\n network: reqs.network,\n owner: buyer.address,\n token: reqs.asset,\n });\n if (have < BigInt(session.amount)) {\n const onTestnet = reqs.network === 'base-sepolia';\n return text({\n booked: false,\n reason: 'insufficient_usdc',\n wallet: buyer.address,\n network: reqs.network,\n have: fmtUsdc(have),\n need: fmtUsdc(BigInt(session.amount)),\n faucet: onTestnet ? 'https://faucet.circle.com' : undefined,\n message: `Buyer wallet ${buyer.address} has ${fmtUsdc(have)} on ${reqs.network}, needs ${fmtUsdc(BigInt(session.amount))}.${onTestnet ? ' Top up at https://faucet.circle.com (20 USDC / 2h) and retry.' : ' Fund it with USDC on Base and retry.'}`,\n });\n }\n }\n\n // Sign the merchant's frozen quote, then pay the session — the amount is\n // set by the merchant; we just reference { sessionId }.\n const xPayment = await signX402(reqs);\n const paidRes = await fetch(`${API_BASE}/x402/${encodeURIComponent(merchantId)}/checkout`, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n authorization: `Bearer ${TOKEN}`,\n 'x-payment': xPayment,\n },\n body: JSON.stringify({ sessionId: session.sessionId }),\n });\n const paid = (await paidRes.json()) as {\n status?: string;\n txHash?: string;\n paymentIntentId?: string;\n };\n if (paidRes.status !== 200) {\n throw new Error(`x402 settle -> ${paidRes.status}: ${JSON.stringify(paid)}`);\n }\n const paidUsdc = fmtUsdc(BigInt(session.amount));\n return finishBooking(sku, {\n booked: paid.status === 'captured',\n product: session.name,\n quantity,\n protocol: 'x402',\n payer: 'buyer chain wallet (x402)',\n priceEur: session.priceEur,\n paidUsdc: `${paidUsdc} (fixed test charge, merchant-quoted)`,\n payTo: reqs.payTo,\n network: reqs.network,\n status: paid.status,\n txHash: paid.txHash,\n paymentIntentId: paid.paymentIntentId,\n sessionId: session.sessionId,\n message: `Booked ${session.name} × ${quantity} — paid ${paidUsdc} via x402 (merchant-quoted) to ${reqs.payTo} (${paid.status}).`,\n });\n }\n\n if (req.params.name === 'x402_buyer_wallet') {\n const buyer = await buyerSigner();\n if (!buyer) {\n return text({\n configured: false,\n message:\n 'No buyer signer configured — x402 signs with a throwaway, unfunded key (only settles under a STUB facilitator). Set X402_SIGNER=cdp (+ CDP_API_KEY_ID/_SECRET/_WALLET_SECRET) for a CDP Server Wallet, or X402_PAYER_PRIVATE_KEY for a local key, to pay real testnet/mainnet USDC.',\n });\n }\n const [sepolia, mainnet] = await Promise.all([\n usdcBalance({ network: 'base-sepolia', owner: buyer.address }),\n usdcBalance({ network: 'base', owner: buyer.address }),\n ]);\n return text({\n address: buyer.address,\n balances: { 'base-sepolia': fmtUsdc(sepolia), base: fmtUsdc(mainnet) },\n faucet: 'https://faucet.circle.com (Base Sepolia USDC — 20 / 2h per address)',\n note: 'Fund this address with USDC to pay for x402 bookings. Testnet: use the faucet. Mainnet: send real USDC on Base.',\n });\n }\n\n if (req.params.name === 'buy_sinocare_product_rlusd') {\n if (!TOKEN) {\n return {\n content: [{ type: 'text', text: 'set AGENTBANK_AGENT_TOKEN (a test agent:execute key)' }],\n isError: true,\n };\n }\n const wallet = xrplBuyer();\n if (!wallet) {\n return {\n content: [\n {\n type: 'text',\n text: 'set XRPL_BUYER_SEED (an sEd… testnet seed holding RLUSD + a little test XRP) to pay RLUSD bookings',\n },\n ],\n isError: true,\n };\n }\n const sku = String(args.sku ?? '');\n const quantity = Math.max(Number(args.quantity) || 1, 1);\n const { merchantId } = await backend<{ merchantId: string }>('/health');\n\n // The MERCHANT opens a merchant-quoted RLUSD session — IT sets the price\n // (the gateway holds no Sinocare catalog). We just pay it. Same shape as the\n // USDC x402 flow, only `currency: 'RLUSD'` flips the chain to the XRP Ledger.\n const session = await backend<{\n sessionId: string;\n name: string;\n accepts: XrplPaymentRequirements[];\n amount: number;\n payTo: string;\n network: string;\n priceEur?: string;\n }>('/checkout-x402', {\n method: 'POST',\n body: JSON.stringify({ sku, quantity, currency: 'RLUSD' }),\n });\n const reqs = session.accepts?.[0];\n if (!reqs) throw new Error('merchant RLUSD session missing payment requirements');\n\n // One XRPL connection for both the balance pre-flight AND the signing\n // autofill. Pre-flight catches an unfunded / trust-line-less wallet before\n // we bother signing; on enough balance we sign the merchant's frozen quote.\n const issuer = reqs.extra?.issuer;\n const preflight = await withXrplClient(async (client) => {\n const have = issuer\n ? await rlusdBalance(client, wallet.classicAddress, reqs.asset, issuer)\n : '0';\n if (Number(have) < Number(reqs.maxAmountRequired)) {\n return { have, xPayment: null as string | null };\n }\n return { have, xPayment: await signXrpl(client, reqs, wallet) };\n });\n if (preflight.xPayment === null) {\n return text({\n booked: false,\n reason: 'insufficient_rlusd',\n wallet: wallet.classicAddress,\n network: reqs.network,\n have: `${preflight.have} RLUSD`,\n need: `${reqs.maxAmountRequired} RLUSD`,\n message: `Buyer wallet ${wallet.classicAddress} holds ${preflight.have} RLUSD, needs ${reqs.maxAmountRequired}. Fund it with testnet RLUSD (+ a little test XRP for the fee) and retry.`,\n });\n }\n\n // Pay the session (amount is merchant-set; we just reference { sessionId }).\n const xPayment = preflight.xPayment;\n const paidRes = await fetch(`${API_BASE}/x402/${encodeURIComponent(merchantId)}/checkout`, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n authorization: `Bearer ${TOKEN}`,\n 'x-payment': xPayment,\n },\n body: JSON.stringify({ sessionId: session.sessionId }),\n });\n const paid = (await paidRes.json()) as {\n status?: string;\n txHash?: string;\n paymentIntentId?: string;\n };\n if (paidRes.status !== 200) {\n throw new Error(`rlusd settle -> ${paidRes.status}: ${JSON.stringify(paid)}`);\n }\n return finishBooking(sku, {\n booked: paid.status === 'captured',\n product: session.name,\n quantity,\n protocol: 'x402',\n payer: 'buyer chain wallet (x402)',\n priceEur: session.priceEur,\n paidRlusd: `${reqs.maxAmountRequired} RLUSD (fixed test charge, merchant-quoted)`,\n payTo: reqs.payTo,\n network: reqs.network,\n status: paid.status,\n txHash: paid.txHash,\n explorer: paid.txHash ? `https://testnet.xrpl.org/transactions/${paid.txHash}` : undefined,\n paymentIntentId: paid.paymentIntentId,\n sessionId: session.sessionId,\n message: `Booked ${session.name} × ${quantity} — paid ${reqs.maxAmountRequired} RLUSD via x402 on the XRP Ledger to ${reqs.payTo} (${paid.status}).`,\n });\n }\n\n if (req.params.name === 'buy_sinocare_product_skyfire') {\n if (!SKYFIRE_BUYER_API_KEY || !SKYFIRE_SELLER_SERVICE_ID) {\n return {\n content: [\n {\n type: 'text',\n text: 'set SKYFIRE_BUYER_API_KEY + SKYFIRE_SELLER_SERVICE_ID to mint a Skyfire pay token (the merchant backend charges it via the merchant SDK)',\n },\n ],\n isError: true,\n };\n }\n const sku = String(args.sku ?? '');\n const quantity = Math.max(Number(args.quantity) || 1, 1);\n const product = await backend<Product>(`/catalog/${encodeURIComponent(sku)}`).catch(\n () => null,\n );\n const resortName = product?.name ?? sku;\n\n // The BUYER mints a Skyfire-signed PAY token (Skyfire's key signs it — the\n // buyer can't self-sign), then presents it to the MERCHANT backend, which\n // charges it via the merchant SDK (checkout.chargeSkyfire → the gateway\n // verifies it against Skyfire's live JWKS and records/settles). Three-layer:\n // buyer mints, merchant charges — the demo never calls the gateway directly.\n const token = await mintSkyfirePayToken(SKYFIRE_TEST_AMOUNT);\n const out = await backend<{\n agent?: { verified?: boolean; subject?: string };\n paymentIntentId?: string;\n status?: string;\n currency?: string;\n amount?: number;\n // True when a seller-charge redeemed the token (real USDC moved); false =\n // verified + recorded ('initiated', no money).\n settled?: boolean;\n }>('/checkout-skyfire', { method: 'POST', body: JSON.stringify({ sku, token }) });\n const amountStr =\n out.amount != null && out.currency\n ? `${(out.amount / 1e6).toFixed(6)} ${out.currency}`\n : `~${SKYFIRE_TEST_AMOUNT} USD`;\n const status = out.status ?? 'initiated';\n const captured = out.settled === true || status === 'captured';\n // Two terminal states, both a successful booking: CAPTURED (seller-charge\n // configured → real USDC moved) vs VERIFIED+RECORDED (no seller key → PI\n // initiated, no money moved).\n const message = captured\n ? `Booked ${resortName} × ${quantity} via Skyfire KYAPay — ${amountStr} charged (Skyfire redeemed the PAY token buyer → seller) and the payment intent is captured (PI ${status}). agentbank verified the agent + payment authorization against Skyfire's live JWKS, then settled it via Skyfire seller-charge.`\n : `Booked ${resortName} × ${quantity} via Skyfire KYAPay — ${amountStr} verified against Skyfire's live JWKS + recorded (PI ${status}). agentbank verified the agent + payment authorization and recorded it; no seller key is configured, so it did not auto-capture and no money moved.`;\n return finishBooking(sku, {\n booked: out.agent?.verified === true,\n product: resortName,\n quantity,\n protocol: 'skyfire',\n payer: 'skyfire buyer token',\n paidUsdc: captured\n ? `${amountStr} (Skyfire KYAPay — charged, captured)`\n : `${amountStr} (Skyfire KYAPay authorization, recorded)`,\n buyerAgent: out.agent?.subject,\n paymentAuthorization:\n 'Skyfire KYAPay PAY token (Skyfire ES256-signed, verified against the live JWKS)',\n status,\n orderId: out.paymentIntentId,\n message,\n });\n }\n\n if (req.params.name === 'buy_sinocare_product_mpp') {\n if (!TEMPO_BUYER_PRIVATE_KEY) {\n return {\n content: [\n {\n type: 'text',\n text: 'set TEMPO_BUYER_PRIVATE_KEY (a funded Tempo testnet key) to pay via MPP · Tempo',\n },\n ],\n isError: true,\n };\n }\n const sku = String(args.sku ?? '');\n const quantity = Math.max(Number(args.quantity) || 1, 1);\n const product = await backend<Product>(`/catalog/${encodeURIComponent(sku)}`).catch(\n () => null,\n );\n const resortName = product?.name ?? sku;\n\n // Three-layer MPP · Tempo — the demo talks only to the MERCHANT backend,\n // which mediates the HTTP-402 dance via the merchant SDK (checkout.openMPP):\n // 1. ask the backend to open the charge → it returns the 402 challenge;\n // 2. the buyer pays it on Tempo (SDK @curless/agentbank-protocols/tempo);\n // 3. hand the credential back to the backend → it settles.\n const opened = await backend<{ status: string; wwwAuthenticate?: string }>('/checkout-mpp', {\n method: 'POST',\n body: JSON.stringify({ sku }),\n });\n if (opened.status !== 'payment_required' || !opened.wwwAuthenticate) {\n throw new Error(`mpp open expected a challenge, got ${JSON.stringify(opened)}`);\n }\n const { credential, txHash } = await payMppTempoChallenge({\n wwwAuthenticate: opened.wwwAuthenticate,\n privateKey: TEMPO_BUYER_PRIVATE_KEY,\n rpcUrl: TEMPO_RPC,\n }).catch((e: unknown) => {\n throw new Error(\n `mpp tempo pay failed (${(e as Error).message}) — is the gateway's TEMPO_RECIPIENT set + the buyer wallet funded?`,\n );\n });\n const out = await backend<{\n status?: string;\n paymentIntentId?: string;\n amount?: number;\n currency?: string;\n }>('/checkout-mpp', { method: 'POST', body: JSON.stringify({ sku, credential }) });\n const paidStr = `${(MPP_TEMPO_TEST_AMOUNT / 1e6).toFixed(6)} pathUSD (Tempo TIP-20, on-chain)`;\n const settled = out.status === 'settled';\n return finishBooking(sku, {\n booked: settled,\n product: resortName,\n quantity,\n protocol: 'mpp',\n payer: 'buyer chain wallet (MPP·Tempo)',\n total: paidStr,\n paidUsdc: paidStr,\n status: settled ? 'captured' : out.status,\n orderId: out.paymentIntentId,\n txHash,\n message: `Booked ${resortName} × ${quantity} via MPP · Tempo — paid ${paidStr} to Sinocare on the Tempo chain (tx ${txHash.slice(0, 14)}…). The merchant backend issued the HTTP-402 challenge (via the merchant SDK) and, after the buyer paid on-chain, VERIFIED the TIP-20 transfer by hash — capturing the payment intent${out.paymentIntentId ? ` (PI ${out.paymentIntentId})` : ''}.`,\n });\n }\n\n if (req.params.name === 'xrpl_buyer_wallet') {\n const wallet = xrplBuyer();\n if (!wallet) {\n return text({\n configured: false,\n message:\n 'No XRPL buyer wallet — set XRPL_BUYER_SEED (an sEd… testnet seed) to pay RLUSD bookings. Fund it with testnet RLUSD (a trust line to the RLUSD issuer) + a little test XRP for the fee/reserve.',\n });\n }\n const issuer = process.env.XRPL_RLUSD_ISSUER ?? 'rQhWct2fv4Vc4KRjRgMrxa8xPN9Zx9iLKV';\n const RLUSD_HEX = '524C555344000000000000000000000000000000';\n const have = await withXrplClient((client) =>\n rlusdBalance(client, wallet.classicAddress, RLUSD_HEX, issuer),\n );\n return text({\n address: wallet.classicAddress,\n network: 'xrpl:1 (testnet)',\n rlusd: `${have} RLUSD`,\n issuer,\n explorer: `https://testnet.xrpl.org/accounts/${wallet.classicAddress}`,\n note: 'Fund this address with testnet RLUSD (needs a trust line to the RLUSD issuer) + a little test XRP for the fee/reserve to pay RLUSD bookings.',\n });\n }\n\n if (req.params.name === 'list_my_orders') {\n // The merchant backend lists its orders (single-merchant demo = my orders).\n const { orders } = await backend<{\n orders: Array<{\n id: string;\n status: string;\n amount: number;\n currency: string;\n protocol: string;\n lineItems?: Array<{ name: string; quantity: number }>;\n createdAt: string;\n // Set when a refund has already been asked for on this booking.\n refundRequest?: { id: string; status: string } | null;\n }>;\n }>('/orders');\n // Shared with the wallet connector: the currency scaling (a 50000 RLUSD\n // order is 0.05, not 500 — the amount is minor units at the CURRENCY's\n // own scale) and the rule that a pending refund request outranks the\n // payment status, because this list is where the buyer decides whether to\n // ask, and `paid` beside a live 申请退款 button invites a second request.\n const view = ordersView(orders);\n // Render the orders CARD (structuredContent + _meta), not a plain JSON table —\n // the card lists each booking with a 申请退款 button.\n return {\n content: [\n {\n type: 'text' as const,\n text: orders.length\n ? `You have ${orders.length} Sinocare booking(s) — shown in the card (each settled one has a 申请退款 button).`\n : 'No Sinocare bookings yet.',\n },\n ],\n structuredContent: view,\n _meta: CHECKOUT_UI_META,\n };\n }\n\n if (req.params.name === 'request_refund') {\n if (!TOKEN) {\n return {\n content: [{ type: 'text', text: 'set AGENTBANK_AGENT_TOKEN (a test agent:execute key)' }],\n isError: true,\n };\n }\n const orderId = String(args.orderId ?? '');\n if (!orderId) throw new Error('orderId is required (from list_my_orders)');\n // The BUYER asks the gateway directly (its own agent token) — the merchant\n // then approves/rejects from its MCP. Money moves only on approval+Curless.\n const res = await fetch(`${API_BASE}/v1/refund-requests`, {\n method: 'POST',\n headers: { 'content-type': 'application/json', authorization: `Bearer ${TOKEN}` },\n body: JSON.stringify({ orderId, reason: args.reason ? String(args.reason) : undefined }),\n });\n const out = (await res.json()) as {\n refundRequest?: { id: string; status: string };\n error?: { message?: string; type?: string } | string;\n message?: string;\n };\n if (!res.ok) {\n // The gateway's typed errors carry a message written for a human (\"this\n // order has already been refunded\", \"already has an open refund\n // request\"). Surface THAT — a raw JSON dump of the envelope is what the\n // buyer used to get, which tells them nothing about what to do next.\n const detail =\n (typeof out.error === 'object' && out.error?.message) ||\n (typeof out.error === 'string' ? out.error : '') ||\n out.message ||\n `HTTP ${res.status}`;\n throw new Error(String(detail));\n }\n return text({\n requested: true,\n refundRequestId: out.refundRequest?.id,\n status: out.refundRequest?.status,\n message: `Refund requested for ${orderId}. Sinocare will review and approve or reject it.`,\n });\n }\n\n if (req.params.name === 'authorize_agent_budget') {\n const maxAmountEur = Number(args.maxAmountEur);\n if (!Number.isFinite(maxAmountEur) || maxAmountEur <= 0) {\n throw new Error('maxAmountEur must be a positive number (EUR)');\n }\n const hours = Math.max(1, Math.floor(Number(args.hours) || 24));\n const expiresAt = new Date(Date.now() + hours * 3_600_000).toISOString();\n const maxAmount = Math.round(maxAmountEur * 100); // EUR minor units (cents)\n // The user signs the delegation as a real AP2 IntentMandate (ES256 JWS).\n const mandate = await signIntentMandate({\n prompt: `Autonomous Sinocare booking — up to €${maxAmountEur} for ${hours}h`,\n constraints: { maxAmount },\n expiresAt,\n });\n agentBudget = { mandate, maxAmountEur, expiresAt };\n saveBudget(agentBudget); // survive a process restart\n return text({\n authorized: true,\n maxBudgetPerBooking: `€${maxAmountEur.toLocaleString('en-IE')}`,\n expiresAt,\n message: `Agent authorized to book Sinocare up to €${maxAmountEur} per booking until ${expiresAt}. It can now complete UCP bookings under that cap without asking you to confirm each one; over-cap or expired bookings are rejected by the gateway.`,\n });\n }\n\n if (req.params.name === 'agent_budget_status') {\n if (!agentBudget || Date.parse(agentBudget.expiresAt) < Date.now()) {\n agentBudget = null;\n saveBudget(null);\n return text({\n authorized: false,\n message: 'No active booking authorization — use authorize_agent_budget to delegate one.',\n });\n }\n return text({\n authorized: true,\n maxBudgetPerBooking: `€${agentBudget.maxAmountEur.toLocaleString('en-IE')}`,\n expiresAt: agentBudget.expiresAt,\n });\n }\n\n if (req.params.name === 'revoke_agent_budget') {\n const had = agentBudget !== null;\n agentBudget = null;\n saveBudget(null);\n return text({\n revoked: had,\n message: had\n ? 'Booking authorization revoked — the agent needs a fresh one to book autonomously.'\n : 'No authorization was set.',\n });\n }\n\n return { content: [{ type: 'text', text: `unknown tool: ${req.params.name}` }], isError: true };\n } catch (err) {\n return { content: [{ type: 'text', text: `Error: ${(err as Error).message}` }], isError: true };\n }\n});\n\nawait server.connect(new StdioServerTransport());\n","/**\n * The Sinocare catalogue, as both storefronts read it.\n *\n * The aisles were written out four times — twice in a tool's `enum`, twice in a\n * filter — and adding `analyzer` fixed two of the four. The shop then answered\n * \"analyzer\" with the whole catalogue on one storefront and with the right two\n * products on the other, which reads as a bug in the catalogue rather than in\n * the two lists that had drifted apart.\n */\n\n/**\n * The aisles a product can be in. ONE list: the tool schemas and the filters\n * are all built from it, so a new aisle cannot be half-added.\n */\nexport const CATEGORIES = ['meter', 'cgm', 'analyzer', 'strips', 'lancets', 'accessory'] as const;\n\nexport type Category = (typeof CATEGORIES)[number];\n\nexport const isCategory = (value: unknown): value is Category =>\n typeof value === 'string' && (CATEGORIES as readonly string[]).includes(value);\n\n/**\n * A product as the merchant backend spells it.\n *\n * These field names are the MERCHANT's, not ours. A card that renamed\n * `priceDisplay` to `priceEur` on the way through rendered a product with no\n * price at all — and a checkout that does not show what it costs is the one\n * thing it must never be.\n */\nexport type Product = {\n sku: string;\n name: string;\n category?: string;\n price?: number;\n currency?: string;\n priceDisplay?: string;\n description?: string;\n imageUrl?: string;\n source?: string;\n};\n\n/** The `category` property, for a tool's inputSchema. Built from CATEGORIES. */\nexport const categoryProperty = {\n type: 'string',\n enum: [...CATEGORIES],\n description: 'narrow to one aisle',\n} as const;\n\n/**\n * Narrow a catalogue to one aisle.\n *\n * An UNKNOWN category returns everything. A shop that answers a typo with \"no\n * products\" reads as an empty shop, and the person cannot tell the difference\n * between \"we do not sell that\" and \"you spelled it wrong\".\n */\nexport const filterByCategory = <T extends { category?: unknown }>(\n items: readonly T[],\n raw: unknown,\n): T[] => {\n const wanted = typeof raw === 'string' ? raw.trim().toLowerCase() : '';\n if (!isCategory(wanted)) return [...items];\n return items.filter((item) => String(item.category ?? '') === wanted);\n};\n\n/** The `?category=` a backend catalogue call should carry, or '' for all of it. */\nexport const categoryQuery = (raw: unknown): string => {\n const wanted = typeof raw === 'string' ? raw.trim().toLowerCase() : '';\n return isCategory(wanted) ? `?category=${encodeURIComponent(wanted)}` : '';\n};\n\n/** What a product costs, as a person reads it. */\nexport const priceDisplayOf = (product: Product): string =>\n product.priceDisplay ?? `€${((product.price ?? 0) / 100).toLocaleString('en-IE')}`;\n\n/**\n * Minor units at the CURRENCY's own scale — 2 for fiat, 6 for the stablecoins\n * this gateway settles. Dividing everything by 100 turns a 50000 RLUSD order\n * into 500 instead of 0.05, which is the same mistake in the direction that\n * costs the most.\n */\nconst decimals = (currency: string): number =>\n ['USDC', 'RLUSD', 'USDT'].includes(currency.toUpperCase()) ? 6 : 2;\n\n/** An amount in minor units, as a person reads it. */\nexport const formatMinor = (amount: number, currency: string): string => {\n const dp = decimals(currency);\n return `${(amount / 10 ** dp).toLocaleString('en-IE', { maximumFractionDigits: dp })} ${currency}`;\n};\n\n/**\n * Which product someone meant.\n *\n * ⚠️ An ambiguous name is NEVER guessed. \"Safe-Accu\" and \"Safe-Accu2\" differ by\n * one character, and every caller of this ends in a checkout — one of them in a\n * charge. Taking the first of several matches is how the wrong box of strips\n * gets paid for, so several matches is an answer ('ambiguous') with the\n * candidates attached, not a pick.\n *\n * In order: the exact sku, then an exact name, then the only product where what\n * was typed ends on a WORD BOUNDARY, then the only product that contains it at\n * all.\n *\n * That third step is what makes \"Safe-Accu\" answerable in a catalogue that also\n * sells \"Safe-Accu2\": the query is a whole token of the first name and only\n * part of a token in the second, so this is a distinction, not a coin toss.\n * Without it the one product name the instructions tell the model to try came\n * back as \"matches 2 products — say which one\".\n */\nexport type ProductMatch =\n | { kind: 'found'; product: Product }\n | { kind: 'ambiguous'; candidates: Product[] }\n | { kind: 'none' };\n\nexport const resolveProduct = (\n items: readonly Product[],\n query: { sku?: unknown; query?: unknown },\n): ProductMatch => {\n const sku = String(query.sku ?? '').trim();\n if (sku) {\n const bySku = items.find((it) => it.sku.toLowerCase() === sku.toLowerCase());\n if (bySku) return { kind: 'found', product: bySku };\n }\n // A sku that matched nothing may still be a NAME — hosts and people both pass\n // one in the `sku` field, and refusing to look would answer \"no such product\"\n // for something on the shelf.\n const typed = (sku || String(query.query ?? '')).trim().toLowerCase();\n if (!typed) return { kind: 'none' };\n\n const exact = items.filter((it) => it.name.trim().toLowerCase() === typed);\n if (exact.length === 1 && exact[0]) return { kind: 'found', product: exact[0] };\n\n const partial = items.filter((it) => it.name.toLowerCase().includes(typed));\n if (partial.length === 1 && partial[0]) return { kind: 'found', product: partial[0] };\n if (!partial.length) return { kind: 'none' };\n\n // Does what was typed END a word in this name? \"safe-accu\" does in \"Safe-Accu\n // Blood Glucose…\" (a space follows) and does not in \"Safe-Accu2 …\" (a digit\n // does).\n const onWordBoundary = partial.filter((it) => {\n const name = it.name.toLowerCase();\n let at = name.indexOf(typed);\n while (at !== -1) {\n const after = name[at + typed.length];\n if (after === undefined || !/[a-z0-9]/.test(after)) return true;\n at = name.indexOf(typed, at + 1);\n }\n return false;\n });\n if (onWordBoundary.length === 1 && onWordBoundary[0]) {\n return { kind: 'found', product: onWordBoundary[0] };\n }\n return { kind: 'ambiguous', candidates: partial };\n};\n","/**\n * What a storefront has to say about its checkout card, and to two different\n * hosts at once.\n *\n * Both storefronts serve the same card under their own `ui://` uri, and both\n * had their own copy of this metadata. The copies drifted in the two places\n * that fail SILENTLY — the image allow-list and the ChatGPT keys — so one shop\n * showed photos and the other showed nothing, with no error anywhere.\n */\n\n/**\n * ⚠️ `text/html;profile=mcp-app`.\n *\n * `text/html+skybridge` is a plausible near-miss that fails silently: the host\n * stops recognising the resource as a card and answers \"there was a problem\n * displaying content\".\n */\nexport const CARD_MIME = 'text/html;profile=mcp-app';\n\n/**\n * WHERE THE CARD MAY LOAD IMAGES FROM.\n *\n * ⚠️ An MCP App runs in a sandboxed iframe and the spec is explicit: an empty\n * or omitted `resourceDomains` means NO network resources. Every product photo\n * is then blocked before it leaves the starting line — not by the CDN, not by\n * the markup — and the grid renders as broken-image icons. That exact omission\n * cost three rounds of \"the pictures still aren't showing\" on the moody\n * storefront, chased through theories about the CDN, and then cost it again\n * here because the fix landed in one storefront's copy.\n *\n * The catalogue is served from a Shopify store, and Shopify re-hosts whatever\n * image a product was created with, so the photos come off Shopify's CDN.\n */\nexport const IMAGE_ORIGINS = ['https://cdn.shopify.com'];\n\n/**\n * \"This tool's result is renderable by that card.\"\n *\n * ⚠️ Declare it ONLY on tools whose result the card can actually draw.\n * Blanket-attaching it told the host that a product LIST renders the checkout\n * card: the host drew the card, the card got `{products:[…]}` with no view it\n * knew, and it sat on \"Loading…\" for ever — under a tool that had worked\n * perfectly and returned exactly what was asked for.\n *\n * Both host namespaces, because they read different ones: `ui.resourceUri` is\n * MCP Apps (Claude), `openai/outputTemplate` is ChatGPT's Apps SDK, and\n * `openai/widgetAccessible` is what lets the rendered card call back into these\n * tools — which is the entire interaction, so without it every click in the\n * card does nothing.\n */\nexport const uiMeta = (cardUri: string) => ({\n ui: { resourceUri: cardUri },\n 'ui/resourceUri': cardUri,\n 'openai/outputTemplate': cardUri,\n 'openai/widgetAccessible': true,\n});\n\n/**\n * The card resource's own metadata: what it may load, and (remote storefronts\n * only) the origin it is served from.\n *\n * `widgetDomain` is for a storefront that HAS a public origin. A stdio server\n * has none — passing its gateway URL there would name an origin the card is not\n * served from.\n */\nexport const widgetMeta = (opts: { widgetDomain?: string; imageOrigins?: string[] } = {}) => {\n const resourceDomains = opts.imageOrigins ?? IMAGE_ORIGINS;\n return {\n ui: { csp: { resourceDomains, connectDomains: [] } },\n 'openai/widgetCSP': { connect_domains: [], resource_domains: resourceDomains },\n ...(opts.widgetDomain ? { 'openai/widgetDomain': opts.widgetDomain } : {}),\n };\n};\n\n/**\n * Does this storefront serve the uri a host is asking for?\n *\n * ⚠️ ANY version of OUR card uri gets the CURRENT card.\n *\n * Versioning the uri busts host caches — that is why it is bumped. But a host\n * that cached an OLD uri keeps asking for it, and answering \"unknown resource\"\n * turns a merely stale card into a broken one: the host reports \"there was a\n * problem displaying content\" and there is nothing the person can do about it.\n * So the bump keeps its job (a new uri is a cache miss and fetches fresh) and\n * loses its sting (an old uri still gets a card).\n */\nexport const servesCardUri = (prefix: string, asked: string): boolean => asked.startsWith(prefix);\n","/**\n * WHAT THE CHECKOUT CARD IS HANDED, and what it may draw.\n *\n * The card used to know both shops: one copy hard-coded seven rails in a\n * `GROUPS` table, the other hard-coded three wallet rows in a `ROWS` table, and\n * each knew the tool names to call. A card that knows its shop is a card that\n * has to be forked per shop — which is how there came to be two of them.\n *\n * So the shop sends its own payment table and the card draws whatever arrives.\n * The card knows how a group, a row and an action LOOK; it does not know what\n * this shop sells or how it takes money.\n */\nimport type { Product } from './catalog.js';\n\n/** One clickable thing in a payment row — a tool call, or a link out. */\nexport type CheckoutAction = {\n label: string;\n /** The tool this button calls. It must be a tool of THIS server. */\n tool: string;\n /** Merged over `{sku, quantity}` when the button is pressed. */\n args?: Record<string, unknown>;\n /** Opens a URL from the result rather than rendering a receipt. */\n ext?: boolean;\n /**\n * Finish this one in the CONVERSATION, not in the card.\n *\n * A widget may only call tools on the server that gave it —\n * `callServerTool` takes a tool name and no server — so a credential living\n * in a separately-installed wallet connector is out of reach. Dressed up as\n * a click-to-pay button it produced a card that opened a checkout, said\n * \"one step left\", and left the person with nothing to press.\n */\n chat?: boolean;\n};\n\n/**\n * One row of the picker.\n *\n * ONE consistent axis wherever money has a denomination: the title is WHAT you\n * pay and WHERE it settles, the actions are WHICH protocol carries it. A card\n * rail is the exception, and only because it has no coin/chain axis at all.\n */\nexport type CheckoutRow = {\n title: string;\n sub: string;\n actions: CheckoutAction[];\n};\n\nexport type CheckoutGroup = { label: string; rows: CheckoutRow[] };\n\n/** A settled order, as the card shows it back. */\nexport type CheckoutReceipt = {\n /** What ACTUALLY paid, as the SERVER reports it — never the button clicked. */\n payer?: string;\n total?: string;\n protocol?: string;\n status?: string;\n orderId?: string;\n txHash?: string;\n explorer?: string;\n message?: string;\n};\n\n/**\n * The checkout card's payload.\n *\n * ⚠️ `product` is nested, and its fields are the MERCHANT's own names. Copying\n * the price into a `priceEur` on the way through is what once rendered a\n * product with no price at all, and a checkout that does not show what it\n * costs is the one thing it must never be.\n */\nexport type CheckoutView = {\n view: 'checkout';\n product: Pick<Product, 'sku' | 'name' | 'priceDisplay' | 'imageUrl'>;\n quantity: number;\n groups: CheckoutGroup[];\n /**\n * Set ONLY when THIS checkout was paid — not when this product has ever been\n * bought. Looking it up by sku treats a product as a purchase: on an account\n * that had bought 42 of 44 products, almost every card rendered as an\n * already-paid receipt the moment it self-healed, hiding the payment options\n * behind an order from days earlier.\n */\n receipt?: CheckoutReceipt | null;\n /** Which language the card's own chrome speaks. Default English. */\n lang?: CardLang;\n};\n\nexport const checkoutView = (input: {\n product: Pick<Product, 'sku' | 'name' | 'priceDisplay' | 'imageUrl'>;\n quantity?: number;\n groups: CheckoutGroup[];\n receipt?: CheckoutReceipt | null;\n lang?: CardLang;\n}): CheckoutView => ({\n view: 'checkout',\n product: input.product,\n quantity: Math.max(input.quantity ?? 1, 1),\n groups: input.groups,\n receipt: input.receipt ?? null,\n ...(input.lang ? { lang: input.lang } : {}),\n});\n\n// ── the card's own words ─────────────────────────────────────────────────────\n/**\n * The strings the CARD owns, in the languages the two shops speak.\n *\n * Everything a SHOP says — group labels, row titles, button labels, every\n * `message` — comes from that shop over the wire, so the two keep their own\n * voice. These fifteen are the card's own furniture, and they are here rather\n * than in the widget because one widget source is built to one file: a card\n * that hard-coded them would have to be forked to speak the other language,\n * which is the fork this whole change removes.\n */\nexport type CardLang = 'en' | 'zh';\n\nexport type CardCopy = {\n loading: string;\n opening: string;\n /** `{method}` — the row the person clicked. */\n paying: string;\n emptyCatalog: string;\n noOrders: string;\n /** `{count}` — how many products are on the shelf. */\n productCount: string;\n /** `{product}` — what the receipt is for, when the server sent no message. */\n orderedFallback: string;\n /** `{product}` — the one sentence the card says on the person's behalf. */\n handOffAsk: string;\n back: string;\n orderAgain: string;\n viewOrders: string;\n ordered: string;\n notCompleted: string;\n oneStepLeft: string;\n signIn: string;\n signInGo: string;\n signInWait: string;\n /** `{email}` — who just finished signing in, while the payment goes through. */\n signedInPaying: string;\n signInExpired: string;\n /**\n * Never having started a sign-in is NOT a timeout. Telling someone their code\n * expired when they were never given one sends them looking for a mistake\n * they did not make.\n */\n signInNeverStarted: string;\n ordersFailed: string;\n walletSaidNo: string;\n openWallet: string;\n goPay: string;\n payWait: string;\n payTimeout: string;\n handedOver: string;\n handedOverBody: string;\n handedOverWait: string;\n refund: string;\n refunding: string;\n refundFailed: string;\n onChainTx: string;\n paidBy: string;\n cannotOpen: string;\n cardFailed: string;\n nothingToShow: string;\n nothingToShowBody: string;\n refresh: string;\n ordersTitle: string;\n};\n\nexport const CARD_COPY: Record<CardLang, CardCopy> = {\n en: {\n loading: 'Loading…',\n opening: 'Opening checkout…',\n paying: 'Paying via {method}…',\n emptyCatalog: 'Nothing in the catalog.',\n noOrders: 'No orders yet — pick something from the catalog first.',\n productCount: '{count} products',\n orderedFallback: 'Ordered {product}',\n handOffAsk: 'Buy {product} with my Curless wallet connector',\n back: '← Choose another way',\n orderAgain: 'Order another',\n viewOrders: 'View my orders →',\n ordered: 'Ordered',\n notCompleted: 'Not completed',\n oneStepLeft: 'One step left',\n signIn: 'Sign in to Curless',\n signInGo: 'Sign in ↗',\n signInWait:\n 'This card reconnects on its own once you are in. Binding a card happens there too.',\n signedInPaying: 'Signed in as {email} — paying…',\n signInExpired: 'That sign-in timed out — start it again above.',\n signInNeverStarted: 'No sign-in started yet — use the link above.',\n ordersFailed: 'Could not load your orders.',\n walletSaidNo: 'Wallet said no',\n openWallet: 'Open wallet ↗',\n goPay: 'Go pay ↗',\n payWait: 'Approve it in your browser and this card turns into a receipt on its own.',\n payTimeout: 'No payment received yet. Once you have paid, check “my orders”.',\n handedOver: 'Handed to your assistant',\n handedOverBody:\n 'This one is paid from the Curless wallet connector you installed — the credential lives there, and this card cannot reach it.',\n handedOverWait:\n 'Your assistant will open the checkout, get you signed in if needed, and confirm the amount with you before anything is charged.',\n refund: 'Request a refund',\n refunding: 'Working…',\n refundFailed: 'The refund request failed',\n onChainTx: 'On-chain tx:',\n paidBy: 'Paid by:',\n cannotOpen: 'Could not open the checkout',\n cardFailed: 'The card could not load',\n nothingToShow: 'Nothing to show here',\n nothingToShowBody: 'Ask for a product by name, or for the catalog.',\n refresh: 'Refresh',\n ordersTitle: 'My orders',\n },\n zh: {\n loading: '加载中…',\n opening: '正在开结账…',\n paying: '正在通过 {method} 结算…',\n emptyCatalog: '目录里没有商品。',\n noOrders: '还没有订单 —— 先从目录里挑一件。',\n productCount: '{count} 件商品',\n orderedFallback: '已下单 {product}',\n handOffAsk: '用我的 Curless 钱包连接器付这笔({product})',\n back: '← 换个支付方式',\n orderAgain: '再订一次',\n viewOrders: '查看我的订单 →',\n ordered: '已下单',\n notCompleted: '未完成',\n oneStepLeft: '还差一步',\n signIn: '登录 Curless 钱包',\n signInGo: '去登录 ↗',\n signInWait: '登录完这张卡会自己接上。绑卡也在同一个页面里。',\n signedInPaying: '已登录 {email} —— 正在付款…',\n signInExpired: '登录超时了,点上面重新来一次。',\n signInNeverStarted: '还没开始登录 —— 点上面那个链接。',\n ordersFailed: '订单加载失败。',\n walletSaidNo: '钱包未放行',\n openWallet: '打开钱包 ↗',\n goPay: '去付款 ↗',\n payWait: '在浏览器里批准后,这张卡会自己变成收据。',\n payTimeout: '还没收到付款。付完点一下\"我的订单\"看看。',\n handedOver: '交给助手继续',\n handedOverBody:\n '这笔要用你自己装的 Curless 钱包连接器付 —— 凭据在那个连接器里,这张卡够不到它。',\n handedOverWait: '助手会先让你登录钱包,再铸一张凭据完成付款,扣款前会跟你确认金额。',\n refund: '申请退款',\n refunding: '处理中…',\n refundFailed: '退款申请失败',\n onChainTx: '链上交易:',\n paidBy: '付款方式:',\n cannotOpen: '打不开结账',\n cardFailed: '卡片加载失败',\n nothingToShow: '这里没有可显示的内容',\n nothingToShowBody: '说出商品名字,或者让我打开目录。',\n refresh: '刷新',\n ordersTitle: '我的订单',\n },\n};\n","/**\n * The storefront's `instructions` — a SPEC FOR THE MODEL, not documentation.\n *\n * The host injects this into the model's context, so every rule here is load-\n * bearing. Left to itself the model reads the tool list, renders the catalogue\n * card, and then ALSO pops a chooser asking which product to buy — over a grid\n * where every tile already has a Buy button. A card the model talks over has\n * replaced nothing.\n *\n * ⚠️ The two storefronts do NOT say the same thing, and must not.\n *\n * The seven-rail demo has to explain a choice between ACP / UCP / x402 /\n * RLUSD / Payment Link; the wallet connector has three wallet shapes and no\n * rails at all. What they share is the SHAPE and the handful of rules that\n * were each learned by watching the model get it wrong. So the payment\n * sentence is the caller's, and everything around it is fixed here.\n */\nexport type InstructionOptions = {\n /** One line: whose shop this is, and that the card IS the shop. */\n opening: string;\n /**\n * How THIS storefront's checkout card lets someone pay, and the matching\n * \"do not retype the options as text\" rule. The one genuinely different\n * paragraph.\n */\n paymentCard: string;\n /**\n * The field a tool sets when an order actually went through. Named because\n * the closing rule quotes it, and the two storefronts spell it differently\n * (`ordered` here, `booked` in the older seven-rail demo).\n */\n orderedField?: string;\n /** Anything only this storefront needs — a hand-off chain, a rail fallback. */\n extra?: string[];\n};\n\nexport const buildInstructions = (opts: InstructionOptions): string =>\n [\n opts.opening,\n // Every one of these was added after watching the model do the opposite.\n 'To show what is for sale, call list_sinocare_products ONCE and STOP. Do NOT then ask which one, and do NOT retype the products as a numbered list — the person picks by tapping Buy in the card. Say at most one short line, e.g. \"Here is the Sinocare catalog — tap Buy on any of them.\"',\n opts.paymentCard,\n 'Only fall back to describing things in prose if the card genuinely cannot be shown (a host with no UI).',\n 'When the person names a product, open its checkout directly rather than asking them to confirm. If the name is ambiguous or unknown, show the catalog card and let them pick a tile.',\n ...(opts.extra ?? []),\n `Nothing is charged until the person acts. A tool that opens a checkout returns \\`${opts.orderedField ?? 'ordered'}: false\\` — report it as opened, never as bought.`,\n ].join('\\n');\n","/**\n * The tools BOTH Sinocare storefronts advertise, in one place.\n *\n * A tool description is read by a model deciding whether to move money, which\n * is why the two copies drifting mattered: the same tool told one host that a\n * wallet refusal must stop the purchase and told the other nothing at all.\n * Both tables also carried `quantity: 'number of guests/weeks'` — left over\n * from a resort demo, in a shop that sells boxes of test strips.\n *\n * The seven-rail demo adds its own rail tools on top of these; only the\n * checkout card's payment vocabulary is genuinely per-storefront, so that one\n * sentence is a parameter and everything else is fixed.\n */\nimport { categoryProperty } from './catalog.js';\n\nexport type ToolDef = {\n name: string;\n description: string;\n inputSchema: {\n type: 'object';\n properties: Record<string, unknown>;\n required?: string[];\n };\n};\n\n/** `quantity`, in a shop that sells boxes of things. */\nconst quantity = { type: 'integer', description: 'how many, default 1' } as const;\n\nconst sku = {\n type: 'string',\n description: \"the product's exact sku (from list_sinocare_products)\",\n};\nconst query = {\n type: 'string',\n description:\n \"the product NAME (e.g. 'Safe AQ Smart') — used when the exact sku is not known; resolved against the live catalog. Pass `sku` OR `query`.\",\n};\n\nexport type StorefrontToolOptions = {\n /**\n * What the checkout card offers, in this storefront's own vocabulary — the\n * three wallet shapes, or the seven rails. Appended to a fixed description,\n * because \"open the card instead of listing the options as text\" is the same\n * instruction in both shops and only the list differs.\n */\n checkoutOffers: string;\n};\n\n/**\n * The tools both storefronts advertise, in the order a buyer meets them.\n *\n * ⚠️ Every name here must have a dispatch case on both sides. A range-edit once\n * deleted four cases while the table still advertised them, and the server\n * answered \"unknown tool\" for tools it had just listed.\n */\nexport const storefrontTools = (opts: StorefrontToolOptions): ToolDef[] => [\n {\n name: 'list_sinocare_products',\n description:\n 'Browse the Sinocare catalog AS A CARD — every tile opens a checkout for that product, so the person picks and pays in one place. Prefer this over listing the catalog as text. Optional `category` filter: meter | cgm | analyzer | strips | lancets | accessory.',\n inputSchema: {\n type: 'object',\n properties: { category: categoryProperty },\n },\n },\n {\n name: 'get_sinocare_product',\n description:\n 'One Sinocare product by its sku (from list_sinocare_products), with its price and what is in the box.',\n inputSchema: {\n type: 'object',\n properties: { sku },\n required: ['sku'],\n },\n },\n {\n name: 'start_sinocare_checkout',\n description: `THE DEFAULT WAY TO BUY. Open the visual checkout card for a product, so the person picks how to pay by clicking IN THE CARD instead of typing. ${opts.checkoutOffers} When someone wants to buy, CALL THIS — do not list the payment options as text and ask which one. Identify the product: pass its \\`sku\\` OR a \\`query\\` name (e.g. 'Safe-Accu'). To show the whole catalog instead, call list_sinocare_products — it renders as a card too, and every tile opens that product's checkout.`,\n inputSchema: {\n type: 'object',\n properties: { sku, query, quantity },\n },\n },\n {\n name: 'buy_sinocare_product_wallet',\n description:\n 'Order and pay in one call, from the Curless wallet THIS storefront holds a session for: the wallet mints a credential from the card THEY bound, capped by the limits THEY set, scoped to this seller and this amount for 15 minutes. If nobody is signed in it returns a browser sign-in link and orders nothing — show the person the link; the card polls on its own and pays once they finish. Do NOT ask them for a password in the chat. ⚠️ If the wallet refuses — over their own limit, no card bound — say what it said and STOP; do not pay for this another way.',\n inputSchema: {\n type: 'object',\n properties: { sku, quantity },\n required: ['sku'],\n },\n },\n {\n name: 'start_sinocare_wallet_handoff',\n description:\n \"HAND-OFF, step 1. Open a Sinocare checkout to be paid by a SEPARATELY-INSTALLED Curless wallet connector. Returns {sessionId, merchantId, amount, currency} and charges nothing. Next: call that connector's `wallet_pay_credential` with exactly this amount, currency and merchantRef=merchantId, then pass the token it returns to `pay_sinocare_with_token`. Use this only when the buyer HAS that connector installed; if they do not, use buy_sinocare_product_wallet or pay_sinocare_hosted. ⚠️ If the wallet refuses — not signed in, over their own limit, no card bound — STOP and repeat what it said. Do NOT pay for this another way: they chose to pay from their own wallet, and settling it elsewhere spends different money and reports it as theirs.\",\n inputSchema: {\n type: 'object',\n properties: { sku, query, quantity },\n },\n },\n {\n name: 'pay_sinocare_with_token',\n description:\n 'HAND-OFF, step 2. Complete a checkout opened by start_sinocare_wallet_handoff using a credential minted elsewhere (a Stripe shared payment token, spt_…). Sinocare completes with its own merchant key and never sees a card.',\n inputSchema: {\n type: 'object',\n properties: {\n sessionId: { type: 'string', description: 'from start_sinocare_wallet_handoff' },\n merchantId: { type: 'string', description: 'from start_sinocare_wallet_handoff' },\n token: { type: 'string', description: 'spt_… from the wallet' },\n },\n required: ['sessionId', 'merchantId', 'token'],\n },\n },\n {\n name: 'pay_sinocare_hosted',\n description:\n 'HOSTED. Open a checkout and hand back a link the person approves in their own browser — they see the amount and the merchant before anything is charged, and the gateway completes it. Needs nothing installed anywhere. Nothing is charged by this call: poll get_sinocare_order_status afterwards, do not claim it is paid until that says so, and do not pay for it another way while they are still on the page.',\n inputSchema: {\n type: 'object',\n properties: { sku, quantity },\n required: ['sku'],\n },\n },\n {\n name: 'get_sinocare_order_status',\n description:\n 'Has this checkout been paid? Use after pay_sinocare_hosted — the approval happens in a browser and this server is never told when it does. `completed` means the money moved.',\n inputSchema: {\n type: 'object',\n properties: {\n sessionId: { type: 'string' },\n merchantId: { type: 'string', description: 'from the tool that opened this checkout' },\n },\n required: ['sessionId', 'merchantId'],\n },\n },\n {\n name: 'curless_wallet_login_status',\n description:\n 'Is anyone signed into the wallet THIS storefront holds? A separately-installed Curless wallet connector has its own session and this tool knows nothing about it — ask that connector instead. The checkout card polls this by itself; you do not normally need to.',\n inputSchema: { type: 'object', properties: {} },\n },\n {\n name: 'curless_wallet_logout',\n description:\n 'Sign out of the wallet session this storefront holds, and revoke it so it cannot be used again. Use when the person asks to sign out, or is done and someone else may use this machine. Says nothing about a separately-installed wallet connector.',\n inputSchema: { type: 'object', properties: {} },\n },\n {\n name: 'list_my_orders',\n description:\n 'Orders placed through this storefront, newest first, with id, product, amount and status. Renders as a card where each settled order has a refund button; the order id is what request_refund takes.',\n inputSchema: { type: 'object', properties: {} },\n },\n {\n name: 'request_refund',\n description:\n 'Ask Sinocare to refund an order. Pass the order id (ord_…) from list_my_orders and an optional reason. The buyer asks; the merchant approves from its own tools, and money moves only on approval.',\n inputSchema: {\n type: 'object',\n properties: {\n orderId: { type: 'string', description: 'order id from list_my_orders (ord_…)' },\n reason: { type: 'string' },\n },\n required: ['orderId'],\n },\n },\n];\n","/**\n * What a tool result LOOKS like to the card.\n *\n * `view` is the card's dispatch key, and both storefronts were building these\n * shapes by hand. The catalogue view once came back as the merchant card's\n * `{currency, count, products}` after a rename that changed identifiers and not\n * payloads — the card read `products`, got undefined, and drew nothing.\n */\nimport { type Product, formatMinor } from './catalog.js';\n\n/** The catalogue, as the card's product grid reads it. */\nexport const productsView = (products: readonly Product[]) => ({\n view: 'products' as const,\n count: products.length,\n products: [...products],\n});\n\n/** An order as the merchant backend lists it. */\nexport type BackendOrder = {\n id: string;\n status: string;\n amount: number;\n currency: string;\n protocol?: string;\n lineItems?: Array<{ name: string; quantity: number }>;\n createdAt?: string;\n /** Set when a refund has already been asked for on this order. */\n refundRequest?: { id: string; status: string } | null;\n};\n\n/** One order as the card's list reads it. */\nexport type OrderRow = {\n orderId: string;\n status: string;\n refundPending: boolean;\n product: string;\n total: string;\n protocol?: string;\n date: string;\n};\n\n/**\n * The buyer's orders, as the card's list reads them.\n *\n * A PENDING refund request outranks the payment status here, because this list\n * is where the buyer decides whether to ask. `paid` beside a live \"request\n * refund\" button, on an order they already asked about, invites them to ask\n * twice. `refundPending` is a flag rather than a substring of the status, so\n * the button and the wording cannot drift apart when the gateway gains a new\n * refund-ish status tomorrow.\n */\nexport const ordersView = (orders: readonly BackendOrder[]) => ({\n view: 'orders' as const,\n orders: orders.map(\n (o): OrderRow => ({\n orderId: o.id,\n status: o.refundRequest\n ? o.refundRequest.status === 'approved'\n ? 'refund approved'\n : 'refund requested'\n : o.status,\n refundPending: Boolean(o.refundRequest),\n product: o.lineItems?.map((li) => `${li.name} ×${li.quantity}`).join(', ') ?? '',\n total: formatMinor(Number(o.amount ?? 0), String(o.currency ?? 'EUR')),\n protocol: o.protocol,\n date: o.createdAt?.slice(0, 10) ?? '',\n }),\n ),\n});\n","// GENERATED by packages/internal/sinocare-storefront/widget (`npm run build`).\n// Do not edit by hand, and do not edit the OTHER storefront's copy either — both\n// are emitted from the one card source, and they are byte-identical on purpose.\n// A single self-contained HTML (Vite + vite-plugin-singlefile, with the MCP Apps\n// SDK bundled), base64-embedded so it is bundler-safe.\n//\n// ⚠️ After regenerating, BUMP THE CARD URI in each server. A host caches the\n// card's HTML by that uri, so new card code under the old one leaves every\n// existing conversation rendering the previous build — the server returns\n// corrected data and the old JS draws the old picture, which is\n// indistinguishable from \"the fix did not work\".\nexport const CHECKOUT_CARD_HTML: string = Buffer.from(\n 'PCFkb2N0eXBlIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgY2hhcnNldD0idXRmLTgiIC8+CiAgICA8c3R5bGU+CiAgICAgIC8qIFRoZW1lIG9mZiB0aGUgSE9TVCdzIG93biBkZXNpZ24gdG9rZW5zICh0aGUgTUNQIEFwcHMgU0RLIGluamVjdHMgdGhlbSksCiAgICAgICAgIHNvIHRoZSBjYXJkIHNpdHMgbmF0aXZlbHkgaW5zaWRlIENsYXVkZSDigJQgbGlnaHQvZGFyaywgZm9udHMgYW5kIHJhZGlpCiAgICAgICAgIGFsbCBtYXRjaCB3aXRob3V0IHRoaXMgY2FyZCBrbm93aW5nIHdoaWNoIGlzIGluIGZvcmNlLiBUaGUgZmFsbGJhY2tzCiAgICAgICAgIGFyZSB3aGF0IGEgaG9zdCB0aGF0IGluamVjdHMgbm90aGluZyBnZXRzLiAqLwogICAgICA6cm9vdCB7CiAgICAgICAgLS1iZzogdmFyKC0tY29sb3ItYmFja2dyb3VuZC1wcmltYXJ5LCAjZmZmZmZmKTsKICAgICAgICAtLWJnLXNvZnQ6IHZhcigtLWNvbG9yLWJhY2tncm91bmQtc2Vjb25kYXJ5LCAjZjZmOGZhKTsKICAgICAgICAtLWZnOiB2YXIoLS1jb2xvci10ZXh0LXByaW1hcnksICMxYTFmMzYpOwogICAgICAgIC0tZmctc29mdDogdmFyKC0tY29sb3ItdGV4dC1zZWNvbmRhcnksICM2OTczODYpOwogICAgICAgIC0tZmctZmFpbnQ6IHZhcigtLWNvbG9yLXRleHQtdGVydGlhcnksICM4NzkyYTIpOwogICAgICAgIC0tbGluZTogdmFyKC0tY29sb3ItYm9yZGVyLXByaW1hcnksICNlM2U4ZWUpOwogICAgICAgIC0tZ29vZDogdmFyKC0tY29sb3ItdGV4dC1zdWNjZXNzLCAjMWE3ZjVhKTsKICAgICAgICAtLWdvb2QtYmc6IHZhcigtLWNvbG9yLWJhY2tncm91bmQtc3VjY2VzcywgI2RkZjNlNCk7CiAgICAgICAgLS1iYWQ6IHZhcigtLWNvbG9yLXRleHQtZGFuZ2VyLCAjYjMyNjFlKTsKICAgICAgICAtLWJhZC1iZzogdmFyKC0tY29sb3ItYmFja2dyb3VuZC1kYW5nZXIsICNmYmU2ZTQpOwogICAgICAgIC0td2FybjogdmFyKC0tY29sb3ItdGV4dC13YXJuaW5nLCAjOGE1YTAwKTsKICAgICAgICAtLXdhcm4tYmc6IHZhcigtLWNvbG9yLWJhY2tncm91bmQtd2FybmluZywgI2ZkZjBkNSk7CiAgICAgICAgLS1ibHVlOiB2YXIoLS1jb2xvci10ZXh0LWFjY2VudCwgIzI1NjNlYik7CiAgICAgICAgLS1saW5rOiB2YXIoLS1jb2xvci10ZXh0LWxpbmssIHZhcigtLWNvbG9yLXRleHQtYWNjZW50LCAjMjU2M2ViKSk7CiAgICAgICAgLS1yYWRpdXM6IHZhcigtLWJvcmRlci1yYWRpdXMtbGcsIDE0cHgpOwogICAgICAgIC0tcmFkaXVzLXNtOiB2YXIoLS1ib3JkZXItcmFkaXVzLXNtLCA5cHgpOwogICAgICAgIC0tZm9udDogdmFyKC0tZm9udC1zYW5zLCBzeXN0ZW0tdWksIC1hcHBsZS1zeXN0ZW0sICdTZWdvZSBVSScsIFJvYm90bywgc2Fucy1zZXJpZik7CiAgICAgICAgLS1tb25vOiB2YXIoLS1mb250LW1vbm8sIHVpLW1vbm9zcGFjZSwgJ1NGIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlKTsKICAgICAgfQogICAgICAqIHsgYm94LXNpemluZzogYm9yZGVyLWJveDsgfQogICAgICBib2R5IHsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgZm9udC1mYW1pbHk6IHZhcigtLWZvbnQpOwogICAgICAgIGNvbG9yOiB2YXIoLS1mZyk7CiAgICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICAgICAgLXdlYmtpdC1mb250LXNtb290aGluZzogYW50aWFsaWFzZWQ7CiAgICAgIH0KICAgICAgLmNhcmQgewogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWxpbmUpOwogICAgICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cyk7CiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tYmcpOwogICAgICAgIGJveC1zaGFkb3c6IDAgMXB4IDJweCByZ2JhKDEwLCAyMCwgNDAsIDAuMDQpLCAwIDJweCA1cHggcmdiYSgxMCwgMjAsIDQwLCAwLjA0KTsKICAgICAgICBtYXgtd2lkdGg6IDQ2MHB4OwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIH0KICAgICAgLmhlYWQgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGJhc2VsaW5lOwogICAgICAgIGdhcDogOHB4OwogICAgICAgIHBhZGRpbmc6IDE1cHggMjBweCAwOwogICAgICB9CiAgICAgIC5oZWFkIC50aXRsZSB7IGZvbnQtc2l6ZTogMTVweDsgZm9udC13ZWlnaHQ6IDY1MDsgfQogICAgICAuaGVhZCAubWVyY2hhbnQgewogICAgICAgIG1hcmdpbi1sZWZ0OiBhdXRvOwogICAgICAgIGZvbnQtZmFtaWx5OiB2YXIoLS1tb25vKTsKICAgICAgICBmb250LXNpemU6IDExcHg7CiAgICAgICAgY29sb3I6IHZhcigtLWZnLXNvZnQpOwogICAgICB9CiAgICAgIC8qIFJlZnJlc2gg4oCUIGFuIG9yZGVycyBjYXJkIGlzIHRoZSBzbmFwc2hvdCBvZiBvbmUgdG9vbCBjYWxsLCBhbmQgYSByZWZ1bmQKICAgICAgICAgc3RhdHVzIGNoYW5nZXMgd2hpbGUgeW91IGFyZSBsb29raW5nIGF0IGl0ICh0aGUgbWVyY2hhbnQgYXBwcm92ZXMsIHRoZW4KICAgICAgICAgdGhlIGdhdGV3YXkgc2lnbmFscyBjb21wbGV0aW9uKS4gV2l0aG91dCB0aGlzIGJ1dHRvbiB0aGUgb25seSB3YXkgdG8KICAgICAgICAgc2VlIHRoZSBuZXcgc3RhdGUgaXMgdG8gZ28gYmFjayB0byB0aGUgY2hhdCBhbmQgYXNrIGZvciB0aGUgbGlzdCBhZ2Fpbi4KICAgICAgICAgT25seSB0aGUgb3JkZXJzIHZpZXcgc2V0cyBvbmUuICovCiAgICAgIC5oZWFkIC5yZWZyZXNoIHsKICAgICAgICBtYXJnaW4tbGVmdDogOHB4OwogICAgICAgIGFsaWduLXNlbGY6IGNlbnRlcjsKICAgICAgICBmbGV4OiBub25lOwogICAgICAgIGRpc3BsYXk6IGdyaWQ7CiAgICAgICAgcGxhY2UtaXRlbXM6IGNlbnRlcjsKICAgICAgICB3aWR0aDogMjRweDsKICAgICAgICBoZWlnaHQ6IDI0cHg7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1saW5lKTsKICAgICAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1iZyk7CiAgICAgICAgY29sb3I6IHZhcigtLWZnLXNvZnQpOwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICB0cmFuc2l0aW9uOiBib3JkZXItY29sb3IgLjEycywgYmFja2dyb3VuZCAuMTJzLCBjb2xvciAuMTJzOwogICAgICB9CiAgICAgIC5oZWFkIC5yZWZyZXNoOmhvdmVyOm5vdCg6ZGlzYWJsZWQpIHsgY29sb3I6IHZhcigtLWZnKTsgYm9yZGVyLWNvbG9yOiB2YXIoLS1mZy1zb2Z0KTsgfQogICAgICAuaGVhZCAucmVmcmVzaDpkaXNhYmxlZCB7IGN1cnNvcjogZGVmYXVsdDsgb3BhY2l0eTogLjY7IH0KICAgICAgLmhlYWQgLnJlZnJlc2hbaGlkZGVuXSB7IGRpc3BsYXk6IG5vbmU7IH0KICAgICAgLmhlYWQgLnJlZnJlc2ggc3ZnIHsgd2lkdGg6IDEzcHg7IGhlaWdodDogMTNweDsgZGlzcGxheTogYmxvY2s7IH0KICAgICAgLyogQSByZWZyZXNoIG1vc3RseSBjb21lcyBiYWNrIGxvb2tpbmcgaWRlbnRpY2FsIOKAlCB3aXRob3V0IHRoZSBzcGluIGl0CiAgICAgICAgIHJlYWRzIGFzIG5vdGhpbmcgaGF2aW5nIGhhcHBlbmVkLCBhbmQgcGVvcGxlIHByZXNzIGl0IGFnYWluLiAqLwogICAgICAuaGVhZCAucmVmcmVzaC5idXN5IHN2ZyB7IGFuaW1hdGlvbjogY20tc3BpbiAuN3MgbGluZWFyIGluZmluaXRlOyB9CiAgICAgIEBrZXlmcmFtZXMgY20tc3BpbiB7IHRvIHsgdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTsgfSB9CiAgICAgICNjb250ZW50IHsgcGFkZGluZzogNnB4IDIwcHggMThweDsgfQogICAgICAuaGVybyB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxNTBweDsKICAgICAgICBvYmplY3QtZml0OiBjb3ZlcjsKICAgICAgICBib3JkZXItcmFkaXVzOiAxMHB4OwogICAgICAgIG1hcmdpbjogMnB4IDAgMTJweDsKICAgICAgfQogICAgICAucHJpY2UgewogICAgICAgIGZvbnQtc2l6ZTogMjZweDsKICAgICAgICBmb250LXdlaWdodDogNzAwOwogICAgICAgIGxldHRlci1zcGFjaW5nOiAtMC4wMWVtOwogICAgICAgIG1hcmdpbjogNnB4IDAgMnB4OwogICAgICB9CiAgICAgIC5zdWIgeyBmb250LXNpemU6IDEyLjVweDsgY29sb3I6IHZhcigtLWZnLXNvZnQpOyBtYXJnaW4tYm90dG9tOiAxMHB4OyB9CiAgICAgIC8qIEEgcGF5bWVudCBncm91cCdzIGhlYWRlci4gTm8gdGV4dC10cmFuc2Zvcm0g4oCUIGEgcHJvdG9jb2wgbmFtZSBsaWtlCiAgICAgICAgICJ4NDAyIiBpcyBkZWxpYmVyYXRlbHkgbG93ZXJjYXNlLCBhbmQgdXBwZXJjYXNpbmcgaXQgZ2l2ZXMgIlg0MDIiLiAqLwogICAgICAuZ3JvdXAtbGFiZWwgewogICAgICAgIGZvbnQtc2l6ZTogMTFweDsKICAgICAgICBmb250LXdlaWdodDogNjAwOwogICAgICAgIGNvbG9yOiB2YXIoLS1mZy1mYWludCk7CiAgICAgICAgbGV0dGVyLXNwYWNpbmc6IDAuMDNlbTsKICAgICAgICBtYXJnaW46IDE0cHggMCA3cHg7CiAgICAgIH0KICAgICAgLmdyb3VwLWxhYmVsOmZpcnN0LW9mLXR5cGUgeyBtYXJnaW4tdG9wOiA0cHg7IH0KICAgICAgLyogUGF5bWVudCByb3dzOiBhIHRpdGxlICsgc3ViIG9uIHRoZSBsZWZ0LCBvbmUtb3ItbW9yZSBhY3Rpb24gcGlsbHMgb24KICAgICAgICAgdGhlIHJpZ2h0ICh0aGUgcHJvdG9jb2wgc3ViLWNob2ljZSkuICovCiAgICAgIC5yb3dzIHsgZGlzcGxheTogZ3JpZDsgZ2FwOiA4cHg7IH0KICAgICAgLnJvdyB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIC8qIHdyYXAsIHNvIGFuIGlubGluZSBlcnJvciAoLm8tZXJyLCBmbGV4LWJhc2lzOjEwMCUpIGRyb3BzIHRvIGl0cyBvd24KICAgICAgICAgICBsaW5lIGluc3RlYWQgb2YgYmVpbmcgc3F1ZWV6ZWQgaW4gYmVzaWRlIHRoZSBzdGF0dXMgcGlsbCAqLwogICAgICAgIGZsZXgtd3JhcDogd3JhcDsKICAgICAgICBnYXA6IDEwcHg7CiAgICAgICAgcGFkZGluZzogMTFweCAxNHB4OwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWxpbmUpOwogICAgICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy1zbSk7CiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tYmctc29mdCk7CiAgICAgIH0KICAgICAgLnJvdy1tYWluIHsgZGlzcGxheTogZmxleDsgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsgZ2FwOiAycHg7IG1pbi13aWR0aDogMDsgfQogICAgICAuci10aXRsZSB7IGZvbnQtd2VpZ2h0OiA2MDA7IGZvbnQtc2l6ZTogMTMuNXB4OyB9CiAgICAgIC5yLXN1YiB7IGNvbG9yOiB2YXIoLS1mZy1zb2Z0KTsgZm9udC1zaXplOiAxMnB4OyB9CiAgICAgIC8qIGFsaWduLWl0ZW1zOmNlbnRlciwgTk9UIHRoZSBkZWZhdWx0IHN0cmV0Y2gg4oCUIGEgc3RyZXRjaGVkIC5vc3RhdCBwaWxsCiAgICAgICAgIGdyb3dzIHRvIHRoZSBuZWlnaGJvdXJpbmcgYnV0dG9uJ3MgaGVpZ2h0IGFuZCByZWFkcyBhcyBhIHRhbGwgbG9wc2lkZWQKICAgICAgICAgb3ZhbCwgYnV0IG9ubHkgb24gcm93cyB0aGF0IEhBVkUgYSBidXR0b24sIHdoaWNoIGlzIHdoeSBpdCBsb29rZWQgbGlrZQogICAgICAgICBhIG9uZS1yb3cgZ2xpdGNoLiAqLwogICAgICAucm93LWFjdHMgeyBtYXJnaW4tbGVmdDogYXV0bzsgZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZ2FwOiA2cHg7IGZsZXgtc2hyaW5rOiAwOyB9CiAgICAgIC5hY3QgewogICAgICAgIHBhZGRpbmc6IDdweCAxMnB4OwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWxpbmUpOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgICAgIGJhY2tncm91bmQ6IHZhcigtLWJnKTsKICAgICAgICBjb2xvcjogdmFyKC0tZmcpOwogICAgICAgIGZvbnQtZmFtaWx5OiB2YXIoLS1mb250KTsKICAgICAgICBmb250LXNpemU6IDEyLjVweDsKICAgICAgICBmb250LXdlaWdodDogNTUwOwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICAgIHRyYW5zaXRpb246IGJvcmRlci1jb2xvciAuMTJzLCBiYWNrZ3JvdW5kIC4xMnMsIGNvbG9yIC4xMnM7CiAgICAgIH0KICAgICAgLmFjdDpob3ZlciB7IGJvcmRlci1jb2xvcjogdmFyKC0tYmx1ZSk7IGNvbG9yOiB2YXIoLS1ibHVlKTsgfQogICAgICAvKiBUaGUgb25lIGFjdGlvbiBvbiB0aGUgc2NyZWVuIOKAlCBhIGJvcmRlcmVkIGdob3N0IGJ1dHRvbiBuZXh0IHRvIGEgdGV4dAogICAgICAgICBmaWVsZCByZWFkcyBhcyBvcHRpb25hbCwgYW5kIHRoaXMgb25lIGlzIHRoZSB3aG9sZSBwb2ludCBvZiB0aGUgc3RhdGUuICovCiAgICAgIC5hY3QucHJpbWFyeSB7IGJhY2tncm91bmQ6IHZhcigtLWJsdWUpOyBjb2xvcjogI2ZmZjsgYm9yZGVyLWNvbG9yOiB2YXIoLS1ibHVlKTsgfQogICAgICAuYWN0LnByaW1hcnk6aG92ZXIgeyBjb2xvcjogI2ZmZjsgb3BhY2l0eTogLjk7IH0KICAgICAgLmFjdDpkaXNhYmxlZCB7IG9wYWNpdHk6IC41NTsgY3Vyc29yOiBkZWZhdWx0OyB9CiAgICAgIC5hY3QuZXh0IHsgY29sb3I6IHZhcigtLWxpbmspOyBib3JkZXItY29sb3I6IHZhcigtLWxpbmspOyB9CiAgICAgIC5hY3QuZXh0OmhvdmVyIHsgYmFja2dyb3VuZDogdmFyKC0tYmx1ZSk7IGNvbG9yOiAjZmZmOyBib3JkZXItY29sb3I6IHZhcigtLWJsdWUpOyB9CiAgICAgIC8qIE9yZGVyIHN0YXR1cyBwaWxsIChvcmRlcnMgdmlldykgKi8KICAgICAgLm9saXN0IHsgbWFyZ2luLXRvcDogMnB4OyB9CiAgICAgIC5vc3RhdCB7CiAgICAgICAgZm9udC1zaXplOiAxMXB4OyBmb250LXdlaWdodDogNjAwOyBwYWRkaW5nOiAzcHggOXB4OyBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICB9CiAgICAgIC5vc3RhdC5vayB7IGNvbG9yOiB2YXIoLS1nb29kKTsgYmFja2dyb3VuZDogdmFyKC0tZ29vZC1iZyk7IH0KICAgICAgLm9zdGF0Lndhcm4geyBjb2xvcjogdmFyKC0tYmFkKTsgYmFja2dyb3VuZDogdmFyKC0tYmFkLWJnKTsgfQogICAgICAub3N0YXQubXV0ZWQgeyBjb2xvcjogdmFyKC0tZmctc29mdCk7IGJhY2tncm91bmQ6IHZhcigtLWJnLXNvZnQpOyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1saW5lKTsgfQogICAgICAvKiBXaHkgYSByZWZ1bmQgcmVxdWVzdCBmYWlsZWQsIG9uIHRoZSByb3cgaXQgYmVsb25ncyB0by4gU2lsZW5jZSBtYWRlIHRoZQogICAgICAgICBidXllciByZXRyeSBzb21ldGhpbmcgdGhhdCBjb3VsZCBuZXZlciBzdWNjZWVkLiAqLwogICAgICAuby1lcnIgewogICAgICAgIGZsZXgtYmFzaXM6IDEwMCU7IG1hcmdpbi10b3A6IDZweDsgZm9udC1zaXplOiAxMnB4OyBsaW5lLWhlaWdodDogMS40NTsKICAgICAgICBjb2xvcjogdmFyKC0tYmFkKTsgYmFja2dyb3VuZDogdmFyKC0tYmctc29mdCk7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWxpbmUpOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDhweDsgcGFkZGluZzogN3B4IDlweDsgb3ZlcmZsb3ctd3JhcDogYW55d2hlcmU7CiAgICAgIH0KICAgICAgLyogUmVzdWx0IHN0YXRlcyAqLwogICAgICAucmVzdWx0IHsgcGFkZGluZzogNHB4IDAgMnB4OyB9CiAgICAgIC5iYWRnZSB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogNnB4OwogICAgICAgIGZvbnQtc2l6ZTogMTJweDsgZm9udC13ZWlnaHQ6IDYwMDsgcGFkZGluZzogNHB4IDEwcHg7IGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgICB9CiAgICAgIC5iYWRnZS5vayB7IGNvbG9yOiB2YXIoLS1nb29kKTsgYmFja2dyb3VuZDogdmFyKC0tZ29vZC1iZyk7IH0KICAgICAgLmJhZGdlLmVyciB7IGNvbG9yOiB2YXIoLS1iYWQpOyBiYWNrZ3JvdW5kOiB2YXIoLS1iYWQtYmcpOyB9CiAgICAgIC8qIE5laXRoZXIgc3VjY2VzcyBub3IgZmFpbHVyZTogc29tZXRoaW5nIHRoZSBwZXJzb24gc3RpbGwgaGFzIHRvIGRvLiBSZWQKICAgICAgICAgd291bGQgdGVsbCB0aGVtIHRoZSBwYXltZW50IGJyb2tlLCBhbmQgaXQgZGlkIG5vdCDigJQgbm90aGluZyB3YXMKICAgICAgICAgY2hhcmdlZCwgcHJpY2VkLCBvciBldmVuIGF0dGVtcHRlZC4gKi8KICAgICAgLmJhZGdlLnRvZG8geyBjb2xvcjogdmFyKC0td2Fybik7IGJhY2tncm91bmQ6IHZhcigtLXdhcm4tYmcpOyB9CiAgICAgIC5sb2dpbnJvdyB7IGRpc3BsYXk6IGZsZXg7IGdhcDogOHB4OyBtYXJnaW46IDEycHggMCA0cHg7IGZsZXgtd3JhcDogd3JhcDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgfQogICAgICAuZXJyLWxpbmUgeyBjb2xvcjogdmFyKC0tYmFkKTsgZm9udC1zaXplOiAxM3B4OyBtYXJnaW4tdG9wOiA2cHg7IH0KICAgICAgLyogU2hvd24gc28gdGhlIHBlcnNvbiBjYW4gY2hlY2sgaXQgYWdhaW5zdCB0aGUgYnJvd3NlciBwYWdlIOKAlCB0aGUgY29kZSBpcwogICAgICAgICBhIGNvbmZpcm1hdGlvbiwgbm90IGEgc2VjcmV0LCBhbmQgaXQgaXMgd2hhdCBzdG9wcyBhIGxpbmsgc2VudCBieQogICAgICAgICBzb21lb25lIGVsc2UgZnJvbSBiZWluZyBhcHByb3ZlZCBzaWxlbnRseS4gKi8KICAgICAgLnVjb2RlIHsgZm9udDogNjAwIDEzcHggdmFyKC0tbW9ubyk7IGxldHRlci1zcGFjaW5nOiAuMDhlbTsgY29sb3I6IHZhcigtLWZnLXNvZnQpOwogICAgICAgICAgICAgICBwYWRkaW5nOiA4cHggMTFweDsgYm9yZGVyOiAxcHggZGFzaGVkIHZhcigtLWxpbmUpOyBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtc20pOyB9CiAgICAgIC53YWl0aW5nIHsgY29sb3I6IHZhcigtLWZnLWZhaW50KTsgZm9udC1zaXplOiAxMi41cHg7IG1hcmdpbi10b3A6IDEwcHg7IH0KICAgICAgLnJlc3VsdCAubGluZSB7IGZvbnQtc2l6ZTogMTNweDsgbWFyZ2luOiAxMnB4IDAgNHB4OyBsaW5lLWhlaWdodDogMS41OyB9CiAgICAgIC5yZXN1bHQgLm1vbm8geyBmb250LWZhbWlseTogdmFyKC0tbW9ubyk7IGZvbnQtc2l6ZTogMTEuNXB4OyBjb2xvcjogdmFyKC0tZmctc29mdCk7IHdvcmQtYnJlYWs6IGJyZWFrLWFsbDsgfQogICAgICAucmVzdWx0IGEudHgsIC5yZXN1bHQgLnR4IHsgY29sb3I6IHZhcigtLWxpbmspOyB0ZXh0LWRlY29yYXRpb246IG5vbmU7IGN1cnNvcjogcG9pbnRlcjsgfQogICAgICAucmVzdWx0IGJ1dHRvbi5iYWNrIHsKICAgICAgICBtYXJnaW4tdG9wOiAxNHB4OyBwYWRkaW5nOiA4cHggMTRweDsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbGluZSk7CiAgICAgICAgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLXNtKTsgYmFja2dyb3VuZDogdmFyKC0tYmctc29mdCk7IGNvbG9yOiB2YXIoLS1mZy1zb2Z0KTsKICAgICAgICBmb250LXNpemU6IDEycHg7IGN1cnNvcjogcG9pbnRlcjsKICAgICAgfQogICAgICAvKiBQcmltYXJ5IGZvcndhcmQgQ1RBIGFmdGVyIGEgc3VjY2Vzc2Z1bCBvcmRlciDihpIgdmlldyBvcmRlcnMgKi8KICAgICAgLnJlc3VsdCBidXR0b24uZ28gewogICAgICAgIG1hcmdpbi10b3A6IDE0cHg7IHBhZGRpbmc6IDlweCAxNnB4OyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ibHVlKTsKICAgICAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtc20pOyBiYWNrZ3JvdW5kOiB2YXIoLS1ibHVlKTsgY29sb3I6ICNmZmY7CiAgICAgICAgZm9udC1zaXplOiAxMi41cHg7IGZvbnQtd2VpZ2h0OiA2MDA7IGN1cnNvcjogcG9pbnRlcjsKICAgICAgfQogICAgICAucmVzdWx0IGJ1dHRvbi5nbzpob3ZlciB7IGZpbHRlcjogYnJpZ2h0bmVzcygwLjk2KTsgfQogICAgICAvKiBSZWNlaXB0IENUQXMgc2lkZSBieSBzaWRlLiBDYW5jZWxzIHRoZSBidXR0b25zJyBvd24gbWFyZ2luLXRvcCBzbyB0aGUKICAgICAgICAgcm93IGFsaWducy4gKi8KICAgICAgLnJlc3VsdCAuY3RhLXJvdyB7IGRpc3BsYXk6IGZsZXg7IGdhcDogMTBweDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZmxleC13cmFwOiB3cmFwOyB9CiAgICAgIC5yZXN1bHQgLmN0YS1yb3cgYnV0dG9uIHsgbWFyZ2luLXRvcDogMTRweDsgfQogICAgICAuZW1wdHkgeyBjb2xvcjogdmFyKC0tZmctZmFpbnQpOyBmb250LXNpemU6IDEzcHg7IHBhZGRpbmc6IDE0cHggMDsgfQogICAgICAuc3BpbiB7IGNvbG9yOiB2YXIoLS1mZy1zb2Z0KTsgZm9udC1zaXplOiAxM3B4OyBwYWRkaW5nOiAxMHB4IDA7IH0KICAgICAgLyogVGhlIHByb2R1Y3QgZ3JpZC4gQ29sdW1uIGNvdW50IGlzIGxlZnQgdG8gYXV0by1maXQg4oCUIHRoZSBjYXJkIGlzIGEgdmVyeQogICAgICAgICBkaWZmZXJlbnQgd2lkdGggaW4gZGlmZmVyZW50IGhvc3RzLCBhbmQgYSBoYXJkLWNvZGVkIDMgb3ZlcmZsb3dzCiAgICAgICAgIHNpZGV3YXlzIGluIGEgbmFycm93IG9uZS4gKi8KICAgICAgLnBncmlkIHsKICAgICAgICBkaXNwbGF5OiBncmlkOwogICAgICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KGF1dG8tZml0LCBtaW5tYXgoMTEycHgsIDFmcikpOwogICAgICAgIGdhcDogMTBweDsKICAgICAgICBwYWRkaW5nOiAxMnB4IDAgNHB4OwogICAgICB9CiAgICAgIC5wY2VsbCB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIGdhcDogNnB4OwogICAgICAgIHBhZGRpbmc6IDEwcHg7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbGluZSk7CiAgICAgICAgYm9yZGVyLXJhZGl1czogMTBweDsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1iZyk7CiAgICAgICAgbWluLXdpZHRoOiAwOwogICAgICB9CiAgICAgIC5wY2VsbCAucGltZyB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiA3NnB4OwogICAgICAgIG9iamVjdC1maXQ6IGNvbnRhaW47CiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tYmctc29mdCk7CiAgICAgICAgYm9yZGVyLXJhZGl1czogOHB4OwogICAgICB9CiAgICAgIC5wY2VsbCAucGltZy5ub25lIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgZm9udC1zaXplOiAxMC41cHg7CiAgICAgICAgbGV0dGVyLXNwYWNpbmc6IDAuMDRlbTsKICAgICAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgICAgIGNvbG9yOiB2YXIoLS1mZy1mYWludCk7CiAgICAgIH0KICAgICAgLnBjZWxsIC5wbmFtZSB7CiAgICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA1NjA7CiAgICAgICAgbGluZS1oZWlnaHQ6IDEuMzU7CiAgICAgICAgLyogTmFtZXMgZGlmZmVyIGluIGxlbmd0aDsgdW5jbGFtcGVkIHRoZXkgc3RyZXRjaCBlYWNoIGNlbGwgdG8gaXRzIG93bgogICAgICAgICAgIGhlaWdodC4gKi8KICAgICAgICBkaXNwbGF5OiAtd2Via2l0LWJveDsKICAgICAgICAtd2Via2l0LWxpbmUtY2xhbXA6IDI7CiAgICAgICAgLXdlYmtpdC1ib3gtb3JpZW50OiB2ZXJ0aWNhbDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICB9CiAgICAgIC5wY2VsbCAucG1ldGEgeyBmb250LXNpemU6IDExcHg7IG1hcmdpbi10b3A6IGF1dG87IGNvbG9yOiB2YXIoLS1mZy1zb2Z0KTsgZm9udC1mYW1pbHk6IHZhcigtLW1vbm8pOyB9CiAgICAgIC5wY2VsbCAucGJ1eSB7IHdpZHRoOiAxMDAlOyBwYWRkaW5nOiA1cHggMDsgfQogICAgPC9zdHlsZT4KICAgIDxzY3JpcHQgdHlwZT0ibW9kdWxlIiBjcm9zc29yaWdpbj4oZnVuY3Rpb24oKXtjb25zdCBuPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImxpbmsiKS5yZWxMaXN0O2lmKG4mJm4uc3VwcG9ydHMmJm4uc3VwcG9ydHMoIm1vZHVsZXByZWxvYWQiKSlyZXR1cm47Zm9yKGNvbnN0IGUgb2YgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnbGlua1tyZWw9Im1vZHVsZXByZWxvYWQiXScpKW8oZSk7bmV3IE11dGF0aW9uT2JzZXJ2ZXIoZT0+e2Zvcihjb25zdCBpIG9mIGUpaWYoaS50eXBlPT09ImNoaWxkTGlzdCIpZm9yKGNvbnN0IGEgb2YgaS5hZGRlZE5vZGVzKWEudGFnTmFtZT09PSJMSU5LIiYmYS5yZWw9PT0ibW9kdWxlcHJlbG9hZCImJm8oYSl9KS5vYnNlcnZlKGRvY3VtZW50LHtjaGlsZExpc3Q6ITAsc3VidHJlZTohMH0pO2Z1bmN0aW9uIHIoZSl7Y29uc3QgaT17fTtyZXR1cm4gZS5pbnRlZ3JpdHkmJihpLmludGVncml0eT1lLmludGVncml0eSksZS5yZWZlcnJlclBvbGljeSYmKGkucmVmZXJyZXJQb2xpY3k9ZS5yZWZlcnJlclBvbGljeSksZS5jcm9zc09yaWdpbj09PSJ1c2UtY3JlZGVudGlhbHMiP2kuY3JlZGVudGlhbHM9ImluY2x1ZGUiOmUuY3Jvc3NPcmlnaW49PT0iYW5vbnltb3VzIj9pLmNyZWRlbnRpYWxzPSJvbWl0IjppLmNyZWRlbnRpYWxzPSJzYW1lLW9yaWdpbiIsaX1mdW5jdGlvbiBvKGUpe2lmKGUuZXApcmV0dXJuO2UuZXA9ITA7Y29uc3QgaT1yKGUpO2ZldGNoKGUuaHJlZixpKX19KSgpO2NvbnN0IFJtPSJtb2R1bGVwcmVsb2FkIixDbT1mdW5jdGlvbih0LG4pe3JldHVybiBuZXcgVVJMKHQsbikuaHJlZn0sbXM9e30sQW09ZnVuY3Rpb24obixyLG8pe2xldCBlPVByb21pc2UucmVzb2x2ZSgpO2lmKHImJnIubGVuZ3RoPjApe2xldCBhPWZ1bmN0aW9uKGwpe3JldHVybiBQcm9taXNlLmFsbChsLm1hcChnPT5Qcm9taXNlLnJlc29sdmUoZykudGhlbih2PT4oe3N0YXR1czoiZnVsZmlsbGVkIix2YWx1ZTp2fSksdj0+KHtzdGF0dXM6InJlamVjdGVkIixyZWFzb246dn0pKSkpfTtjb25zdCBzPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJsaW5rIiksYz1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCJtZXRhW3Byb3BlcnR5PWNzcC1ub25jZV0iKSx1PWM/Lm5vbmNlfHxjPy5nZXRBdHRyaWJ1dGUoIm5vbmNlIik7ZT1hKHIubWFwKGw9PntpZihsPUNtKGwsbyksbCBpbiBtcylyZXR1cm47bXNbbF09ITA7Y29uc3QgZz1sLmVuZHNXaXRoKCIuY3NzIiksdj1nPydbcmVsPSJzdHlsZXNoZWV0Il0nOiIiO2lmKCEhbylmb3IobGV0IEg9cy5sZW5ndGgtMTtIPj0wO0gtLSl7Y29uc3QgTD1zW0hdO2lmKEwuaHJlZj09PWwmJighZ3x8TC5yZWw9PT0ic3R5bGVzaGVldCIpKXJldHVybn1lbHNlIGlmKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYGxpbmtbaHJlZj0iJHtsfSJdJHt2fWApKXJldHVybjtjb25zdCB5PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImxpbmsiKTtpZih5LnJlbD1nPyJzdHlsZXNoZWV0IjpSbSxnfHwoeS5hcz0ic2NyaXB0IikseS5jcm9zc09yaWdpbj0iIix5LmhyZWY9bCx1JiZ5LnNldEF0dHJpYnV0ZSgibm9uY2UiLHUpLGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoeSksZylyZXR1cm4gbmV3IFByb21pc2UoKEgsTCk9Pnt5LmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLEgpLHkuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLCgpPT5MKG5ldyBFcnJvcihgVW5hYmxlIHRvIHByZWxvYWQgQ1NTIGZvciAke2x9YCkpKX0pfSkpfWZ1bmN0aW9uIGkoYSl7Y29uc3Qgcz1uZXcgRXZlbnQoInZpdGU6cHJlbG9hZEVycm9yIix7Y2FuY2VsYWJsZTohMH0pO2lmKHMucGF5bG9hZD1hLHdpbmRvdy5kaXNwYXRjaEV2ZW50KHMpLCFzLmRlZmF1bHRQcmV2ZW50ZWQpdGhyb3cgYX1yZXR1cm4gZS50aGVuKGE9Pntmb3IoY29uc3QgcyBvZiBhfHxbXSlzLnN0YXR1cz09PSJyZWplY3RlZCImJmkocy5yZWFzb24pO3JldHVybiBuKCkuY2F0Y2goaSl9KX07dmFyIHBzO2NvbnN0IGZpPU9iamVjdC5mcmVlemUoe3N0YXR1czoiYWJvcnRlZCJ9KTtmdW5jdGlvbiBkKHQsbixyKXtmdW5jdGlvbiBvKHMsYyl7aWYocy5fem9kfHxPYmplY3QuZGVmaW5lUHJvcGVydHkocywiX3pvZCIse3ZhbHVlOntkZWY6Yyxjb25zdHI6YSx0cmFpdHM6bmV3IFNldH0sZW51bWVyYWJsZTohMX0pLHMuX3pvZC50cmFpdHMuaGFzKHQpKXJldHVybjtzLl96b2QudHJhaXRzLmFkZCh0KSxuKHMsYyk7Y29uc3QgdT1hLnByb3RvdHlwZSxsPU9iamVjdC5rZXlzKHUpO2ZvcihsZXQgZz0wO2c8bC5sZW5ndGg7ZysrKXtjb25zdCB2PWxbZ107diBpbiBzfHwoc1t2XT11W3ZdLmJpbmQocykpfX1jb25zdCBlPXI/LlBhcmVudD8/T2JqZWN0O2NsYXNzIGkgZXh0ZW5kcyBle31PYmplY3QuZGVmaW5lUHJvcGVydHkoaSwibmFtZSIse3ZhbHVlOnR9KTtmdW5jdGlvbiBhKHMpe3ZhciBjO2NvbnN0IHU9cj8uUGFyZW50P25ldyBpOnRoaXM7byh1LHMpLChjPXUuX3pvZCkuZGVmZXJyZWQ/PyhjLmRlZmVycmVkPVtdKTtmb3IoY29uc3QgbCBvZiB1Ll96b2QuZGVmZXJyZWQpbCgpO3JldHVybiB1fXJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoYSwiaW5pdCIse3ZhbHVlOm99KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoYSxTeW1ib2wuaGFzSW5zdGFuY2Use3ZhbHVlOnM9PnI/LlBhcmVudCYmcyBpbnN0YW5jZW9mIHIuUGFyZW50PyEwOnM/Ll96b2Q/LnRyYWl0cz8uaGFzKHQpfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGEsIm5hbWUiLHt2YWx1ZTp0fSksYX1jb25zdCBnaT1TeW1ib2woInpvZF9icmFuZCIpO2NsYXNzIFBlIGV4dGVuZHMgRXJyb3J7Y29uc3RydWN0b3IoKXtzdXBlcigiRW5jb3VudGVyZWQgUHJvbWlzZSBkdXJpbmcgc3luY2hyb25vdXMgcGFyc2UuIFVzZSAucGFyc2VBc3luYygpIGluc3RlYWQuIil9fWNsYXNzIFduIGV4dGVuZHMgRXJyb3J7Y29uc3RydWN0b3Iobil7c3VwZXIoYEVuY291bnRlcmVkIHVuaWRpcmVjdGlvbmFsIHRyYW5zZm9ybSBkdXJpbmcgZW5jb2RlOiAke259YCksdGhpcy5uYW1lPSJab2RFbmNvZGVFcnJvciJ9fShwcz1nbG9iYWxUaGlzKS5fX3pvZF9nbG9iYWxDb25maWc/Pyhwcy5fX3pvZF9nbG9iYWxDb25maWc9e30pO2NvbnN0IHl0PWdsb2JhbFRoaXMuX196b2RfZ2xvYmFsQ29uZmlnO2Z1bmN0aW9uIFYodCl7cmV0dXJuIHQmJk9iamVjdC5hc3NpZ24oeXQsdCkseXR9ZnVuY3Rpb24gTG0odCl7cmV0dXJuIHR9ZnVuY3Rpb24gTW0odCl7cmV0dXJuIHR9ZnVuY3Rpb24gcW0odCl7fWZ1bmN0aW9uIEZtKHQpe3Rocm93IG5ldyBFcnJvcigiVW5leHBlY3RlZCB2YWx1ZSBpbiBleGhhdXN0aXZlIGNoZWNrIil9ZnVuY3Rpb24gSm0odCl7fWZ1bmN0aW9uIHZpKHQpe2NvbnN0IG49T2JqZWN0LnZhbHVlcyh0KS5maWx0ZXIobz0+dHlwZW9mIG89PSJudW1iZXIiKTtyZXR1cm4gT2JqZWN0LmVudHJpZXModCkuZmlsdGVyKChbbyxlXSk9Pm4uaW5kZXhPZigrbyk9PT0tMSkubWFwKChbbyxlXSk9PmUpfWZ1bmN0aW9uIF8odCxuPSJ8Iil7cmV0dXJuIHQubWFwKHI9PlMocikpLmpvaW4obil9ZnVuY3Rpb24gUm4odCxuKXtyZXR1cm4gdHlwZW9mIG49PSJiaWdpbnQiP24udG9TdHJpbmcoKTpufWZ1bmN0aW9uIFR0KHQpe3JldHVybntnZXQgdmFsdWUoKXt7Y29uc3Qgbj10KCk7cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJ2YWx1ZSIse3ZhbHVlOm59KSxufX19fWZ1bmN0aW9uIENlKHQpe3JldHVybiB0PT1udWxsfWZ1bmN0aW9uIEJuKHQpe2NvbnN0IG49dC5zdGFydHNXaXRoKCJeIik/MTowLHI9dC5lbmRzV2l0aCgiJCIpP3QubGVuZ3RoLTE6dC5sZW5ndGg7cmV0dXJuIHQuc2xpY2UobixyKX1mdW5jdGlvbiBIcyh0LG4pe2NvbnN0IHI9dC9uLG89TWF0aC5yb3VuZChyKSxlPU51bWJlci5FUFNJTE9OKk1hdGgubWF4KE1hdGguYWJzKHIpLDEpO3JldHVybiBNYXRoLmFicyhyLW8pPGU/MDpyLW99Y29uc3QgZnM9U3ltYm9sKCJldmFsdWF0aW5nIik7ZnVuY3Rpb24gTyh0LG4scil7bGV0IG87T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsbix7Z2V0KCl7aWYobyE9PWZzKXJldHVybiBvPT09dm9pZCAwJiYobz1mcyxvPXIoKSksb30sc2V0KGUpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LG4se3ZhbHVlOmV9KX0sY29uZmlndXJhYmxlOiEwfSl9ZnVuY3Rpb24gSG0odCl7cmV0dXJuIE9iamVjdC5jcmVhdGUoT2JqZWN0LmdldFByb3RvdHlwZU9mKHQpLE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHQpKX1mdW5jdGlvbiBJZSh0LG4scil7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsbix7dmFsdWU6cix3cml0YWJsZTohMCxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pfWZ1bmN0aW9uICRlKC4uLnQpe2NvbnN0IG49e307Zm9yKGNvbnN0IHIgb2YgdCl7Y29uc3Qgbz1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhyKTtPYmplY3QuYXNzaWduKG4sbyl9cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHt9LG4pfWZ1bmN0aW9uIFdtKHQpe3JldHVybiAkZSh0Ll96b2QuZGVmKX1mdW5jdGlvbiBCbSh0LG4pe3JldHVybiBuP24ucmVkdWNlKChyLG8pPT5yPy5bb10sdCk6dH1mdW5jdGlvbiBWbSh0KXtjb25zdCBuPU9iamVjdC5rZXlzKHQpLHI9bi5tYXAobz0+dFtvXSk7cmV0dXJuIFByb21pc2UuYWxsKHIpLnRoZW4obz0+e2NvbnN0IGU9e307Zm9yKGxldCBpPTA7aTxuLmxlbmd0aDtpKyspZVtuW2ldXT1vW2ldO3JldHVybiBlfSl9ZnVuY3Rpb24gS20odD0xMCl7Y29uc3Qgbj0iYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiO2xldCByPSIiO2ZvcihsZXQgbz0wO288dDtvKyspcis9bltNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqbi5sZW5ndGgpXTtyZXR1cm4gcn1mdW5jdGlvbiBzaSh0KXtyZXR1cm4gSlNPTi5zdHJpbmdpZnkodCl9ZnVuY3Rpb24gV3ModCl7cmV0dXJuIHQudG9Mb3dlckNhc2UoKS50cmltKCkucmVwbGFjZSgvW15cd1xzLV0vZywiIikucmVwbGFjZSgvW1xzXy1dKy9nLCItIikucmVwbGFjZSgvXi0rfC0rJC9nLCIiKX1jb25zdCBoaT0iY2FwdHVyZVN0YWNrVHJhY2UiaW4gRXJyb3I/RXJyb3IuY2FwdHVyZVN0YWNrVHJhY2U6KC4uLnQpPT57fTtmdW5jdGlvbiBKZSh0KXtyZXR1cm4gdHlwZW9mIHQ9PSJvYmplY3QiJiZ0IT09bnVsbCYmIUFycmF5LmlzQXJyYXkodCl9Y29uc3QgQnM9VHQoKCk9PntpZih5dC5qaXRsZXNzfHx0eXBlb2YgbmF2aWdhdG9yPCJ1IiYmbmF2aWdhdG9yPy51c2VyQWdlbnQ/LmluY2x1ZGVzKCJDbG91ZGZsYXJlIikpcmV0dXJuITE7dHJ5e2NvbnN0IHQ9RnVuY3Rpb247cmV0dXJuIG5ldyB0KCIiKSwhMH1jYXRjaHtyZXR1cm4hMX19KTtmdW5jdGlvbiBOZSh0KXtpZihKZSh0KT09PSExKXJldHVybiExO2NvbnN0IG49dC5jb25zdHJ1Y3RvcjtpZihuPT09dm9pZCAwfHx0eXBlb2YgbiE9ImZ1bmN0aW9uIilyZXR1cm4hMDtjb25zdCByPW4ucHJvdG90eXBlO3JldHVybiEoSmUocik9PT0hMXx8T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHIsImlzUHJvdG90eXBlT2YiKT09PSExKX1mdW5jdGlvbiBWbih0KXtyZXR1cm4gTmUodCk/ey4uLnR9OkFycmF5LmlzQXJyYXkodCk/Wy4uLnRdOnQgaW5zdGFuY2VvZiBNYXA/bmV3IE1hcCh0KTp0IGluc3RhbmNlb2YgU2V0P25ldyBTZXQodCk6dH1mdW5jdGlvbiBHbSh0KXtsZXQgbj0wO2Zvcihjb25zdCByIGluIHQpT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQscikmJm4rKztyZXR1cm4gbn1jb25zdCBYbT10PT57Y29uc3Qgbj10eXBlb2YgdDtzd2l0Y2gobil7Y2FzZSJ1bmRlZmluZWQiOnJldHVybiJ1bmRlZmluZWQiO2Nhc2Uic3RyaW5nIjpyZXR1cm4ic3RyaW5nIjtjYXNlIm51bWJlciI6cmV0dXJuIE51bWJlci5pc05hTih0KT8ibmFuIjoibnVtYmVyIjtjYXNlImJvb2xlYW4iOnJldHVybiJib29sZWFuIjtjYXNlImZ1bmN0aW9uIjpyZXR1cm4iZnVuY3Rpb24iO2Nhc2UiYmlnaW50IjpyZXR1cm4iYmlnaW50IjtjYXNlInN5bWJvbCI6cmV0dXJuInN5bWJvbCI7Y2FzZSJvYmplY3QiOnJldHVybiBBcnJheS5pc0FycmF5KHQpPyJhcnJheSI6dD09PW51bGw/Im51bGwiOnQudGhlbiYmdHlwZW9mIHQudGhlbj09ImZ1bmN0aW9uIiYmdC5jYXRjaCYmdHlwZW9mIHQuY2F0Y2g9PSJmdW5jdGlvbiI/InByb21pc2UiOnR5cGVvZiBNYXA8InUiJiZ0IGluc3RhbmNlb2YgTWFwPyJtYXAiOnR5cGVvZiBTZXQ8InUiJiZ0IGluc3RhbmNlb2YgU2V0PyJzZXQiOnR5cGVvZiBEYXRlPCJ1IiYmdCBpbnN0YW5jZW9mIERhdGU/ImRhdGUiOnR5cGVvZiBGaWxlPCJ1IiYmdCBpbnN0YW5jZW9mIEZpbGU/ImZpbGUiOiJvYmplY3QiO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGRhdGEgdHlwZTogJHtufWApfX0sQ249bmV3IFNldChbInN0cmluZyIsIm51bWJlciIsInN5bWJvbCJdKSxWcz1uZXcgU2V0KFsic3RyaW5nIiwibnVtYmVyIiwiYmlnaW50IiwiYm9vbGVhbiIsInN5bWJvbCIsInVuZGVmaW5lZCJdKTtmdW5jdGlvbiBiZSh0KXtyZXR1cm4gdC5yZXBsYWNlKC9bLiorP14ke30oKXxbXF1cXF0vZywiXFwkJiIpfWZ1bmN0aW9uIGRlKHQsbixyKXtjb25zdCBvPW5ldyB0Ll96b2QuY29uc3RyKG4/P3QuX3pvZC5kZWYpO3JldHVybighbnx8cj8ucGFyZW50KSYmKG8uX3pvZC5wYXJlbnQ9dCksb31mdW5jdGlvbiBoKHQpe2NvbnN0IG49dDtpZighbilyZXR1cm57fTtpZih0eXBlb2Ygbj09InN0cmluZyIpcmV0dXJue2Vycm9yOigpPT5ufTtpZihuPy5tZXNzYWdlIT09dm9pZCAwKXtpZihuPy5lcnJvciE9PXZvaWQgMCl0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBzcGVjaWZ5IGJvdGggYG1lc3NhZ2VgIGFuZCBgZXJyb3JgIHBhcmFtcyIpO24uZXJyb3I9bi5tZXNzYWdlfXJldHVybiBkZWxldGUgbi5tZXNzYWdlLHR5cGVvZiBuLmVycm9yPT0ic3RyaW5nIj97Li4ubixlcnJvcjooKT0+bi5lcnJvcn06bn1mdW5jdGlvbiBZbSh0KXtsZXQgbjtyZXR1cm4gbmV3IFByb3h5KHt9LHtnZXQocixvLGUpe3JldHVybiBuPz8obj10KCkpLFJlZmxlY3QuZ2V0KG4sbyxlKX0sc2V0KHIsbyxlLGkpe3JldHVybiBuPz8obj10KCkpLFJlZmxlY3Quc2V0KG4sbyxlLGkpfSxoYXMocixvKXtyZXR1cm4gbj8/KG49dCgpKSxSZWZsZWN0LmhhcyhuLG8pfSxkZWxldGVQcm9wZXJ0eShyLG8pe3JldHVybiBuPz8obj10KCkpLFJlZmxlY3QuZGVsZXRlUHJvcGVydHkobixvKX0sb3duS2V5cyhyKXtyZXR1cm4gbj8/KG49dCgpKSxSZWZsZWN0Lm93bktleXMobil9LGdldE93blByb3BlcnR5RGVzY3JpcHRvcihyLG8pe3JldHVybiBuPz8obj10KCkpLFJlZmxlY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG4sbyl9LGRlZmluZVByb3BlcnR5KHIsbyxlKXtyZXR1cm4gbj8/KG49dCgpKSxSZWZsZWN0LmRlZmluZVByb3BlcnR5KG4sbyxlKX19KX1mdW5jdGlvbiBTKHQpe3JldHVybiB0eXBlb2YgdD09ImJpZ2ludCI/dC50b1N0cmluZygpKyJuIjp0eXBlb2YgdD09InN0cmluZyI/YCIke3R9ImA6YCR7dH1gfWZ1bmN0aW9uIEtzKHQpe3JldHVybiBPYmplY3Qua2V5cyh0KS5maWx0ZXIobj0+dFtuXS5fem9kLm9wdGluPT09Im9wdGlvbmFsIiYmdFtuXS5fem9kLm9wdG91dD09PSJvcHRpb25hbCIpfWNvbnN0IEdzPXtzYWZlaW50OltOdW1iZXIuTUlOX1NBRkVfSU5URUdFUixOdW1iZXIuTUFYX1NBRkVfSU5URUdFUl0saW50MzI6Wy0yMTQ3NDgzNjQ4LDIxNDc0ODM2NDddLHVpbnQzMjpbMCw0Mjk0OTY3Mjk1XSxmbG9hdDMyOlstMzQwMjgyMzQ2NjM4NTI4ODZlMjIsMzQwMjgyMzQ2NjM4NTI4ODZlMjJdLGZsb2F0NjQ6Wy1OdW1iZXIuTUFYX1ZBTFVFLE51bWJlci5NQVhfVkFMVUVdfSxYcz17aW50NjQ6W0JpZ0ludCgiLTkyMjMzNzIwMzY4NTQ3NzU4MDgiKSxCaWdJbnQoIjkyMjMzNzIwMzY4NTQ3NzU4MDciKV0sdWludDY0OltCaWdJbnQoMCksQmlnSW50KCIxODQ0Njc0NDA3MzcwOTU1MTYxNSIpXX07ZnVuY3Rpb24gWXModCxuKXtjb25zdCByPXQuX3pvZC5kZWYsbz1yLmNoZWNrcztpZihvJiZvLmxlbmd0aD4wKXRocm93IG5ldyBFcnJvcigiLnBpY2soKSBjYW5ub3QgYmUgdXNlZCBvbiBvYmplY3Qgc2NoZW1hcyBjb250YWluaW5nIHJlZmluZW1lbnRzIik7Y29uc3QgaT0kZSh0Ll96b2QuZGVmLHtnZXQgc2hhcGUoKXtjb25zdCBhPXt9O2Zvcihjb25zdCBzIGluIG4pe2lmKCEocyBpbiByLnNoYXBlKSl0aHJvdyBuZXcgRXJyb3IoYFVucmVjb2duaXplZCBrZXk6ICIke3N9ImApO25bc10mJihhW3NdPXIuc2hhcGVbc10pfXJldHVybiBJZSh0aGlzLCJzaGFwZSIsYSksYX0sY2hlY2tzOltdfSk7cmV0dXJuIGRlKHQsaSl9ZnVuY3Rpb24gUXModCxuKXtjb25zdCByPXQuX3pvZC5kZWYsbz1yLmNoZWNrcztpZihvJiZvLmxlbmd0aD4wKXRocm93IG5ldyBFcnJvcigiLm9taXQoKSBjYW5ub3QgYmUgdXNlZCBvbiBvYmplY3Qgc2NoZW1hcyBjb250YWluaW5nIHJlZmluZW1lbnRzIik7Y29uc3QgaT0kZSh0Ll96b2QuZGVmLHtnZXQgc2hhcGUoKXtjb25zdCBhPXsuLi50Ll96b2QuZGVmLnNoYXBlfTtmb3IoY29uc3QgcyBpbiBuKXtpZighKHMgaW4gci5zaGFwZSkpdGhyb3cgbmV3IEVycm9yKGBVbnJlY29nbml6ZWQga2V5OiAiJHtzfSJgKTtuW3NdJiZkZWxldGUgYVtzXX1yZXR1cm4gSWUodGhpcywic2hhcGUiLGEpLGF9LGNoZWNrczpbXX0pO3JldHVybiBkZSh0LGkpfWZ1bmN0aW9uIGVjKHQsbil7aWYoIU5lKG4pKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBpbnB1dCB0byBleHRlbmQ6IGV4cGVjdGVkIGEgcGxhaW4gb2JqZWN0Iik7Y29uc3Qgcj10Ll96b2QuZGVmLmNoZWNrcztpZihyJiZyLmxlbmd0aD4wKXtjb25zdCBpPXQuX3pvZC5kZWYuc2hhcGU7Zm9yKGNvbnN0IGEgaW4gbilpZihPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGksYSkhPT12b2lkIDApdGhyb3cgbmV3IEVycm9yKCJDYW5ub3Qgb3ZlcndyaXRlIGtleXMgb24gb2JqZWN0IHNjaGVtYXMgY29udGFpbmluZyByZWZpbmVtZW50cy4gVXNlIGAuc2FmZUV4dGVuZCgpYCBpbnN0ZWFkLiIpfWNvbnN0IGU9JGUodC5fem9kLmRlZix7Z2V0IHNoYXBlKCl7Y29uc3QgaT17Li4udC5fem9kLmRlZi5zaGFwZSwuLi5ufTtyZXR1cm4gSWUodGhpcywic2hhcGUiLGkpLGl9fSk7cmV0dXJuIGRlKHQsZSl9ZnVuY3Rpb24gdGModCxuKXtpZighTmUobikpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGlucHV0IHRvIHNhZmVFeHRlbmQ6IGV4cGVjdGVkIGEgcGxhaW4gb2JqZWN0Iik7Y29uc3Qgcj0kZSh0Ll96b2QuZGVmLHtnZXQgc2hhcGUoKXtjb25zdCBvPXsuLi50Ll96b2QuZGVmLnNoYXBlLC4uLm59O3JldHVybiBJZSh0aGlzLCJzaGFwZSIsbyksb319KTtyZXR1cm4gZGUodCxyKX1mdW5jdGlvbiBuYyh0LG4pe2lmKHQuX3pvZC5kZWYuY2hlY2tzPy5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCIubWVyZ2UoKSBjYW5ub3QgYmUgdXNlZCBvbiBvYmplY3Qgc2NoZW1hcyBjb250YWluaW5nIHJlZmluZW1lbnRzLiBVc2UgLnNhZmVFeHRlbmQoKSBpbnN0ZWFkLiIpO2NvbnN0IHI9JGUodC5fem9kLmRlZix7Z2V0IHNoYXBlKCl7Y29uc3Qgbz17Li4udC5fem9kLmRlZi5zaGFwZSwuLi5uLl96b2QuZGVmLnNoYXBlfTtyZXR1cm4gSWUodGhpcywic2hhcGUiLG8pLG99LGdldCBjYXRjaGFsbCgpe3JldHVybiBuLl96b2QuZGVmLmNhdGNoYWxsfSxjaGVja3M6bi5fem9kLmRlZi5jaGVja3M/P1tdfSk7cmV0dXJuIGRlKHQscil9ZnVuY3Rpb24gcmModCxuLHIpe2NvbnN0IGU9bi5fem9kLmRlZi5jaGVja3M7aWYoZSYmZS5sZW5ndGg+MCl0aHJvdyBuZXcgRXJyb3IoIi5wYXJ0aWFsKCkgY2Fubm90IGJlIHVzZWQgb24gb2JqZWN0IHNjaGVtYXMgY29udGFpbmluZyByZWZpbmVtZW50cyIpO2NvbnN0IGE9JGUobi5fem9kLmRlZix7Z2V0IHNoYXBlKCl7Y29uc3Qgcz1uLl96b2QuZGVmLnNoYXBlLGM9ey4uLnN9O2lmKHIpZm9yKGNvbnN0IHUgaW4gcil7aWYoISh1IGluIHMpKXRocm93IG5ldyBFcnJvcihgVW5yZWNvZ25pemVkIGtleTogIiR7dX0iYCk7clt1XSYmKGNbdV09dD9uZXcgdCh7dHlwZToib3B0aW9uYWwiLGlubmVyVHlwZTpzW3VdfSk6c1t1XSl9ZWxzZSBmb3IoY29uc3QgdSBpbiBzKWNbdV09dD9uZXcgdCh7dHlwZToib3B0aW9uYWwiLGlubmVyVHlwZTpzW3VdfSk6c1t1XTtyZXR1cm4gSWUodGhpcywic2hhcGUiLGMpLGN9LGNoZWNrczpbXX0pO3JldHVybiBkZShuLGEpfWZ1bmN0aW9uIGljKHQsbixyKXtjb25zdCBvPSRlKG4uX3pvZC5kZWYse2dldCBzaGFwZSgpe2NvbnN0IGU9bi5fem9kLmRlZi5zaGFwZSxpPXsuLi5lfTtpZihyKWZvcihjb25zdCBhIGluIHIpe2lmKCEoYSBpbiBpKSl0aHJvdyBuZXcgRXJyb3IoYFVucmVjb2duaXplZCBrZXk6ICIke2F9ImApO3JbYV0mJihpW2FdPW5ldyB0KHt0eXBlOiJub25vcHRpb25hbCIsaW5uZXJUeXBlOmVbYV19KSl9ZWxzZSBmb3IoY29uc3QgYSBpbiBlKWlbYV09bmV3IHQoe3R5cGU6Im5vbm9wdGlvbmFsIixpbm5lclR5cGU6ZVthXX0pO3JldHVybiBJZSh0aGlzLCJzaGFwZSIsaSksaX19KTtyZXR1cm4gZGUobixvKX1mdW5jdGlvbiBVZSh0LG49MCl7aWYodC5hYm9ydGVkPT09ITApcmV0dXJuITA7Zm9yKGxldCByPW47cjx0Lmlzc3Vlcy5sZW5ndGg7cisrKWlmKHQuaXNzdWVzW3JdPy5jb250aW51ZSE9PSEwKXJldHVybiEwO3JldHVybiExfWZ1bmN0aW9uIG9jKHQsbj0wKXtpZih0LmFib3J0ZWQ9PT0hMClyZXR1cm4hMDtmb3IobGV0IHI9bjtyPHQuaXNzdWVzLmxlbmd0aDtyKyspaWYodC5pc3N1ZXNbcl0/LmNvbnRpbnVlPT09ITEpcmV0dXJuITA7cmV0dXJuITF9ZnVuY3Rpb24gZmUodCxuKXtyZXR1cm4gbi5tYXAocj0+e3ZhciBvO3JldHVybihvPXIpLnBhdGg/PyhvLnBhdGg9W10pLHIucGF0aC51bnNoaWZ0KHQpLHJ9KX1mdW5jdGlvbiBodCh0KXtyZXR1cm4gdHlwZW9mIHQ9PSJzdHJpbmciP3Q6dD8ubWVzc2FnZX1mdW5jdGlvbiBsZSh0LG4scil7Y29uc3Qgbz10Lm1lc3NhZ2U/dC5tZXNzYWdlOmh0KHQuaW5zdD8uX3pvZC5kZWY/LmVycm9yPy4odCkpPz9odChuPy5lcnJvcj8uKHQpKT8/aHQoci5jdXN0b21FcnJvcj8uKHQpKT8/aHQoci5sb2NhbGVFcnJvcj8uKHQpKT8/IkludmFsaWQgaW5wdXQiLHtpbnN0OmUsY29udGludWU6aSxpbnB1dDphLC4uLnN9PXQ7cmV0dXJuIHMucGF0aD8/KHMucGF0aD1bXSkscy5tZXNzYWdlPW8sbj8ucmVwb3J0SW5wdXQmJihzLmlucHV0PWEpLHN9ZnVuY3Rpb24gS24odCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBTZXQ/InNldCI6dCBpbnN0YW5jZW9mIE1hcD8ibWFwIjp0IGluc3RhbmNlb2YgRmlsZT8iZmlsZSI6InVua25vd24ifWZ1bmN0aW9uIEduKHQpe3JldHVybiBBcnJheS5pc0FycmF5KHQpPyJhcnJheSI6dHlwZW9mIHQ9PSJzdHJpbmciPyJzdHJpbmciOiJ1bmtub3duIn1mdW5jdGlvbiB3KHQpe2NvbnN0IG49dHlwZW9mIHQ7c3dpdGNoKG4pe2Nhc2UibnVtYmVyIjpyZXR1cm4gTnVtYmVyLmlzTmFOKHQpPyJuYW4iOiJudW1iZXIiO2Nhc2Uib2JqZWN0Ijp7aWYodD09PW51bGwpcmV0dXJuIm51bGwiO2lmKEFycmF5LmlzQXJyYXkodCkpcmV0dXJuImFycmF5Ijtjb25zdCByPXQ7aWYociYmT2JqZWN0LmdldFByb3RvdHlwZU9mKHIpIT09T2JqZWN0LnByb3RvdHlwZSYmImNvbnN0cnVjdG9yImluIHImJnIuY29uc3RydWN0b3IpcmV0dXJuIHIuY29uc3RydWN0b3IubmFtZX19cmV0dXJuIG59ZnVuY3Rpb24gSGUoLi4udCl7Y29uc3RbbixyLG9dPXQ7cmV0dXJuIHR5cGVvZiBuPT0ic3RyaW5nIj97bWVzc2FnZTpuLGNvZGU6ImN1c3RvbSIsaW5wdXQ6cixpbnN0Om99OnsuLi5ufX1mdW5jdGlvbiBRbSh0KXtyZXR1cm4gT2JqZWN0LmVudHJpZXModCkuZmlsdGVyKChbbixyXSk9Pk51bWJlci5pc05hTihOdW1iZXIucGFyc2VJbnQobiwxMCkpKS5tYXAobj0+blsxXSl9ZnVuY3Rpb24gYWModCl7Y29uc3Qgbj1hdG9iKHQpLHI9bmV3IFVpbnQ4QXJyYXkobi5sZW5ndGgpO2ZvcihsZXQgbz0wO288bi5sZW5ndGg7bysrKXJbb109bi5jaGFyQ29kZUF0KG8pO3JldHVybiByfWZ1bmN0aW9uIHNjKHQpe2xldCBuPSIiO2ZvcihsZXQgcj0wO3I8dC5sZW5ndGg7cisrKW4rPVN0cmluZy5mcm9tQ2hhckNvZGUodFtyXSk7cmV0dXJuIGJ0b2Eobil9ZnVuY3Rpb24gZXAodCl7Y29uc3Qgbj10LnJlcGxhY2UoLy0vZywiKyIpLnJlcGxhY2UoL18vZywiLyIpLHI9Ij0iLnJlcGVhdCgoNC1uLmxlbmd0aCU0KSU0KTtyZXR1cm4gYWMobityKX1mdW5jdGlvbiB0cCh0KXtyZXR1cm4gc2ModCkucmVwbGFjZSgvXCsvZywiLSIpLnJlcGxhY2UoL1wvL2csIl8iKS5yZXBsYWNlKC89L2csIiIpfWZ1bmN0aW9uIG5wKHQpe2NvbnN0IG49dC5yZXBsYWNlKC9eMHgvLCIiKTtpZihuLmxlbmd0aCUyIT09MCl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgaGV4IHN0cmluZyBsZW5ndGgiKTtjb25zdCByPW5ldyBVaW50OEFycmF5KG4ubGVuZ3RoLzIpO2ZvcihsZXQgbz0wO288bi5sZW5ndGg7bys9MilyW28vMl09TnVtYmVyLnBhcnNlSW50KG4uc2xpY2UobyxvKzIpLDE2KTtyZXR1cm4gcn1mdW5jdGlvbiBycCh0KXtyZXR1cm4gQXJyYXkuZnJvbSh0KS5tYXAobj0+bi50b1N0cmluZygxNikucGFkU3RhcnQoMiwiMCIpKS5qb2luKCIiKX1jbGFzcyBpcHtjb25zdHJ1Y3RvciguLi5uKXt9fWNvbnN0ICRpPU9iamVjdC5mcmVlemUoT2JqZWN0LmRlZmluZVByb3BlcnR5KHtfX3Byb3RvX186bnVsbCxCSUdJTlRfRk9STUFUX1JBTkdFUzpYcyxDbGFzczppcCxOVU1CRVJfRk9STUFUX1JBTkdFUzpHcyxhYm9ydGVkOlVlLGFsbG93c0V2YWw6QnMsYXNzZXJ0OkptLGFzc2VydEVxdWFsOkxtLGFzc2VydElzOnFtLGFzc2VydE5ldmVyOkZtLGFzc2VydE5vdEVxdWFsOk1tLGFzc2lnblByb3A6SWUsYmFzZTY0VG9VaW50OEFycmF5OmFjLGJhc2U2NHVybFRvVWludDhBcnJheTplcCxjYWNoZWQ6VHQsY2FwdHVyZVN0YWNrVHJhY2U6aGksY2xlYW5FbnVtOlFtLGNsZWFuUmVnZXg6Qm4sY2xvbmU6ZGUsY2xvbmVEZWY6V20sY3JlYXRlVHJhbnNwYXJlbnRQcm94eTpZbSxkZWZpbmVMYXp5Ok8sZXNjOnNpLGVzY2FwZVJlZ2V4OmJlLGV4cGxpY2l0bHlBYm9ydGVkOm9jLGV4dGVuZDplYyxmaW5hbGl6ZUlzc3VlOmxlLGZsb2F0U2FmZVJlbWFpbmRlcjpIcyxnZXRFbGVtZW50QXRQYXRoOkJtLGdldEVudW1WYWx1ZXM6dmksZ2V0TGVuZ3RoYWJsZU9yaWdpbjpHbixnZXRQYXJzZWRUeXBlOlhtLGdldFNpemFibGVPcmlnaW46S24saGV4VG9VaW50OEFycmF5Om5wLGlzT2JqZWN0OkplLGlzUGxhaW5PYmplY3Q6TmUsaXNzdWU6SGUsam9pblZhbHVlczpfLGpzb25TdHJpbmdpZnlSZXBsYWNlcjpSbixtZXJnZTpuYyxtZXJnZURlZnM6JGUsbm9ybWFsaXplUGFyYW1zOmgsbnVsbGlzaDpDZSxudW1LZXlzOkdtLG9iamVjdENsb25lOkhtLG9taXQ6UXMsb3B0aW9uYWxLZXlzOktzLHBhcnNlZFR5cGU6dyxwYXJ0aWFsOnJjLHBpY2s6WXMscHJlZml4SXNzdWVzOmZlLHByaW1pdGl2ZVR5cGVzOlZzLHByb21pc2VBbGxPYmplY3Q6Vm0scHJvcGVydHlLZXlUeXBlczpDbixyYW5kb21TdHJpbmc6S20scmVxdWlyZWQ6aWMsc2FmZUV4dGVuZDp0YyxzaGFsbG93Q2xvbmU6Vm4sc2x1Z2lmeTpXcyxzdHJpbmdpZnlQcmltaXRpdmU6Uyx1aW50OEFycmF5VG9CYXNlNjQ6c2MsdWludDhBcnJheVRvQmFzZTY0dXJsOnRwLHVpbnQ4QXJyYXlUb0hleDpycCx1bndyYXBNZXNzYWdlOmh0fSxTeW1ib2wudG9TdHJpbmdUYWcse3ZhbHVlOiJNb2R1bGUifSkpLGNjPSh0LG4pPT57dC5uYW1lPSIkWm9kRXJyb3IiLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfem9kIix7dmFsdWU6dC5fem9kLGVudW1lcmFibGU6ITF9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiaXNzdWVzIix7dmFsdWU6bixlbnVtZXJhYmxlOiExfSksdC5tZXNzYWdlPUpTT04uc3RyaW5naWZ5KG4sUm4sMiksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsInRvU3RyaW5nIix7dmFsdWU6KCk9PnQubWVzc2FnZSxlbnVtZXJhYmxlOiExfSl9LF9pPWQoIiRab2RFcnJvciIsY2MpLG1lPWQoIiRab2RFcnJvciIsY2Mse1BhcmVudDpFcnJvcn0pO2Z1bmN0aW9uIFhuKHQsbj1yPT5yLm1lc3NhZ2Upe2NvbnN0IHI9e30sbz1bXTtmb3IoY29uc3QgZSBvZiB0Lmlzc3VlcyllLnBhdGgubGVuZ3RoPjA/KHJbZS5wYXRoWzBdXT1yW2UucGF0aFswXV18fFtdLHJbZS5wYXRoWzBdXS5wdXNoKG4oZSkpKTpvLnB1c2gobihlKSk7cmV0dXJue2Zvcm1FcnJvcnM6byxmaWVsZEVycm9yczpyfX1mdW5jdGlvbiBZbih0LG49cj0+ci5tZXNzYWdlKXtjb25zdCByPXtfZXJyb3JzOltdfSxvPShlLGk9W10pPT57Zm9yKGNvbnN0IGEgb2YgZS5pc3N1ZXMpaWYoYS5jb2RlPT09ImludmFsaWRfdW5pb24iJiZhLmVycm9ycy5sZW5ndGgpYS5lcnJvcnMubWFwKHM9Pm8oe2lzc3VlczpzfSxbLi4uaSwuLi5hLnBhdGhdKSk7ZWxzZSBpZihhLmNvZGU9PT0iaW52YWxpZF9rZXkiKW8oe2lzc3VlczphLmlzc3Vlc30sWy4uLmksLi4uYS5wYXRoXSk7ZWxzZSBpZihhLmNvZGU9PT0iaW52YWxpZF9lbGVtZW50IilvKHtpc3N1ZXM6YS5pc3N1ZXN9LFsuLi5pLC4uLmEucGF0aF0pO2Vsc2V7Y29uc3Qgcz1bLi4uaSwuLi5hLnBhdGhdO2lmKHMubGVuZ3RoPT09MClyLl9lcnJvcnMucHVzaChuKGEpKTtlbHNle2xldCBjPXIsdT0wO2Zvcig7dTxzLmxlbmd0aDspe2NvbnN0IGw9c1t1XTt1PT09cy5sZW5ndGgtMT8oY1tsXT1jW2xdfHx7X2Vycm9yczpbXX0sY1tsXS5fZXJyb3JzLnB1c2gobihhKSkpOmNbbF09Y1tsXXx8e19lcnJvcnM6W119LGM9Y1tsXSx1Kyt9fX19O3JldHVybiBvKHQpLHJ9ZnVuY3Rpb24gYmkodCxuPXI9PnIubWVzc2FnZSl7Y29uc3Qgcj17ZXJyb3JzOltdfSxvPShlLGk9W10pPT57dmFyIGEscztmb3IoY29uc3QgYyBvZiBlLmlzc3VlcylpZihjLmNvZGU9PT0iaW52YWxpZF91bmlvbiImJmMuZXJyb3JzLmxlbmd0aCljLmVycm9ycy5tYXAodT0+byh7aXNzdWVzOnV9LFsuLi5pLC4uLmMucGF0aF0pKTtlbHNlIGlmKGMuY29kZT09PSJpbnZhbGlkX2tleSIpbyh7aXNzdWVzOmMuaXNzdWVzfSxbLi4uaSwuLi5jLnBhdGhdKTtlbHNlIGlmKGMuY29kZT09PSJpbnZhbGlkX2VsZW1lbnQiKW8oe2lzc3VlczpjLmlzc3Vlc30sWy4uLmksLi4uYy5wYXRoXSk7ZWxzZXtjb25zdCB1PVsuLi5pLC4uLmMucGF0aF07aWYodS5sZW5ndGg9PT0wKXtyLmVycm9ycy5wdXNoKG4oYykpO2NvbnRpbnVlfWxldCBsPXIsZz0wO2Zvcig7Zzx1Lmxlbmd0aDspe2NvbnN0IHY9dVtnXSwkPWc9PT11Lmxlbmd0aC0xO3R5cGVvZiB2PT0ic3RyaW5nIj8obC5wcm9wZXJ0aWVzPz8obC5wcm9wZXJ0aWVzPXt9KSwoYT1sLnByb3BlcnRpZXMpW3ZdPz8oYVt2XT17ZXJyb3JzOltdfSksbD1sLnByb3BlcnRpZXNbdl0pOihsLml0ZW1zPz8obC5pdGVtcz1bXSksKHM9bC5pdGVtcylbdl0/PyhzW3ZdPXtlcnJvcnM6W119KSxsPWwuaXRlbXNbdl0pLCQmJmwuZXJyb3JzLnB1c2gobihjKSksZysrfX19O3JldHVybiBvKHQpLHJ9ZnVuY3Rpb24gdWModCl7Y29uc3Qgbj1bXSxyPXQubWFwKG89PnR5cGVvZiBvPT0ib2JqZWN0Ij9vLmtleTpvKTtmb3IoY29uc3QgbyBvZiByKXR5cGVvZiBvPT0ibnVtYmVyIj9uLnB1c2goYFske299XWApOnR5cGVvZiBvPT0ic3ltYm9sIj9uLnB1c2goYFske0pTT04uc3RyaW5naWZ5KFN0cmluZyhvKSl9XWApOi9bXlx3JF0vLnRlc3Qobyk/bi5wdXNoKGBbJHtKU09OLnN0cmluZ2lmeShvKX1dYCk6KG4ubGVuZ3RoJiZuLnB1c2goIi4iKSxuLnB1c2gobykpO3JldHVybiBuLmpvaW4oIiIpfWZ1bmN0aW9uIHlpKHQpe2NvbnN0IG49W10scj1bLi4udC5pc3N1ZXNdLnNvcnQoKG8sZSk9PihvLnBhdGg/P1tdKS5sZW5ndGgtKGUucGF0aD8/W10pLmxlbmd0aCk7Zm9yKGNvbnN0IG8gb2YgciluLnB1c2goYOKcliAke28ubWVzc2FnZX1gKSxvLnBhdGg/Lmxlbmd0aCYmbi5wdXNoKGAgIOKGkiBhdCAke3VjKG8ucGF0aCl9YCk7cmV0dXJuIG4uam9pbihgCmApfWNvbnN0IGp0PXQ9PihuLHIsbyxlKT0+e2NvbnN0IGk9bz97Li4ubyxhc3luYzohMX06e2FzeW5jOiExfSxhPW4uX3pvZC5ydW4oe3ZhbHVlOnIsaXNzdWVzOltdfSxpKTtpZihhIGluc3RhbmNlb2YgUHJvbWlzZSl0aHJvdyBuZXcgUGU7aWYoYS5pc3N1ZXMubGVuZ3RoKXtjb25zdCBzPW5ldyhlPy5FcnI/P3QpKGEuaXNzdWVzLm1hcChjPT5sZShjLGksVigpKSkpO3Rocm93IGhpKHMsZT8uY2FsbGVlKSxzfXJldHVybiBhLnZhbHVlfSxjaT1qdChtZSksT3Q9dD0+YXN5bmMobixyLG8sZSk9Pntjb25zdCBpPW8/ey4uLm8sYXN5bmM6ITB9Onthc3luYzohMH07bGV0IGE9bi5fem9kLnJ1bih7dmFsdWU6cixpc3N1ZXM6W119LGkpO2lmKGEgaW5zdGFuY2VvZiBQcm9taXNlJiYoYT1hd2FpdCBhKSxhLmlzc3Vlcy5sZW5ndGgpe2NvbnN0IHM9bmV3KGU/LkVycj8/dCkoYS5pc3N1ZXMubWFwKGM9PmxlKGMsaSxWKCkpKSk7dGhyb3cgaGkocyxlPy5jYWxsZWUpLHN9cmV0dXJuIGEudmFsdWV9LHVpPU90KG1lKSxVdD10PT4obixyLG8pPT57Y29uc3QgZT1vP3suLi5vLGFzeW5jOiExfTp7YXN5bmM6ITF9LGk9bi5fem9kLnJ1bih7dmFsdWU6cixpc3N1ZXM6W119LGUpO2lmKGkgaW5zdGFuY2VvZiBQcm9taXNlKXRocm93IG5ldyBQZTtyZXR1cm4gaS5pc3N1ZXMubGVuZ3RoP3tzdWNjZXNzOiExLGVycm9yOm5ldyh0Pz9faSkoaS5pc3N1ZXMubWFwKGE9PmxlKGEsZSxWKCkpKSl9OntzdWNjZXNzOiEwLGRhdGE6aS52YWx1ZX19LGtpPVV0KG1lKSxQdD10PT5hc3luYyhuLHIsbyk9Pntjb25zdCBlPW8/ey4uLm8sYXN5bmM6ITB9Onthc3luYzohMH07bGV0IGk9bi5fem9kLnJ1bih7dmFsdWU6cixpc3N1ZXM6W119LGUpO3JldHVybiBpIGluc3RhbmNlb2YgUHJvbWlzZSYmKGk9YXdhaXQgaSksaS5pc3N1ZXMubGVuZ3RoP3tzdWNjZXNzOiExLGVycm9yOm5ldyB0KGkuaXNzdWVzLm1hcChhPT5sZShhLGUsVigpKSkpfTp7c3VjY2VzczohMCxkYXRhOmkudmFsdWV9fSxsYz1QdChtZSksU2k9dD0+KG4scixvKT0+e2NvbnN0IGU9bz97Li4ubyxkaXJlY3Rpb246ImJhY2t3YXJkIn06e2RpcmVjdGlvbjoiYmFja3dhcmQifTtyZXR1cm4ganQodCkobixyLGUpfSxvcD1TaShtZSksd2k9dD0+KG4scixvKT0+anQodCkobixyLG8pLGFwPXdpKG1lKSxJaT10PT5hc3luYyhuLHIsbyk9Pntjb25zdCBlPW8/ey4uLm8sZGlyZWN0aW9uOiJiYWNrd2FyZCJ9OntkaXJlY3Rpb246ImJhY2t3YXJkIn07cmV0dXJuIE90KHQpKG4scixlKX0sc3A9SWkobWUpLHppPXQ9PmFzeW5jKG4scixvKT0+T3QodCkobixyLG8pLGNwPXppKG1lKSx4aT10PT4obixyLG8pPT57Y29uc3QgZT1vP3suLi5vLGRpcmVjdGlvbjoiYmFja3dhcmQifTp7ZGlyZWN0aW9uOiJiYWNrd2FyZCJ9O3JldHVybiBVdCh0KShuLHIsZSl9LHVwPXhpKG1lKSxUaT10PT4obixyLG8pPT5VdCh0KShuLHIsbyksbHA9VGkobWUpLGppPXQ9PmFzeW5jKG4scixvKT0+e2NvbnN0IGU9bz97Li4ubyxkaXJlY3Rpb246ImJhY2t3YXJkIn06e2RpcmVjdGlvbjoiYmFja3dhcmQifTtyZXR1cm4gUHQodCkobixyLGUpfSxkcD1qaShtZSksT2k9dD0+YXN5bmMobixyLG8pPT5QdCh0KShuLHIsbyksbXA9T2kobWUpLGRjPS9eW2NDXVswLTlhLXpdezYsfSQvLG1jPS9eWzAtOWEtel0rJC8scGM9L15bMC05QS1ISktNTlAtVFYtWmEtaGprbW5wLXR2LXpdezI2fSQvLGZjPS9eWzAtOWEtdkEtVl17MjB9JC8sZ2M9L15bQS1aYS16MC05XXsyN30kLyx2Yz0vXlthLXpBLVowLTlfLV17MjF9JC8saGM9L15QKD86KFxkK1cpfCg/IS4qVykoPz1cZHxUXGQpKFxkK1kpPyhcZCtNKT8oXGQrRCk/KFQoPz1cZCkoXGQrSCk/KFxkK00pPyhcZCsoWy4sXVxkKyk/Uyk/KT8pJC8scHA9L15bLStdP1AoPyEkKSg/Oig/OlstK10/XGQrWSl8KD86Wy0rXT9cZCtbLixdXGQrWSQpKT8oPzooPzpbLStdP1xkK00pfCg/OlstK10/XGQrWy4sXVxkK00kKSk/KD86KD86Wy0rXT9cZCtXKXwoPzpbLStdP1xkK1suLF1cZCtXJCkpPyg/Oig/OlstK10/XGQrRCl8KD86Wy0rXT9cZCtbLixdXGQrRCQpKT8oPzpUKD89W1xkKy1dKSg/Oig/OlstK10/XGQrSCl8KD86Wy0rXT9cZCtbLixdXGQrSCQpKT8oPzooPzpbLStdP1xkK00pfCg/OlstK10/XGQrWy4sXVxkK00kKSk/KD86Wy0rXT9cZCsoPzpbLixdXGQrKT9TKT8pPz8kLywkYz0vXihbMC05YS1mQS1GXXs4fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXsxMn0pJC8sV2U9dD0+dD9uZXcgUmVnRXhwKGBeKFswLTlhLWZBLUZdezh9LVswLTlhLWZBLUZdezR9LSR7dH1bMC05YS1mQS1GXXszfS1bODlhYkFCXVswLTlhLWZBLUZdezN9LVswLTlhLWZBLUZdezEyfSkkYCk6L14oWzAtOWEtZkEtRl17OH0tWzAtOWEtZkEtRl17NH0tWzEtOF1bMC05YS1mQS1GXXszfS1bODlhYkFCXVswLTlhLWZBLUZdezN9LVswLTlhLWZBLUZdezEyfXwwMDAwMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAwMDAwMDAwMDB8ZmZmZmZmZmYtZmZmZi1mZmZmLWZmZmYtZmZmZmZmZmZmZmZmKSQvLGZwPVdlKDQpLGdwPVdlKDYpLHZwPVdlKDcpLF9jPS9eKD8hXC4pKD8hLipcLlwuKShbQS1aYS16MC05XycrXC1cLl0qKVtBLVphLXowLTlfKy1dQChbQS1aYS16MC05XVtBLVphLXowLTlcLV0qXC4pK1tBLVphLXpdezIsfSQvLGhwPS9eW2EtekEtWjAtOS4hIyQlJicqKy89P15fYHt8fX4tXStAW2EtekEtWjAtOV0oPzpbYS16QS1aMC05LV17MCw2MX1bYS16QS1aMC05XSk/KD86XC5bYS16QS1aMC05XSg/OlthLXpBLVowLTktXXswLDYxfVthLXpBLVowLTldKT8pKiQvLCRwPS9eKChbXjw+KClcW1xdXFwuLDs6XHNAIl0rKFwuW148PigpXFtcXVxcLiw7OlxzQCJdKykqKXwoIi4rIikpQCgoXFtbMC05XXsxLDN9XC5bMC05XXsxLDN9XC5bMC05XXsxLDN9XC5bMC05XXsxLDN9XSl8KChbYS16QS1aXC0wLTldK1wuKStbYS16QS1aXXsyLH0pKSQvLGJjPS9eW15cc0AiXXsxLDY0fUBbXlxzQF17MSwyNTV9JC91LF9wPWJjLGJwPS9eW2EtekEtWjAtOS4hIyQlJicqKy89P15fYHt8fX4tXStAW2EtekEtWjAtOV0oPzpbYS16QS1aMC05LV17MCw2MX1bYS16QS1aMC05XSk/KD86XC5bYS16QS1aMC05XSg/OlthLXpBLVowLTktXXswLDYxfVthLXpBLVowLTldKT8pKiQvLHlwPSJeKFxccHtFeHRlbmRlZF9QaWN0b2dyYXBoaWN9fFxccHtFbW9qaV9Db21wb25lbnR9KSskIjtmdW5jdGlvbiB5Yygpe3JldHVybiBuZXcgUmVnRXhwKHlwLCJ1Iil9Y29uc3Qga2M9L14oPzooPzoyNVswLTVdfDJbMC00XVswLTldfDFbMC05XVswLTldfFsxLTldWzAtOV18WzAtOV0pXC4pezN9KD86MjVbMC01XXwyWzAtNF1bMC05XXwxWzAtOV1bMC05XXxbMS05XVswLTldfFswLTldKSQvLFNjPS9eKChbMC05YS1mQS1GXXsxLDR9Oil7N31bMC05YS1mQS1GXXsxLDR9fChbMC05YS1mQS1GXXsxLDR9Oil7MSw3fTp8KFswLTlhLWZBLUZdezEsNH06KXsxLDZ9OlswLTlhLWZBLUZdezEsNH18KFswLTlhLWZBLUZdezEsNH06KXsxLDV9KDpbMC05YS1mQS1GXXsxLDR9KXsxLDJ9fChbMC05YS1mQS1GXXsxLDR9Oil7MSw0fSg6WzAtOWEtZkEtRl17MSw0fSl7MSwzfXwoWzAtOWEtZkEtRl17MSw0fTopezEsM30oOlswLTlhLWZBLUZdezEsNH0pezEsNH18KFswLTlhLWZBLUZdezEsNH06KXsxLDJ9KDpbMC05YS1mQS1GXXsxLDR9KXsxLDV9fFswLTlhLWZBLUZdezEsNH06KCg6WzAtOWEtZkEtRl17MSw0fSl7MSw2fSl8OigoOlswLTlhLWZBLUZdezEsNH0pezEsN318OikpJC8sd2M9dD0+e2NvbnN0IG49YmUodD8/IjoiKTtyZXR1cm4gbmV3IFJlZ0V4cChgXig/OlswLTlBLUZdezJ9JHtufSl7NX1bMC05QS1GXXsyfSR8Xig/OlswLTlhLWZdezJ9JHtufSl7NX1bMC05YS1mXXsyfSRgKX0sSWM9L14oKDI1WzAtNV18MlswLTRdWzAtOV18MVswLTldWzAtOV18WzEtOV1bMC05XXxbMC05XSlcLil7M30oMjVbMC01XXwyWzAtNF1bMC05XXwxWzAtOV1bMC05XXxbMS05XVswLTldfFswLTldKVwvKFswLTldfFsxLTJdWzAtOV18M1swLTJdKSQvLHpjPS9eKChbMC05YS1mQS1GXXsxLDR9Oil7N31bMC05YS1mQS1GXXsxLDR9fDo6fChbMC05YS1mQS1GXXsxLDR9KT86OihbMC05YS1mQS1GXXsxLDR9Oj8pezAsNn0pXC8oMTJbMC04XXwxWzAxXVswLTldfFsxLTldP1swLTldKSQvLHhjPS9eJHxeKD86WzAtOWEtekEtWisvXXs0fSkqKD86KD86WzAtOWEtekEtWisvXXsyfT09KXwoPzpbMC05YS16QS1aKy9dezN9PSkpPyQvLFVpPS9eW0EtWmEtejAtOV8tXSokLyxUYz0vXig/PS57MSwyNTN9XC4/JClbYS16QS1aMC05XSg/OlthLXpBLVowLTktXXswLDYxfVthLXpBLVowLTldKT8oPzpcLlthLXpBLVowLTldKD86Wy0wLTlhLXpBLVpdezAsNjF9WzAtOWEtekEtWl0pPykqXC4/JC8samM9L14oW2EtekEtWjAtOV0oPzpbYS16QS1aMC05LV17MCw2MX1bYS16QS1aMC05XSk/XC4pK1thLXpBLVpdezIsfSQvLFBpPS9eaHR0cHM/JC8sT2M9L15cK1sxLTldXGR7NiwxNH0kLyxVYz0iKD86KD86XFxkXFxkWzI0NjhdWzA0OF18XFxkXFxkWzEzNTc5XVsyNl18XFxkXFxkMFs0OF18WzAyNDY4XVswNDhdMDB8WzEzNTc5XVsyNl0wMCktMDItMjl8XFxkezR9LSg/Oig/OjBbMTM1NzhdfDFbMDJdKS0oPzowWzEtOV18WzEyXVxcZHwzWzAxXSl8KD86MFs0NjldfDExKS0oPzowWzEtOV18WzEyXVxcZHwzMCl8KD86MDIpLSg/OjBbMS05XXwxXFxkfDJbMC04XSkpKSIsUGM9bmV3IFJlZ0V4cChgXiR7VWN9JGApO2Z1bmN0aW9uIE5jKHQpe2NvbnN0IG49Iig/OlswMV1cXGR8MlswLTNdKTpbMC01XVxcZCI7cmV0dXJuIHR5cGVvZiB0LnByZWNpc2lvbj09Im51bWJlciI/dC5wcmVjaXNpb249PT0tMT9gJHtufWA6dC5wcmVjaXNpb249PT0wP2Ake259OlswLTVdXFxkYDpgJHtufTpbMC01XVxcZFxcLlxcZHske3QucHJlY2lzaW9ufX1gOmAke259KD86OlswLTVdXFxkKD86XFwuXFxkKyk/KT9gfWZ1bmN0aW9uIERjKHQpe3JldHVybiBuZXcgUmVnRXhwKGBeJHtOYyh0KX0kYCl9ZnVuY3Rpb24gRWModCl7Y29uc3Qgbj1OYyh7cHJlY2lzaW9uOnQucHJlY2lzaW9ufSkscj1bIloiXTt0LmxvY2FsJiZyLnB1c2goIiIpLHQub2Zmc2V0JiZyLnB1c2goIihbKy1dKD86WzAxXVxcZHwyWzAtM10pOlswLTVdXFxkKSIpO2NvbnN0IG89YCR7bn0oPzoke3Iuam9pbigifCIpfSlgO3JldHVybiBuZXcgUmVnRXhwKGBeJHtVY31UKD86JHtvfSkkYCl9Y29uc3QgWmM9dD0+e2NvbnN0IG49dD9gW1xcc1xcU117JHt0Py5taW5pbXVtPz8wfSwke3Q/Lm1heGltdW0/PyIifX1gOiJbXFxzXFxTXSoiO3JldHVybiBuZXcgUmVnRXhwKGBeJHtufSRgKX0sUmM9L14tP1xkK24/JC8sQ2M9L14tP1xkKyQvLE5pPS9eLT9cZCsoPzpcLlxkKyk/JC8sQWM9L14oPzp0cnVlfGZhbHNlKSQvaSxMYz0vXm51bGwkL2ksTWM9L151bmRlZmluZWQkL2kscWM9L15bXkEtWl0qJC8sRmM9L15bXmEtel0qJC8sSmM9L15bMC05YS1mQS1GXSokLztmdW5jdGlvbiBOdCh0LG4pe3JldHVybiBuZXcgUmVnRXhwKGBeW0EtWmEtejAtOSsvXXske3R9fSR7bn0kYCl9ZnVuY3Rpb24gRHQodCl7cmV0dXJuIG5ldyBSZWdFeHAoYF5bQS1aYS16MC05Xy1deyR7dH19JGApfWNvbnN0IGtwPS9eWzAtOWEtZkEtRl17MzJ9JC8sU3A9TnQoMjIsIj09Iiksd3A9RHQoMjIpLElwPS9eWzAtOWEtZkEtRl17NDB9JC8senA9TnQoMjcsIj0iKSx4cD1EdCgyNyksVHA9L15bMC05YS1mQS1GXXs2NH0kLyxqcD1OdCg0MywiPSIpLE9wPUR0KDQzKSxVcD0vXlswLTlhLWZBLUZdezk2fSQvLFBwPU50KDY0LCIiKSxOcD1EdCg2NCksRHA9L15bMC05YS1mQS1GXXsxMjh9JC8sRXA9TnQoODYsIj09IiksWnA9RHQoODYpLFFuPU9iamVjdC5mcmVlemUoT2JqZWN0LmRlZmluZVByb3BlcnR5KHtfX3Byb3RvX186bnVsbCxiYXNlNjQ6eGMsYmFzZTY0dXJsOlVpLGJpZ2ludDpSYyxib29sZWFuOkFjLGJyb3dzZXJFbWFpbDpicCxjaWRydjQ6SWMsY2lkcnY2OnpjLGN1aWQ6ZGMsY3VpZDI6bWMsZGF0ZTpQYyxkYXRldGltZTpFYyxkb21haW46amMsZHVyYXRpb246aGMsZTE2NDpPYyxlbWFpbDpfYyxlbW9qaTp5YyxleHRlbmRlZER1cmF0aW9uOnBwLGd1aWQ6JGMsaGV4OkpjLGhvc3RuYW1lOlRjLGh0bWw1RW1haWw6aHAsaHR0cFByb3RvY29sOlBpLGlkbkVtYWlsOl9wLGludGVnZXI6Q2MsaXB2NDprYyxpcHY2OlNjLGtzdWlkOmdjLGxvd2VyY2FzZTpxYyxtYWM6d2MsbWQ1X2Jhc2U2NDpTcCxtZDVfYmFzZTY0dXJsOndwLG1kNV9oZXg6a3AsbmFub2lkOnZjLG51bGw6TGMsbnVtYmVyOk5pLHJmYzUzMjJFbWFpbDokcCxzaGExX2Jhc2U2NDp6cCxzaGExX2Jhc2U2NHVybDp4cCxzaGExX2hleDpJcCxzaGEyNTZfYmFzZTY0OmpwLHNoYTI1Nl9iYXNlNjR1cmw6T3Asc2hhMjU2X2hleDpUcCxzaGEzODRfYmFzZTY0OlBwLHNoYTM4NF9iYXNlNjR1cmw6TnAsc2hhMzg0X2hleDpVcCxzaGE1MTJfYmFzZTY0OkVwLHNoYTUxMl9iYXNlNjR1cmw6WnAsc2hhNTEyX2hleDpEcCxzdHJpbmc6WmMsdGltZTpEYyx1bGlkOnBjLHVuZGVmaW5lZDpNYyx1bmljb2RlRW1haWw6YmMsdXBwZXJjYXNlOkZjLHV1aWQ6V2UsdXVpZDQ6ZnAsdXVpZDY6Z3AsdXVpZDc6dnAseGlkOmZjfSxTeW1ib2wudG9TdHJpbmdUYWcse3ZhbHVlOiJNb2R1bGUifSkpLEo9ZCgiJFpvZENoZWNrIiwodCxuKT0+e3ZhciByO3QuX3pvZD8/KHQuX3pvZD17fSksdC5fem9kLmRlZj1uLChyPXQuX3pvZCkub25hdHRhY2g/PyhyLm9uYXR0YWNoPVtdKX0pLEhjPXtudW1iZXI6Im51bWJlciIsYmlnaW50OiJiaWdpbnQiLG9iamVjdDoiZGF0ZSJ9LERpPWQoIiRab2RDaGVja0xlc3NUaGFuIiwodCxuKT0+e0ouaW5pdCh0LG4pO2NvbnN0IHI9SGNbdHlwZW9mIG4udmFsdWVdO3QuX3pvZC5vbmF0dGFjaC5wdXNoKG89Pntjb25zdCBlPW8uX3pvZC5iYWcsaT0obi5pbmNsdXNpdmU/ZS5tYXhpbXVtOmUuZXhjbHVzaXZlTWF4aW11bSk/P051bWJlci5QT1NJVElWRV9JTkZJTklUWTtuLnZhbHVlPGkmJihuLmluY2x1c2l2ZT9lLm1heGltdW09bi52YWx1ZTplLmV4Y2x1c2l2ZU1heGltdW09bi52YWx1ZSl9KSx0Ll96b2QuY2hlY2s9bz0+eyhuLmluY2x1c2l2ZT9vLnZhbHVlPD1uLnZhbHVlOm8udmFsdWU8bi52YWx1ZSl8fG8uaXNzdWVzLnB1c2goe29yaWdpbjpyLGNvZGU6InRvb19iaWciLG1heGltdW06dHlwZW9mIG4udmFsdWU9PSJvYmplY3QiP24udmFsdWUuZ2V0VGltZSgpOm4udmFsdWUsaW5wdXQ6by52YWx1ZSxpbmNsdXNpdmU6bi5pbmNsdXNpdmUsaW5zdDp0LGNvbnRpbnVlOiFuLmFib3J0fSl9fSksRWk9ZCgiJFpvZENoZWNrR3JlYXRlclRoYW4iLCh0LG4pPT57Si5pbml0KHQsbik7Y29uc3Qgcj1IY1t0eXBlb2Ygbi52YWx1ZV07dC5fem9kLm9uYXR0YWNoLnB1c2gobz0+e2NvbnN0IGU9by5fem9kLmJhZyxpPShuLmluY2x1c2l2ZT9lLm1pbmltdW06ZS5leGNsdXNpdmVNaW5pbXVtKT8/TnVtYmVyLk5FR0FUSVZFX0lORklOSVRZO24udmFsdWU+aSYmKG4uaW5jbHVzaXZlP2UubWluaW11bT1uLnZhbHVlOmUuZXhjbHVzaXZlTWluaW11bT1uLnZhbHVlKX0pLHQuX3pvZC5jaGVjaz1vPT57KG4uaW5jbHVzaXZlP28udmFsdWU+PW4udmFsdWU6by52YWx1ZT5uLnZhbHVlKXx8by5pc3N1ZXMucHVzaCh7b3JpZ2luOnIsY29kZToidG9vX3NtYWxsIixtaW5pbXVtOnR5cGVvZiBuLnZhbHVlPT0ib2JqZWN0Ij9uLnZhbHVlLmdldFRpbWUoKTpuLnZhbHVlLGlucHV0Om8udmFsdWUsaW5jbHVzaXZlOm4uaW5jbHVzaXZlLGluc3Q6dCxjb250aW51ZTohbi5hYm9ydH0pfX0pLFdjPWQoIiRab2RDaGVja011bHRpcGxlT2YiLCh0LG4pPT57Si5pbml0KHQsbiksdC5fem9kLm9uYXR0YWNoLnB1c2gocj0+e3ZhciBvOyhvPXIuX3pvZC5iYWcpLm11bHRpcGxlT2Y/PyhvLm11bHRpcGxlT2Y9bi52YWx1ZSl9KSx0Ll96b2QuY2hlY2s9cj0+e2lmKHR5cGVvZiByLnZhbHVlIT10eXBlb2Ygbi52YWx1ZSl0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBtaXggbnVtYmVyIGFuZCBiaWdpbnQgaW4gbXVsdGlwbGVfb2YgY2hlY2suIik7KHR5cGVvZiByLnZhbHVlPT0iYmlnaW50Ij9yLnZhbHVlJW4udmFsdWU9PT1CaWdJbnQoMCk6SHMoci52YWx1ZSxuLnZhbHVlKT09PTApfHxyLmlzc3Vlcy5wdXNoKHtvcmlnaW46dHlwZW9mIHIudmFsdWUsY29kZToibm90X211bHRpcGxlX29mIixkaXZpc29yOm4udmFsdWUsaW5wdXQ6ci52YWx1ZSxpbnN0OnQsY29udGludWU6IW4uYWJvcnR9KX19KSxCYz1kKCIkWm9kQ2hlY2tOdW1iZXJGb3JtYXQiLCh0LG4pPT57Si5pbml0KHQsbiksbi5mb3JtYXQ9bi5mb3JtYXR8fCJmbG9hdDY0Ijtjb25zdCByPW4uZm9ybWF0Py5pbmNsdWRlcygiaW50Iiksbz1yPyJpbnQiOiJudW1iZXIiLFtlLGldPUdzW24uZm9ybWF0XTt0Ll96b2Qub25hdHRhY2gucHVzaChhPT57Y29uc3Qgcz1hLl96b2QuYmFnO3MuZm9ybWF0PW4uZm9ybWF0LHMubWluaW11bT1lLHMubWF4aW11bT1pLHImJihzLnBhdHRlcm49Q2MpfSksdC5fem9kLmNoZWNrPWE9Pntjb25zdCBzPWEudmFsdWU7aWYocil7aWYoIU51bWJlci5pc0ludGVnZXIocykpe2EuaXNzdWVzLnB1c2goe2V4cGVjdGVkOm8sZm9ybWF0Om4uZm9ybWF0LGNvZGU6ImludmFsaWRfdHlwZSIsY29udGludWU6ITEsaW5wdXQ6cyxpbnN0OnR9KTtyZXR1cm59aWYoIU51bWJlci5pc1NhZmVJbnRlZ2VyKHMpKXtzPjA/YS5pc3N1ZXMucHVzaCh7aW5wdXQ6cyxjb2RlOiJ0b29fYmlnIixtYXhpbXVtOk51bWJlci5NQVhfU0FGRV9JTlRFR0VSLG5vdGU6IkludGVnZXJzIG11c3QgYmUgd2l0aGluIHRoZSBzYWZlIGludGVnZXIgcmFuZ2UuIixpbnN0OnQsb3JpZ2luOm8saW5jbHVzaXZlOiEwLGNvbnRpbnVlOiFuLmFib3J0fSk6YS5pc3N1ZXMucHVzaCh7aW5wdXQ6cyxjb2RlOiJ0b29fc21hbGwiLG1pbmltdW06TnVtYmVyLk1JTl9TQUZFX0lOVEVHRVIsbm90ZToiSW50ZWdlcnMgbXVzdCBiZSB3aXRoaW4gdGhlIHNhZmUgaW50ZWdlciByYW5nZS4iLGluc3Q6dCxvcmlnaW46byxpbmNsdXNpdmU6ITAsY29udGludWU6IW4uYWJvcnR9KTtyZXR1cm59fXM8ZSYmYS5pc3N1ZXMucHVzaCh7b3JpZ2luOiJudW1iZXIiLGlucHV0OnMsY29kZToidG9vX3NtYWxsIixtaW5pbXVtOmUsaW5jbHVzaXZlOiEwLGluc3Q6dCxjb250aW51ZTohbi5hYm9ydH0pLHM+aSYmYS5pc3N1ZXMucHVzaCh7b3JpZ2luOiJudW1iZXIiLGlucHV0OnMsY29kZToidG9vX2JpZyIsbWF4aW11bTppLGluY2x1c2l2ZTohMCxpbnN0OnQsY29udGludWU6IW4uYWJvcnR9KX19KSxWYz1kKCIkWm9kQ2hlY2tCaWdJbnRGb3JtYXQiLCh0LG4pPT57Si5pbml0KHQsbik7Y29uc3RbcixvXT1Yc1tuLmZvcm1hdF07dC5fem9kLm9uYXR0YWNoLnB1c2goZT0+e2NvbnN0IGk9ZS5fem9kLmJhZztpLmZvcm1hdD1uLmZvcm1hdCxpLm1pbmltdW09cixpLm1heGltdW09b30pLHQuX3pvZC5jaGVjaz1lPT57Y29uc3QgaT1lLnZhbHVlO2k8ciYmZS5pc3N1ZXMucHVzaCh7b3JpZ2luOiJiaWdpbnQiLGlucHV0OmksY29kZToidG9vX3NtYWxsIixtaW5pbXVtOnIsaW5jbHVzaXZlOiEwLGluc3Q6dCxjb250aW51ZTohbi5hYm9ydH0pLGk+byYmZS5pc3N1ZXMucHVzaCh7b3JpZ2luOiJiaWdpbnQiLGlucHV0OmksY29kZToidG9vX2JpZyIsbWF4aW11bTpvLGluY2x1c2l2ZTohMCxpbnN0OnQsY29udGludWU6IW4uYWJvcnR9KX19KSxLYz1kKCIkWm9kQ2hlY2tNYXhTaXplIiwodCxuKT0+e3ZhciByO0ouaW5pdCh0LG4pLChyPXQuX3pvZC5kZWYpLndoZW4/PyhyLndoZW49bz0+e2NvbnN0IGU9by52YWx1ZTtyZXR1cm4hQ2UoZSkmJmUuc2l6ZSE9PXZvaWQgMH0pLHQuX3pvZC5vbmF0dGFjaC5wdXNoKG89Pntjb25zdCBlPW8uX3pvZC5iYWcubWF4aW11bT8/TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZO24ubWF4aW11bTxlJiYoby5fem9kLmJhZy5tYXhpbXVtPW4ubWF4aW11bSl9KSx0Ll96b2QuY2hlY2s9bz0+e2NvbnN0IGU9by52YWx1ZTtlLnNpemU8PW4ubWF4aW11bXx8by5pc3N1ZXMucHVzaCh7b3JpZ2luOktuKGUpLGNvZGU6InRvb19iaWciLG1heGltdW06bi5tYXhpbXVtLGluY2x1c2l2ZTohMCxpbnB1dDplLGluc3Q6dCxjb250aW51ZTohbi5hYm9ydH0pfX0pLEdjPWQoIiRab2RDaGVja01pblNpemUiLCh0LG4pPT57dmFyIHI7Si5pbml0KHQsbiksKHI9dC5fem9kLmRlZikud2hlbj8/KHIud2hlbj1vPT57Y29uc3QgZT1vLnZhbHVlO3JldHVybiFDZShlKSYmZS5zaXplIT09dm9pZCAwfSksdC5fem9kLm9uYXR0YWNoLnB1c2gobz0+e2NvbnN0IGU9by5fem9kLmJhZy5taW5pbXVtPz9OdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFk7bi5taW5pbXVtPmUmJihvLl96b2QuYmFnLm1pbmltdW09bi5taW5pbXVtKX0pLHQuX3pvZC5jaGVjaz1vPT57Y29uc3QgZT1vLnZhbHVlO2Uuc2l6ZT49bi5taW5pbXVtfHxvLmlzc3Vlcy5wdXNoKHtvcmlnaW46S24oZSksY29kZToidG9vX3NtYWxsIixtaW5pbXVtOm4ubWluaW11bSxpbmNsdXNpdmU6ITAsaW5wdXQ6ZSxpbnN0OnQsY29udGludWU6IW4uYWJvcnR9KX19KSxYYz1kKCIkWm9kQ2hlY2tTaXplRXF1YWxzIiwodCxuKT0+e3ZhciByO0ouaW5pdCh0LG4pLChyPXQuX3pvZC5kZWYpLndoZW4/PyhyLndoZW49bz0+e2NvbnN0IGU9by52YWx1ZTtyZXR1cm4hQ2UoZSkmJmUuc2l6ZSE9PXZvaWQgMH0pLHQuX3pvZC5vbmF0dGFjaC5wdXNoKG89Pntjb25zdCBlPW8uX3pvZC5iYWc7ZS5taW5pbXVtPW4uc2l6ZSxlLm1heGltdW09bi5zaXplLGUuc2l6ZT1uLnNpemV9KSx0Ll96b2QuY2hlY2s9bz0+e2NvbnN0IGU9by52YWx1ZSxpPWUuc2l6ZTtpZihpPT09bi5zaXplKXJldHVybjtjb25zdCBhPWk+bi5zaXplO28uaXNzdWVzLnB1c2goe29yaWdpbjpLbihlKSwuLi5hP3tjb2RlOiJ0b29fYmlnIixtYXhpbXVtOm4uc2l6ZX06e2NvZGU6InRvb19zbWFsbCIsbWluaW11bTpuLnNpemV9LGluY2x1c2l2ZTohMCxleGFjdDohMCxpbnB1dDpvLnZhbHVlLGluc3Q6dCxjb250aW51ZTohbi5hYm9ydH0pfX0pLFljPWQoIiRab2RDaGVja01heExlbmd0aCIsKHQsbik9Pnt2YXIgcjtKLmluaXQodCxuKSwocj10Ll96b2QuZGVmKS53aGVuPz8oci53aGVuPW89Pntjb25zdCBlPW8udmFsdWU7cmV0dXJuIUNlKGUpJiZlLmxlbmd0aCE9PXZvaWQgMH0pLHQuX3pvZC5vbmF0dGFjaC5wdXNoKG89Pntjb25zdCBlPW8uX3pvZC5iYWcubWF4aW11bT8/TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZO24ubWF4aW11bTxlJiYoby5fem9kLmJhZy5tYXhpbXVtPW4ubWF4aW11bSl9KSx0Ll96b2QuY2hlY2s9bz0+e2NvbnN0IGU9by52YWx1ZTtpZihlLmxlbmd0aDw9bi5tYXhpbXVtKXJldHVybjtjb25zdCBhPUduKGUpO28uaXNzdWVzLnB1c2goe29yaWdpbjphLGNvZGU6InRvb19iaWciLG1heGltdW06bi5tYXhpbXVtLGluY2x1c2l2ZTohMCxpbnB1dDplLGluc3Q6dCxjb250aW51ZTohbi5hYm9ydH0pfX0pLFFjPWQoIiRab2RDaGVja01pbkxlbmd0aCIsKHQsbik9Pnt2YXIgcjtKLmluaXQodCxuKSwocj10Ll96b2QuZGVmKS53aGVuPz8oci53aGVuPW89Pntjb25zdCBlPW8udmFsdWU7cmV0dXJuIUNlKGUpJiZlLmxlbmd0aCE9PXZvaWQgMH0pLHQuX3pvZC5vbmF0dGFjaC5wdXNoKG89Pntjb25zdCBlPW8uX3pvZC5iYWcubWluaW11bT8/TnVtYmVyLk5FR0FUSVZFX0lORklOSVRZO24ubWluaW11bT5lJiYoby5fem9kLmJhZy5taW5pbXVtPW4ubWluaW11bSl9KSx0Ll96b2QuY2hlY2s9bz0+e2NvbnN0IGU9by52YWx1ZTtpZihlLmxlbmd0aD49bi5taW5pbXVtKXJldHVybjtjb25zdCBhPUduKGUpO28uaXNzdWVzLnB1c2goe29yaWdpbjphLGNvZGU6InRvb19zbWFsbCIsbWluaW11bTpuLm1pbmltdW0saW5jbHVzaXZlOiEwLGlucHV0OmUsaW5zdDp0LGNvbnRpbnVlOiFuLmFib3J0fSl9fSksZXU9ZCgiJFpvZENoZWNrTGVuZ3RoRXF1YWxzIiwodCxuKT0+e3ZhciByO0ouaW5pdCh0LG4pLChyPXQuX3pvZC5kZWYpLndoZW4/PyhyLndoZW49bz0+e2NvbnN0IGU9by52YWx1ZTtyZXR1cm4hQ2UoZSkmJmUubGVuZ3RoIT09dm9pZCAwfSksdC5fem9kLm9uYXR0YWNoLnB1c2gobz0+e2NvbnN0IGU9by5fem9kLmJhZztlLm1pbmltdW09bi5sZW5ndGgsZS5tYXhpbXVtPW4ubGVuZ3RoLGUubGVuZ3RoPW4ubGVuZ3RofSksdC5fem9kLmNoZWNrPW89Pntjb25zdCBlPW8udmFsdWUsaT1lLmxlbmd0aDtpZihpPT09bi5sZW5ndGgpcmV0dXJuO2NvbnN0IGE9R24oZSkscz1pPm4ubGVuZ3RoO28uaXNzdWVzLnB1c2goe29yaWdpbjphLC4uLnM/e2NvZGU6InRvb19iaWciLG1heGltdW06bi5sZW5ndGh9Ontjb2RlOiJ0b29fc21hbGwiLG1pbmltdW06bi5sZW5ndGh9LGluY2x1c2l2ZTohMCxleGFjdDohMCxpbnB1dDpvLnZhbHVlLGluc3Q6dCxjb250aW51ZTohbi5hYm9ydH0pfX0pLEV0PWQoIiRab2RDaGVja1N0cmluZ0Zvcm1hdCIsKHQsbik9Pnt2YXIgcixvO0ouaW5pdCh0LG4pLHQuX3pvZC5vbmF0dGFjaC5wdXNoKGU9Pntjb25zdCBpPWUuX3pvZC5iYWc7aS5mb3JtYXQ9bi5mb3JtYXQsbi5wYXR0ZXJuJiYoaS5wYXR0ZXJucz8/KGkucGF0dGVybnM9bmV3IFNldCksaS5wYXR0ZXJucy5hZGQobi5wYXR0ZXJuKSl9KSxuLnBhdHRlcm4/KHI9dC5fem9kKS5jaGVjaz8/KHIuY2hlY2s9ZT0+e24ucGF0dGVybi5sYXN0SW5kZXg9MCwhbi5wYXR0ZXJuLnRlc3QoZS52YWx1ZSkmJmUuaXNzdWVzLnB1c2goe29yaWdpbjoic3RyaW5nIixjb2RlOiJpbnZhbGlkX2Zvcm1hdCIsZm9ybWF0Om4uZm9ybWF0LGlucHV0OmUudmFsdWUsLi4ubi5wYXR0ZXJuP3twYXR0ZXJuOm4ucGF0dGVybi50b1N0cmluZygpfTp7fSxpbnN0OnQsY29udGludWU6IW4uYWJvcnR9KX0pOihvPXQuX3pvZCkuY2hlY2s/PyhvLmNoZWNrPSgpPT57fSl9KSx0dT1kKCIkWm9kQ2hlY2tSZWdleCIsKHQsbik9PntFdC5pbml0KHQsbiksdC5fem9kLmNoZWNrPXI9PntuLnBhdHRlcm4ubGFzdEluZGV4PTAsIW4ucGF0dGVybi50ZXN0KHIudmFsdWUpJiZyLmlzc3Vlcy5wdXNoKHtvcmlnaW46InN0cmluZyIsY29kZToiaW52YWxpZF9mb3JtYXQiLGZvcm1hdDoicmVnZXgiLGlucHV0OnIudmFsdWUscGF0dGVybjpuLnBhdHRlcm4udG9TdHJpbmcoKSxpbnN0OnQsY29udGludWU6IW4uYWJvcnR9KX19KSxudT1kKCIkWm9kQ2hlY2tMb3dlckNhc2UiLCh0LG4pPT57bi5wYXR0ZXJuPz8obi5wYXR0ZXJuPXFjKSxFdC5pbml0KHQsbil9KSxydT1kKCIkWm9kQ2hlY2tVcHBlckNhc2UiLCh0LG4pPT57bi5wYXR0ZXJuPz8obi5wYXR0ZXJuPUZjKSxFdC5pbml0KHQsbil9KSxpdT1kKCIkWm9kQ2hlY2tJbmNsdWRlcyIsKHQsbik9PntKLmluaXQodCxuKTtjb25zdCByPWJlKG4uaW5jbHVkZXMpLG89bmV3IFJlZ0V4cCh0eXBlb2Ygbi5wb3NpdGlvbj09Im51bWJlciI/YF4ueyR7bi5wb3NpdGlvbn19JHtyfWA6cik7bi5wYXR0ZXJuPW8sdC5fem9kLm9uYXR0YWNoLnB1c2goZT0+e2NvbnN0IGk9ZS5fem9kLmJhZztpLnBhdHRlcm5zPz8oaS5wYXR0ZXJucz1uZXcgU2V0KSxpLnBhdHRlcm5zLmFkZChvKX0pLHQuX3pvZC5jaGVjaz1lPT57ZS52YWx1ZS5pbmNsdWRlcyhuLmluY2x1ZGVzLG4ucG9zaXRpb24pfHxlLmlzc3Vlcy5wdXNoKHtvcmlnaW46InN0cmluZyIsY29kZToiaW52YWxpZF9mb3JtYXQiLGZvcm1hdDoiaW5jbHVkZXMiLGluY2x1ZGVzOm4uaW5jbHVkZXMsaW5wdXQ6ZS52YWx1ZSxpbnN0OnQsY29udGludWU6IW4uYWJvcnR9KX19KSxvdT1kKCIkWm9kQ2hlY2tTdGFydHNXaXRoIiwodCxuKT0+e0ouaW5pdCh0LG4pO2NvbnN0IHI9bmV3IFJlZ0V4cChgXiR7YmUobi5wcmVmaXgpfS4qYCk7bi5wYXR0ZXJuPz8obi5wYXR0ZXJuPXIpLHQuX3pvZC5vbmF0dGFjaC5wdXNoKG89Pntjb25zdCBlPW8uX3pvZC5iYWc7ZS5wYXR0ZXJucz8/KGUucGF0dGVybnM9bmV3IFNldCksZS5wYXR0ZXJucy5hZGQocil9KSx0Ll96b2QuY2hlY2s9bz0+e28udmFsdWUuc3RhcnRzV2l0aChuLnByZWZpeCl8fG8uaXNzdWVzLnB1c2goe29yaWdpbjoic3RyaW5nIixjb2RlOiJpbnZhbGlkX2Zvcm1hdCIsZm9ybWF0OiJzdGFydHNfd2l0aCIscHJlZml4Om4ucHJlZml4LGlucHV0Om8udmFsdWUsaW5zdDp0LGNvbnRpbnVlOiFuLmFib3J0fSl9fSksYXU9ZCgiJFpvZENoZWNrRW5kc1dpdGgiLCh0LG4pPT57Si5pbml0KHQsbik7Y29uc3Qgcj1uZXcgUmVnRXhwKGAuKiR7YmUobi5zdWZmaXgpfSRgKTtuLnBhdHRlcm4/PyhuLnBhdHRlcm49ciksdC5fem9kLm9uYXR0YWNoLnB1c2gobz0+e2NvbnN0IGU9by5fem9kLmJhZztlLnBhdHRlcm5zPz8oZS5wYXR0ZXJucz1uZXcgU2V0KSxlLnBhdHRlcm5zLmFkZChyKX0pLHQuX3pvZC5jaGVjaz1vPT57by52YWx1ZS5lbmRzV2l0aChuLnN1ZmZpeCl8fG8uaXNzdWVzLnB1c2goe29yaWdpbjoic3RyaW5nIixjb2RlOiJpbnZhbGlkX2Zvcm1hdCIsZm9ybWF0OiJlbmRzX3dpdGgiLHN1ZmZpeDpuLnN1ZmZpeCxpbnB1dDpvLnZhbHVlLGluc3Q6dCxjb250aW51ZTohbi5hYm9ydH0pfX0pO2Z1bmN0aW9uIGdzKHQsbixyKXt0Lmlzc3Vlcy5sZW5ndGgmJm4uaXNzdWVzLnB1c2goLi4uZmUocix0Lmlzc3VlcykpfWNvbnN0IHN1PWQoIiRab2RDaGVja1Byb3BlcnR5IiwodCxuKT0+e0ouaW5pdCh0LG4pLHQuX3pvZC5jaGVjaz1yPT57Y29uc3Qgbz1uLnNjaGVtYS5fem9kLnJ1bih7dmFsdWU6ci52YWx1ZVtuLnByb3BlcnR5XSxpc3N1ZXM6W119LHt9KTtpZihvIGluc3RhbmNlb2YgUHJvbWlzZSlyZXR1cm4gby50aGVuKGU9PmdzKGUscixuLnByb3BlcnR5KSk7Z3MobyxyLG4ucHJvcGVydHkpfX0pLGN1PWQoIiRab2RDaGVja01pbWVUeXBlIiwodCxuKT0+e0ouaW5pdCh0LG4pO2NvbnN0IHI9bmV3IFNldChuLm1pbWUpO3QuX3pvZC5vbmF0dGFjaC5wdXNoKG89PntvLl96b2QuYmFnLm1pbWU9bi5taW1lfSksdC5fem9kLmNoZWNrPW89PntyLmhhcyhvLnZhbHVlLnR5cGUpfHxvLmlzc3Vlcy5wdXNoKHtjb2RlOiJpbnZhbGlkX3ZhbHVlIix2YWx1ZXM6bi5taW1lLGlucHV0Om8udmFsdWUudHlwZSxpbnN0OnQsY29udGludWU6IW4uYWJvcnR9KX19KSx1dT1kKCIkWm9kQ2hlY2tPdmVyd3JpdGUiLCh0LG4pPT57Si5pbml0KHQsbiksdC5fem9kLmNoZWNrPXI9PntyLnZhbHVlPW4udHgoci52YWx1ZSl9fSk7Y2xhc3MgbHV7Y29uc3RydWN0b3Iobj1bXSl7dGhpcy5jb250ZW50PVtdLHRoaXMuaW5kZW50PTAsdGhpcyYmKHRoaXMuYXJncz1uKX1pbmRlbnRlZChuKXt0aGlzLmluZGVudCs9MSxuKHRoaXMpLHRoaXMuaW5kZW50LT0xfXdyaXRlKG4pe2lmKHR5cGVvZiBuPT0iZnVuY3Rpb24iKXtuKHRoaXMse2V4ZWN1dGlvbjoic3luYyJ9KSxuKHRoaXMse2V4ZWN1dGlvbjoiYXN5bmMifSk7cmV0dXJufWNvbnN0IG89bi5zcGxpdChgCmApLmZpbHRlcihhPT5hKSxlPU1hdGgubWluKC4uLm8ubWFwKGE9PmEubGVuZ3RoLWEudHJpbVN0YXJ0KCkubGVuZ3RoKSksaT1vLm1hcChhPT5hLnNsaWNlKGUpKS5tYXAoYT0+IiAiLnJlcGVhdCh0aGlzLmluZGVudCoyKSthKTtmb3IoY29uc3QgYSBvZiBpKXRoaXMuY29udGVudC5wdXNoKGEpfWNvbXBpbGUoKXtjb25zdCBuPUZ1bmN0aW9uLHI9dGhpcz8uYXJncyxlPVsuLi4odGhpcz8uY29udGVudD8/WyIiXSkubWFwKGk9PmAgICR7aX1gKV07cmV0dXJuIG5ldyBuKC4uLnIsZS5qb2luKGAKYCkpfX1jb25zdCBkdT17bWFqb3I6NCxtaW5vcjo0LHBhdGNoOjN9LHg9ZCgiJFpvZFR5cGUiLCh0LG4pPT57dmFyIHI7dD8/KHQ9e30pLHQuX3pvZC5kZWY9bix0Ll96b2QuYmFnPXQuX3pvZC5iYWd8fHt9LHQuX3pvZC52ZXJzaW9uPWR1O2NvbnN0IG89Wy4uLnQuX3pvZC5kZWYuY2hlY2tzPz9bXV07dC5fem9kLnRyYWl0cy5oYXMoIiRab2RDaGVjayIpJiZvLnVuc2hpZnQodCk7Zm9yKGNvbnN0IGUgb2Ygbylmb3IoY29uc3QgaSBvZiBlLl96b2Qub25hdHRhY2gpaSh0KTtpZihvLmxlbmd0aD09PTApKHI9dC5fem9kKS5kZWZlcnJlZD8/KHIuZGVmZXJyZWQ9W10pLHQuX3pvZC5kZWZlcnJlZD8ucHVzaCgoKT0+e3QuX3pvZC5ydW49dC5fem9kLnBhcnNlfSk7ZWxzZXtjb25zdCBlPShhLHMsYyk9PntsZXQgdT1VZShhKSxsO2Zvcihjb25zdCBnIG9mIHMpe2lmKGcuX3pvZC5kZWYud2hlbil7aWYob2MoYSl8fCFnLl96b2QuZGVmLndoZW4oYSkpY29udGludWV9ZWxzZSBpZih1KWNvbnRpbnVlO2NvbnN0IHY9YS5pc3N1ZXMubGVuZ3RoLCQ9Zy5fem9kLmNoZWNrKGEpO2lmKCQgaW5zdGFuY2VvZiBQcm9taXNlJiZjPy5hc3luYz09PSExKXRocm93IG5ldyBQZTtpZihsfHwkIGluc3RhbmNlb2YgUHJvbWlzZSlsPShsPz9Qcm9taXNlLnJlc29sdmUoKSkudGhlbihhc3luYygpPT57YXdhaXQgJCxhLmlzc3Vlcy5sZW5ndGghPT12JiYodXx8KHU9VWUoYSx2KSkpfSk7ZWxzZXtpZihhLmlzc3Vlcy5sZW5ndGg9PT12KWNvbnRpbnVlO3V8fCh1PVVlKGEsdikpfX1yZXR1cm4gbD9sLnRoZW4oKCk9PmEpOmF9LGk9KGEscyxjKT0+e2lmKFVlKGEpKXJldHVybiBhLmFib3J0ZWQ9ITAsYTtjb25zdCB1PWUocyxvLGMpO2lmKHUgaW5zdGFuY2VvZiBQcm9taXNlKXtpZihjLmFzeW5jPT09ITEpdGhyb3cgbmV3IFBlO3JldHVybiB1LnRoZW4obD0+dC5fem9kLnBhcnNlKGwsYykpfXJldHVybiB0Ll96b2QucGFyc2UodSxjKX07dC5fem9kLnJ1bj0oYSxzKT0+e2lmKHMuc2tpcENoZWNrcylyZXR1cm4gdC5fem9kLnBhcnNlKGEscyk7aWYocy5kaXJlY3Rpb249PT0iYmFja3dhcmQiKXtjb25zdCB1PXQuX3pvZC5wYXJzZSh7dmFsdWU6YS52YWx1ZSxpc3N1ZXM6W119LHsuLi5zLHNraXBDaGVja3M6ITB9KTtyZXR1cm4gdSBpbnN0YW5jZW9mIFByb21pc2U/dS50aGVuKGw9PmkobCxhLHMpKTppKHUsYSxzKX1jb25zdCBjPXQuX3pvZC5wYXJzZShhLHMpO2lmKGMgaW5zdGFuY2VvZiBQcm9taXNlKXtpZihzLmFzeW5jPT09ITEpdGhyb3cgbmV3IFBlO3JldHVybiBjLnRoZW4odT0+ZSh1LG8scykpfXJldHVybiBlKGMsbyxzKX19Tyh0LCJ+c3RhbmRhcmQiLCgpPT4oe3ZhbGlkYXRlOmU9Pnt0cnl7Y29uc3QgaT1raSh0LGUpO3JldHVybiBpLnN1Y2Nlc3M/e3ZhbHVlOmkuZGF0YX06e2lzc3VlczppLmVycm9yPy5pc3N1ZXN9fWNhdGNoe3JldHVybiBsYyh0LGUpLnRoZW4oYT0+YS5zdWNjZXNzP3t2YWx1ZTphLmRhdGF9Ontpc3N1ZXM6YS5lcnJvcj8uaXNzdWVzfSl9fSx2ZW5kb3I6InpvZCIsdmVyc2lvbjoxfSkpfSksWnQ9ZCgiJFpvZFN0cmluZyIsKHQsbik9Pnt4LmluaXQodCxuKSx0Ll96b2QucGF0dGVybj1bLi4udD8uX3pvZC5iYWc/LnBhdHRlcm5zPz9bXV0ucG9wKCk/P1pjKHQuX3pvZC5iYWcpLHQuX3pvZC5wYXJzZT0ocixvKT0+e2lmKG4uY29lcmNlKXRyeXtyLnZhbHVlPVN0cmluZyhyLnZhbHVlKX1jYXRjaHt9cmV0dXJuIHR5cGVvZiByLnZhbHVlPT0ic3RyaW5nInx8ci5pc3N1ZXMucHVzaCh7ZXhwZWN0ZWQ6InN0cmluZyIsY29kZToiaW52YWxpZF90eXBlIixpbnB1dDpyLnZhbHVlLGluc3Q6dH0pLHJ9fSksRj1kKCIkWm9kU3RyaW5nRm9ybWF0IiwodCxuKT0+e0V0LmluaXQodCxuKSxadC5pbml0KHQsbil9KSxtdT1kKCIkWm9kR1VJRCIsKHQsbik9PntuLnBhdHRlcm4/PyhuLnBhdHRlcm49JGMpLEYuaW5pdCh0LG4pfSkscHU9ZCgiJFpvZFVVSUQiLCh0LG4pPT57aWYobi52ZXJzaW9uKXtjb25zdCBvPXt2MToxLHYyOjIsdjM6Myx2NDo0LHY1OjUsdjY6Nix2Nzo3LHY4Ojh9W24udmVyc2lvbl07aWYobz09PXZvaWQgMCl0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgVVVJRCB2ZXJzaW9uOiAiJHtuLnZlcnNpb259ImApO24ucGF0dGVybj8/KG4ucGF0dGVybj1XZShvKSl9ZWxzZSBuLnBhdHRlcm4/PyhuLnBhdHRlcm49V2UoKSk7Ri5pbml0KHQsbil9KSxmdT1kKCIkWm9kRW1haWwiLCh0LG4pPT57bi5wYXR0ZXJuPz8obi5wYXR0ZXJuPV9jKSxGLmluaXQodCxuKX0pLGd1PWQoIiRab2RVUkwiLCh0LG4pPT57Ri5pbml0KHQsbiksdC5fem9kLmNoZWNrPXI9Pnt0cnl7Y29uc3Qgbz1yLnZhbHVlLnRyaW0oKTtpZighbi5ub3JtYWxpemUmJm4ucHJvdG9jb2w/LnNvdXJjZT09PVBpLnNvdXJjZSYmIS9eaHR0cHM/OlwvXC8vaS50ZXN0KG8pKXtyLmlzc3Vlcy5wdXNoKHtjb2RlOiJpbnZhbGlkX2Zvcm1hdCIsZm9ybWF0OiJ1cmwiLG5vdGU6IkludmFsaWQgVVJMIGZvcm1hdCIsaW5wdXQ6ci52YWx1ZSxpbnN0OnQsY29udGludWU6IW4uYWJvcnR9KTtyZXR1cm59Y29uc3QgZT1uZXcgVVJMKG8pO24uaG9zdG5hbWUmJihuLmhvc3RuYW1lLmxhc3RJbmRleD0wLG4uaG9zdG5hbWUudGVzdChlLmhvc3RuYW1lKXx8ci5pc3N1ZXMucHVzaCh7Y29kZToiaW52YWxpZF9mb3JtYXQiLGZvcm1hdDoidXJsIixub3RlOiJJbnZhbGlkIGhvc3RuYW1lIixwYXR0ZXJuOm4uaG9zdG5hbWUuc291cmNlLGlucHV0OnIudmFsdWUsaW5zdDp0LGNvbnRpbnVlOiFuLmFib3J0fSkpLG4ucHJvdG9jb2wmJihuLnByb3RvY29sLmxhc3RJbmRleD0wLG4ucHJvdG9jb2wudGVzdChlLnByb3RvY29sLmVuZHNXaXRoKCI6Iik/ZS5wcm90b2NvbC5zbGljZSgwLC0xKTplLnByb3RvY29sKXx8ci5pc3N1ZXMucHVzaCh7Y29kZToiaW52YWxpZF9mb3JtYXQiLGZvcm1hdDoidXJsIixub3RlOiJJbnZhbGlkIHByb3RvY29sIixwYXR0ZXJuOm4ucHJvdG9jb2wuc291cmNlLGlucHV0OnIudmFsdWUsaW5zdDp0LGNvbnRpbnVlOiFuLmFib3J0fSkpLG4ubm9ybWFsaXplP3IudmFsdWU9ZS5ocmVmOnIudmFsdWU9bztyZXR1cm59Y2F0Y2h7ci5pc3N1ZXMucHVzaCh7Y29kZToiaW52YWxpZF9mb3JtYXQiLGZvcm1hdDoidXJsIixpbnB1dDpyLnZhbHVlLGluc3Q6dCxjb250aW51ZTohbi5hYm9ydH0pfX19KSx2dT1kKCIkWm9kRW1vamkiLCh0LG4pPT57bi5wYXR0ZXJuPz8obi5wYXR0ZXJuPXljKCkpLEYuaW5pdCh0LG4pfSksaHU9ZCgiJFpvZE5hbm9JRCIsKHQsbik9PntuLnBhdHRlcm4/PyhuLnBhdHRlcm49dmMpLEYuaW5pdCh0LG4pfSksJHU9ZCgiJFpvZENVSUQiLCh0LG4pPT57bi5wYXR0ZXJuPz8obi5wYXR0ZXJuPWRjKSxGLmluaXQodCxuKX0pLF91PWQoIiRab2RDVUlEMiIsKHQsbik9PntuLnBhdHRlcm4/PyhuLnBhdHRlcm49bWMpLEYuaW5pdCh0LG4pfSksYnU9ZCgiJFpvZFVMSUQiLCh0LG4pPT57bi5wYXR0ZXJuPz8obi5wYXR0ZXJuPXBjKSxGLmluaXQodCxuKX0pLHl1PWQoIiRab2RYSUQiLCh0LG4pPT57bi5wYXR0ZXJuPz8obi5wYXR0ZXJuPWZjKSxGLmluaXQodCxuKX0pLGt1PWQoIiRab2RLU1VJRCIsKHQsbik9PntuLnBhdHRlcm4/PyhuLnBhdHRlcm49Z2MpLEYuaW5pdCh0LG4pfSksU3U9ZCgiJFpvZElTT0RhdGVUaW1lIiwodCxuKT0+e24ucGF0dGVybj8/KG4ucGF0dGVybj1FYyhuKSksRi5pbml0KHQsbil9KSx3dT1kKCIkWm9kSVNPRGF0ZSIsKHQsbik9PntuLnBhdHRlcm4/PyhuLnBhdHRlcm49UGMpLEYuaW5pdCh0LG4pfSksSXU9ZCgiJFpvZElTT1RpbWUiLCh0LG4pPT57bi5wYXR0ZXJuPz8obi5wYXR0ZXJuPURjKG4pKSxGLmluaXQodCxuKX0pLHp1PWQoIiRab2RJU09EdXJhdGlvbiIsKHQsbik9PntuLnBhdHRlcm4/PyhuLnBhdHRlcm49aGMpLEYuaW5pdCh0LG4pfSkseHU9ZCgiJFpvZElQdjQiLCh0LG4pPT57bi5wYXR0ZXJuPz8obi5wYXR0ZXJuPWtjKSxGLmluaXQodCxuKSx0Ll96b2QuYmFnLmZvcm1hdD0iaXB2NCJ9KSxUdT1kKCIkWm9kSVB2NiIsKHQsbik9PntuLnBhdHRlcm4/PyhuLnBhdHRlcm49U2MpLEYuaW5pdCh0LG4pLHQuX3pvZC5iYWcuZm9ybWF0PSJpcHY2Iix0Ll96b2QuY2hlY2s9cj0+e3RyeXtuZXcgVVJMKGBodHRwOi8vWyR7ci52YWx1ZX1dYCl9Y2F0Y2h7ci5pc3N1ZXMucHVzaCh7Y29kZToiaW52YWxpZF9mb3JtYXQiLGZvcm1hdDoiaXB2NiIsaW5wdXQ6ci52YWx1ZSxpbnN0OnQsY29udGludWU6IW4uYWJvcnR9KX19fSksanU9ZCgiJFpvZE1BQyIsKHQsbik9PntuLnBhdHRlcm4/PyhuLnBhdHRlcm49d2Mobi5kZWxpbWl0ZXIpKSxGLmluaXQodCxuKSx0Ll96b2QuYmFnLmZvcm1hdD0ibWFjIn0pLE91PWQoIiRab2RDSURSdjQiLCh0LG4pPT57bi5wYXR0ZXJuPz8obi5wYXR0ZXJuPUljKSxGLmluaXQodCxuKX0pLFV1PWQoIiRab2RDSURSdjYiLCh0LG4pPT57bi5wYXR0ZXJuPz8obi5wYXR0ZXJuPXpjKSxGLmluaXQodCxuKSx0Ll96b2QuY2hlY2s9cj0+e2NvbnN0IG89ci52YWx1ZS5zcGxpdCgiLyIpO3RyeXtpZihvLmxlbmd0aCE9PTIpdGhyb3cgbmV3IEVycm9yO2NvbnN0W2UsaV09bztpZighaSl0aHJvdyBuZXcgRXJyb3I7Y29uc3QgYT1OdW1iZXIoaSk7aWYoYCR7YX1gIT09aSl0aHJvdyBuZXcgRXJyb3I7aWYoYTwwfHxhPjEyOCl0aHJvdyBuZXcgRXJyb3I7bmV3IFVSTChgaHR0cDovL1ske2V9XWApfWNhdGNoe3IuaXNzdWVzLnB1c2goe2NvZGU6ImludmFsaWRfZm9ybWF0Iixmb3JtYXQ6ImNpZHJ2NiIsaW5wdXQ6ci52YWx1ZSxpbnN0OnQsY29udGludWU6IW4uYWJvcnR9KX19fSk7ZnVuY3Rpb24gWmkodCl7aWYodD09PSIiKXJldHVybiEwO2lmKC9ccy8udGVzdCh0KXx8dC5sZW5ndGglNCE9PTApcmV0dXJuITE7dHJ5e3JldHVybiBhdG9iKHQpLCEwfWNhdGNoe3JldHVybiExfX1jb25zdCBQdT1kKCIkWm9kQmFzZTY0IiwodCxuKT0+e24ucGF0dGVybj8/KG4ucGF0dGVybj14YyksRi5pbml0KHQsbiksdC5fem9kLmJhZy5jb250ZW50RW5jb2Rpbmc9ImJhc2U2NCIsdC5fem9kLmNoZWNrPXI9PntaaShyLnZhbHVlKXx8ci5pc3N1ZXMucHVzaCh7Y29kZToiaW52YWxpZF9mb3JtYXQiLGZvcm1hdDoiYmFzZTY0IixpbnB1dDpyLnZhbHVlLGluc3Q6dCxjb250aW51ZTohbi5hYm9ydH0pfX0pO2Z1bmN0aW9uIE51KHQpe2lmKCFVaS50ZXN0KHQpKXJldHVybiExO2NvbnN0IG49dC5yZXBsYWNlKC9bLV9dL2csbz0+bz09PSItIj8iKyI6Ii8iKSxyPW4ucGFkRW5kKE1hdGguY2VpbChuLmxlbmd0aC80KSo0LCI9Iik7cmV0dXJuIFppKHIpfWNvbnN0IER1PWQoIiRab2RCYXNlNjRVUkwiLCh0LG4pPT57bi5wYXR0ZXJuPz8obi5wYXR0ZXJuPVVpKSxGLmluaXQodCxuKSx0Ll96b2QuYmFnLmNvbnRlbnRFbmNvZGluZz0iYmFzZTY0dXJsIix0Ll96b2QuY2hlY2s9cj0+e051KHIudmFsdWUpfHxyLmlzc3Vlcy5wdXNoKHtjb2RlOiJpbnZhbGlkX2Zvcm1hdCIsZm9ybWF0OiJiYXNlNjR1cmwiLGlucHV0OnIudmFsdWUsaW5zdDp0LGNvbnRpbnVlOiFuLmFib3J0fSl9fSksRXU9ZCgiJFpvZEUxNjQiLCh0LG4pPT57bi5wYXR0ZXJuPz8obi5wYXR0ZXJuPU9jKSxGLmluaXQodCxuKX0pO2Z1bmN0aW9uIFp1KHQsbj1udWxsKXt0cnl7Y29uc3Qgcj10LnNwbGl0KCIuIik7aWYoci5sZW5ndGghPT0zKXJldHVybiExO2NvbnN0W29dPXI7aWYoIW8pcmV0dXJuITE7Y29uc3QgZT1KU09OLnBhcnNlKGF0b2IobykpO3JldHVybiEoInR5cCJpbiBlJiZlPy50eXAhPT0iSldUInx8IWUuYWxnfHxuJiYoISgiYWxnImluIGUpfHxlLmFsZyE9PW4pKX1jYXRjaHtyZXR1cm4hMX19Y29uc3QgUnU9ZCgiJFpvZEpXVCIsKHQsbik9PntGLmluaXQodCxuKSx0Ll96b2QuY2hlY2s9cj0+e1p1KHIudmFsdWUsbi5hbGcpfHxyLmlzc3Vlcy5wdXNoKHtjb2RlOiJpbnZhbGlkX2Zvcm1hdCIsZm9ybWF0OiJqd3QiLGlucHV0OnIudmFsdWUsaW5zdDp0LGNvbnRpbnVlOiFuLmFib3J0fSl9fSksQ3U9ZCgiJFpvZEN1c3RvbVN0cmluZ0Zvcm1hdCIsKHQsbik9PntGLmluaXQodCxuKSx0Ll96b2QuY2hlY2s9cj0+e24uZm4oci52YWx1ZSl8fHIuaXNzdWVzLnB1c2goe2NvZGU6ImludmFsaWRfZm9ybWF0Iixmb3JtYXQ6bi5mb3JtYXQsaW5wdXQ6ci52YWx1ZSxpbnN0OnQsY29udGludWU6IW4uYWJvcnR9KX19KSxSaT1kKCIkWm9kTnVtYmVyIiwodCxuKT0+e3guaW5pdCh0LG4pLHQuX3pvZC5wYXR0ZXJuPXQuX3pvZC5iYWcucGF0dGVybj8/TmksdC5fem9kLnBhcnNlPShyLG8pPT57aWYobi5jb2VyY2UpdHJ5e3IudmFsdWU9TnVtYmVyKHIudmFsdWUpfWNhdGNoe31jb25zdCBlPXIudmFsdWU7aWYodHlwZW9mIGU9PSJudW1iZXIiJiYhTnVtYmVyLmlzTmFOKGUpJiZOdW1iZXIuaXNGaW5pdGUoZSkpcmV0dXJuIHI7Y29uc3QgaT10eXBlb2YgZT09Im51bWJlciI/TnVtYmVyLmlzTmFOKGUpPyJOYU4iOk51bWJlci5pc0Zpbml0ZShlKT92b2lkIDA6IkluZmluaXR5Ijp2b2lkIDA7cmV0dXJuIHIuaXNzdWVzLnB1c2goe2V4cGVjdGVkOiJudW1iZXIiLGNvZGU6ImludmFsaWRfdHlwZSIsaW5wdXQ6ZSxpbnN0OnQsLi4uaT97cmVjZWl2ZWQ6aX06e319KSxyfX0pLEF1PWQoIiRab2ROdW1iZXJGb3JtYXQiLCh0LG4pPT57QmMuaW5pdCh0LG4pLFJpLmluaXQodCxuKX0pLENpPWQoIiRab2RCb29sZWFuIiwodCxuKT0+e3guaW5pdCh0LG4pLHQuX3pvZC5wYXR0ZXJuPUFjLHQuX3pvZC5wYXJzZT0ocixvKT0+e2lmKG4uY29lcmNlKXRyeXtyLnZhbHVlPSEhci52YWx1ZX1jYXRjaHt9Y29uc3QgZT1yLnZhbHVlO3JldHVybiB0eXBlb2YgZT09ImJvb2xlYW4ifHxyLmlzc3Vlcy5wdXNoKHtleHBlY3RlZDoiYm9vbGVhbiIsY29kZToiaW52YWxpZF90eXBlIixpbnB1dDplLGluc3Q6dH0pLHJ9fSksQWk9ZCgiJFpvZEJpZ0ludCIsKHQsbik9Pnt4LmluaXQodCxuKSx0Ll96b2QucGF0dGVybj1SYyx0Ll96b2QucGFyc2U9KHIsbyk9PntpZihuLmNvZXJjZSl0cnl7ci52YWx1ZT1CaWdJbnQoci52YWx1ZSl9Y2F0Y2h7fXJldHVybiB0eXBlb2Ygci52YWx1ZT09ImJpZ2ludCJ8fHIuaXNzdWVzLnB1c2goe2V4cGVjdGVkOiJiaWdpbnQiLGNvZGU6ImludmFsaWRfdHlwZSIsaW5wdXQ6ci52YWx1ZSxpbnN0OnR9KSxyfX0pLEx1PWQoIiRab2RCaWdJbnRGb3JtYXQiLCh0LG4pPT57VmMuaW5pdCh0LG4pLEFpLmluaXQodCxuKX0pLE11PWQoIiRab2RTeW1ib2wiLCh0LG4pPT57eC5pbml0KHQsbiksdC5fem9kLnBhcnNlPShyLG8pPT57Y29uc3QgZT1yLnZhbHVlO3JldHVybiB0eXBlb2YgZT09InN5bWJvbCJ8fHIuaXNzdWVzLnB1c2goe2V4cGVjdGVkOiJzeW1ib2wiLGNvZGU6ImludmFsaWRfdHlwZSIsaW5wdXQ6ZSxpbnN0OnR9KSxyfX0pLHF1PWQoIiRab2RVbmRlZmluZWQiLCh0LG4pPT57eC5pbml0KHQsbiksdC5fem9kLnBhdHRlcm49TWMsdC5fem9kLnZhbHVlcz1uZXcgU2V0KFt2b2lkIDBdKSx0Ll96b2QucGFyc2U9KHIsbyk9Pntjb25zdCBlPXIudmFsdWU7cmV0dXJuIHR5cGVvZiBlPiJ1Inx8ci5pc3N1ZXMucHVzaCh7ZXhwZWN0ZWQ6InVuZGVmaW5lZCIsY29kZToiaW52YWxpZF90eXBlIixpbnB1dDplLGluc3Q6dH0pLHJ9fSksRnU9ZCgiJFpvZE51bGwiLCh0LG4pPT57eC5pbml0KHQsbiksdC5fem9kLnBhdHRlcm49TGMsdC5fem9kLnZhbHVlcz1uZXcgU2V0KFtudWxsXSksdC5fem9kLnBhcnNlPShyLG8pPT57Y29uc3QgZT1yLnZhbHVlO3JldHVybiBlPT09bnVsbHx8ci5pc3N1ZXMucHVzaCh7ZXhwZWN0ZWQ6Im51bGwiLGNvZGU6ImludmFsaWRfdHlwZSIsaW5wdXQ6ZSxpbnN0OnR9KSxyfX0pLEp1PWQoIiRab2RBbnkiLCh0LG4pPT57eC5pbml0KHQsbiksdC5fem9kLnBhcnNlPXI9PnJ9KSxIdT1kKCIkWm9kVW5rbm93biIsKHQsbik9Pnt4LmluaXQodCxuKSx0Ll96b2QucGFyc2U9cj0+cn0pLFd1PWQoIiRab2ROZXZlciIsKHQsbik9Pnt4LmluaXQodCxuKSx0Ll96b2QucGFyc2U9KHIsbyk9PihyLmlzc3Vlcy5wdXNoKHtleHBlY3RlZDoibmV2ZXIiLGNvZGU6ImludmFsaWRfdHlwZSIsaW5wdXQ6ci52YWx1ZSxpbnN0OnR9KSxyKX0pLEJ1PWQoIiRab2RWb2lkIiwodCxuKT0+e3guaW5pdCh0LG4pLHQuX3pvZC5wYXJzZT0ocixvKT0+e2NvbnN0IGU9ci52YWx1ZTtyZXR1cm4gdHlwZW9mIGU+InUifHxyLmlzc3Vlcy5wdXNoKHtleHBlY3RlZDoidm9pZCIsY29kZToiaW52YWxpZF90eXBlIixpbnB1dDplLGluc3Q6dH0pLHJ9fSksVnU9ZCgiJFpvZERhdGUiLCh0LG4pPT57eC5pbml0KHQsbiksdC5fem9kLnBhcnNlPShyLG8pPT57aWYobi5jb2VyY2UpdHJ5e3IudmFsdWU9bmV3IERhdGUoci52YWx1ZSl9Y2F0Y2h7fWNvbnN0IGU9ci52YWx1ZSxpPWUgaW5zdGFuY2VvZiBEYXRlO3JldHVybiBpJiYhTnVtYmVyLmlzTmFOKGUuZ2V0VGltZSgpKXx8ci5pc3N1ZXMucHVzaCh7ZXhwZWN0ZWQ6ImRhdGUiLGNvZGU6ImludmFsaWRfdHlwZSIsaW5wdXQ6ZSwuLi5pP3tyZWNlaXZlZDoiSW52YWxpZCBEYXRlIn06e30saW5zdDp0fSkscn19KTtmdW5jdGlvbiB2cyh0LG4scil7dC5pc3N1ZXMubGVuZ3RoJiZuLmlzc3Vlcy5wdXNoKC4uLmZlKHIsdC5pc3N1ZXMpKSxuLnZhbHVlW3JdPXQudmFsdWV9Y29uc3QgS3U9ZCgiJFpvZEFycmF5IiwodCxuKT0+e3guaW5pdCh0LG4pLHQuX3pvZC5wYXJzZT0ocixvKT0+e2NvbnN0IGU9ci52YWx1ZTtpZighQXJyYXkuaXNBcnJheShlKSlyZXR1cm4gci5pc3N1ZXMucHVzaCh7ZXhwZWN0ZWQ6ImFycmF5Iixjb2RlOiJpbnZhbGlkX3R5cGUiLGlucHV0OmUsaW5zdDp0fSkscjtyLnZhbHVlPUFycmF5KGUubGVuZ3RoKTtjb25zdCBpPVtdO2ZvcihsZXQgYT0wO2E8ZS5sZW5ndGg7YSsrKXtjb25zdCBzPWVbYV0sYz1uLmVsZW1lbnQuX3pvZC5ydW4oe3ZhbHVlOnMsaXNzdWVzOltdfSxvKTtjIGluc3RhbmNlb2YgUHJvbWlzZT9pLnB1c2goYy50aGVuKHU9PnZzKHUscixhKSkpOnZzKGMscixhKX1yZXR1cm4gaS5sZW5ndGg/UHJvbWlzZS5hbGwoaSkudGhlbigoKT0+cik6cn19KTtmdW5jdGlvbiBBbih0LG4scixvLGUsaSl7Y29uc3QgYT1yIGluIG87aWYodC5pc3N1ZXMubGVuZ3RoKXtpZihlJiZpJiYhYSlyZXR1cm47bi5pc3N1ZXMucHVzaCguLi5mZShyLHQuaXNzdWVzKSl9aWYoIWEmJiFlKXt0Lmlzc3Vlcy5sZW5ndGh8fG4uaXNzdWVzLnB1c2goe2NvZGU6ImludmFsaWRfdHlwZSIsZXhwZWN0ZWQ6Im5vbm9wdGlvbmFsIixpbnB1dDp2b2lkIDAscGF0aDpbcl19KTtyZXR1cm59dC52YWx1ZT09PXZvaWQgMD9hJiYobi52YWx1ZVtyXT12b2lkIDApOm4udmFsdWVbcl09dC52YWx1ZX1mdW5jdGlvbiBHdSh0KXtjb25zdCBuPU9iamVjdC5rZXlzKHQuc2hhcGUpO2Zvcihjb25zdCBvIG9mIG4paWYoIXQuc2hhcGU/LltvXT8uX3pvZD8udHJhaXRzPy5oYXMoIiRab2RUeXBlIikpdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGVsZW1lbnQgYXQga2V5ICIke299IjogZXhwZWN0ZWQgYSBab2Qgc2NoZW1hYCk7Y29uc3Qgcj1Lcyh0LnNoYXBlKTtyZXR1cm57Li4udCxrZXlzOm4sa2V5U2V0Om5ldyBTZXQobiksbnVtS2V5czpuLmxlbmd0aCxvcHRpb25hbEtleXM6bmV3IFNldChyKX19ZnVuY3Rpb24gWHUodCxuLHIsbyxlLGkpe2NvbnN0IGE9W10scz1lLmtleVNldCxjPWUuY2F0Y2hhbGwuX3pvZCx1PWMuZGVmLnR5cGUsbD1jLm9wdGluPT09Im9wdGlvbmFsIixnPWMub3B0b3V0PT09Im9wdGlvbmFsIjtmb3IoY29uc3QgdiBpbiBuKXtpZih2PT09Il9fcHJvdG9fXyJ8fHMuaGFzKHYpKWNvbnRpbnVlO2lmKHU9PT0ibmV2ZXIiKXthLnB1c2godik7Y29udGludWV9Y29uc3QgJD1jLnJ1bih7dmFsdWU6blt2XSxpc3N1ZXM6W119LG8pOyQgaW5zdGFuY2VvZiBQcm9taXNlP3QucHVzaCgkLnRoZW4oeT0+QW4oeSxyLHYsbixsLGcpKSk6QW4oJCxyLHYsbixsLGcpfXJldHVybiBhLmxlbmd0aCYmci5pc3N1ZXMucHVzaCh7Y29kZToidW5yZWNvZ25pemVkX2tleXMiLGtleXM6YSxpbnB1dDpuLGluc3Q6aX0pLHQubGVuZ3RoP1Byb21pc2UuYWxsKHQpLnRoZW4oKCk9PnIpOnJ9Y29uc3QgWXU9ZCgiJFpvZE9iamVjdCIsKHQsbik9PntpZih4LmluaXQodCxuKSwhT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihuLCJzaGFwZSIpPy5nZXQpe2NvbnN0IHM9bi5zaGFwZTtPYmplY3QuZGVmaW5lUHJvcGVydHkobiwic2hhcGUiLHtnZXQ6KCk9Pntjb25zdCBjPXsuLi5zfTtyZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KG4sInNoYXBlIix7dmFsdWU6Y30pLGN9fSl9Y29uc3Qgbz1UdCgoKT0+R3UobikpO08odC5fem9kLCJwcm9wVmFsdWVzIiwoKT0+e2NvbnN0IHM9bi5zaGFwZSxjPXt9O2Zvcihjb25zdCB1IGluIHMpe2NvbnN0IGw9c1t1XS5fem9kO2lmKGwudmFsdWVzKXtjW3VdPz8oY1t1XT1uZXcgU2V0KTtmb3IoY29uc3QgZyBvZiBsLnZhbHVlcyljW3VdLmFkZChnKX19cmV0dXJuIGN9KTtjb25zdCBlPUplLGk9bi5jYXRjaGFsbDtsZXQgYTt0Ll96b2QucGFyc2U9KHMsYyk9PnthPz8oYT1vLnZhbHVlKTtjb25zdCB1PXMudmFsdWU7aWYoIWUodSkpcmV0dXJuIHMuaXNzdWVzLnB1c2goe2V4cGVjdGVkOiJvYmplY3QiLGNvZGU6ImludmFsaWRfdHlwZSIsaW5wdXQ6dSxpbnN0OnR9KSxzO3MudmFsdWU9e307Y29uc3QgbD1bXSxnPWEuc2hhcGU7Zm9yKGNvbnN0IHYgb2YgYS5rZXlzKXtjb25zdCAkPWdbdl0seT0kLl96b2Qub3B0aW49PT0ib3B0aW9uYWwiLEg9JC5fem9kLm9wdG91dD09PSJvcHRpb25hbCIsTD0kLl96b2QucnVuKHt2YWx1ZTp1W3ZdLGlzc3VlczpbXX0sYyk7TCBpbnN0YW5jZW9mIFByb21pc2U/bC5wdXNoKEwudGhlbihNZT0+QW4oTWUscyx2LHUseSxIKSkpOkFuKEwscyx2LHUseSxIKX1yZXR1cm4gaT9YdShsLHUscyxjLG8udmFsdWUsdCk6bC5sZW5ndGg/UHJvbWlzZS5hbGwobCkudGhlbigoKT0+cyk6c319KSxRdT1kKCIkWm9kT2JqZWN0SklUIiwodCxuKT0+e1l1LmluaXQodCxuKTtjb25zdCByPXQuX3pvZC5wYXJzZSxvPVR0KCgpPT5HdShuKSksZT12PT57Y29uc3QgJD1uZXcgbHUoWyJzaGFwZSIsInBheWxvYWQiLCJjdHgiXSkseT1vLnZhbHVlLEg9Vz0+e2NvbnN0IE09c2koVyk7cmV0dXJuYHNoYXBlWyR7TX1dLl96b2QucnVuKHsgdmFsdWU6IGlucHV0WyR7TX1dLCBpc3N1ZXM6IFtdIH0sIGN0eClgfTskLndyaXRlKCJjb25zdCBpbnB1dCA9IHBheWxvYWQudmFsdWU7Iik7Y29uc3QgTD1PYmplY3QuY3JlYXRlKG51bGwpO2xldCBNZT0wO2Zvcihjb25zdCBXIG9mIHkua2V5cylMW1ddPWBrZXlfJHtNZSsrfWA7JC53cml0ZSgiY29uc3QgbmV3UmVzdWx0ID0ge307Iik7Zm9yKGNvbnN0IFcgb2YgeS5rZXlzKXtjb25zdCBNPUxbV10sWD1zaShXKSxscz12W1ddLGRzPWxzPy5fem9kPy5vcHRpbj09PSJvcHRpb25hbCIsWm09bHM/Ll96b2Q/Lm9wdG91dD09PSJvcHRpb25hbCI7JC53cml0ZShgY29uc3QgJHtNfSA9ICR7SChXKX07YCksZHMmJlptPyQud3JpdGUoYAogICAgICAgIGlmICgke019Lmlzc3Vlcy5sZW5ndGgpIHsKICAgICAgICAgIGlmICgke1h9IGluIGlucHV0KSB7CiAgICAgICAgICAgIHBheWxvYWQuaXNzdWVzID0gcGF5bG9hZC5pc3N1ZXMuY29uY2F0KCR7TX0uaXNzdWVzLm1hcChpc3MgPT4gKHsKICAgICAgICAgICAgICAuLi5pc3MsCiAgICAgICAgICAgICAgcGF0aDogaXNzLnBhdGggPyBbJHtYfSwgLi4uaXNzLnBhdGhdIDogWyR7WH1dCiAgICAgICAgICAgIH0pKSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmICgke019LnZhbHVlID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgIGlmICgke1h9IGluIGlucHV0KSB7CiAgICAgICAgICAgIG5ld1Jlc3VsdFske1h9XSA9IHVuZGVmaW5lZDsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgbmV3UmVzdWx0WyR7WH1dID0gJHtNfS52YWx1ZTsKICAgICAgICB9CiAgICAgICAgCiAgICAgIGApOmRzPyQud3JpdGUoYAogICAgICAgIGlmICgke019Lmlzc3Vlcy5sZW5ndGgpIHsKICAgICAgICAgIHBheWxvYWQuaXNzdWVzID0gcGF5bG9hZC5pc3N1ZXMuY29uY2F0KCR7TX0uaXNzdWVzLm1hcChpc3MgPT4gKHsKICAgICAgICAgICAgLi4uaXNzLAogICAgICAgICAgICBwYXRoOiBpc3MucGF0aCA/IFske1h9LCAuLi5pc3MucGF0aF0gOiBbJHtYfV0KICAgICAgICAgIH0pKSk7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmICgke019LnZhbHVlID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgIGlmICgke1h9IGluIGlucHV0KSB7CiAgICAgICAgICAgIG5ld1Jlc3VsdFske1h9XSA9IHVuZGVmaW5lZDsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgbmV3UmVzdWx0WyR7WH1dID0gJHtNfS52YWx1ZTsKICAgICAgICB9CiAgICAgICAgCiAgICAgIGApOiQud3JpdGUoYAogICAgICAgIGNvbnN0ICR7TX1fcHJlc2VudCA9ICR7WH0gaW4gaW5wdXQ7CiAgICAgICAgaWYgKCR7TX0uaXNzdWVzLmxlbmd0aCkgewogICAgICAgICAgcGF5bG9hZC5pc3N1ZXMgPSBwYXlsb2FkLmlzc3Vlcy5jb25jYXQoJHtNfS5pc3N1ZXMubWFwKGlzcyA9PiAoewogICAgICAgICAgICAuLi5pc3MsCiAgICAgICAgICAgIHBhdGg6IGlzcy5wYXRoID8gWyR7WH0sIC4uLmlzcy5wYXRoXSA6IFske1h9XQogICAgICAgICAgfSkpKTsKICAgICAgICB9CiAgICAgICAgaWYgKCEke019X3ByZXNlbnQgJiYgISR7TX0uaXNzdWVzLmxlbmd0aCkgewogICAgICAgICAgcGF5bG9hZC5pc3N1ZXMucHVzaCh7CiAgICAgICAgICAgIGNvZGU6ICJpbnZhbGlkX3R5cGUiLAogICAgICAgICAgICBleHBlY3RlZDogIm5vbm9wdGlvbmFsIiwKICAgICAgICAgICAgaW5wdXQ6IHVuZGVmaW5lZCwKICAgICAgICAgICAgcGF0aDogWyR7WH1dCiAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIGlmICgke019X3ByZXNlbnQpIHsKICAgICAgICAgIGlmICgke019LnZhbHVlID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgbmV3UmVzdWx0WyR7WH1dID0gdW5kZWZpbmVkOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgbmV3UmVzdWx0WyR7WH1dID0gJHtNfS52YWx1ZTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICBgKX0kLndyaXRlKCJwYXlsb2FkLnZhbHVlID0gbmV3UmVzdWx0OyIpLCQud3JpdGUoInJldHVybiBwYXlsb2FkOyIpO2NvbnN0IEs9JC5jb21waWxlKCk7cmV0dXJuKFcsTSk9PksodixXLE0pfTtsZXQgaTtjb25zdCBhPUplLHM9IXl0LmppdGxlc3MsdT1zJiZCcy52YWx1ZSxsPW4uY2F0Y2hhbGw7bGV0IGc7dC5fem9kLnBhcnNlPSh2LCQpPT57Zz8/KGc9by52YWx1ZSk7Y29uc3QgeT12LnZhbHVlO3JldHVybiBhKHkpP3MmJnUmJiQ/LmFzeW5jPT09ITEmJiQuaml0bGVzcyE9PSEwPyhpfHwoaT1lKG4uc2hhcGUpKSx2PWkodiwkKSxsP1h1KFtdLHksdiwkLGcsdCk6dik6cih2LCQpOih2Lmlzc3Vlcy5wdXNoKHtleHBlY3RlZDoib2JqZWN0Iixjb2RlOiJpbnZhbGlkX3R5cGUiLGlucHV0OnksaW5zdDp0fSksdil9fSk7ZnVuY3Rpb24gaHModCxuLHIsbyl7Zm9yKGNvbnN0IGkgb2YgdClpZihpLmlzc3Vlcy5sZW5ndGg9PT0wKXJldHVybiBuLnZhbHVlPWkudmFsdWUsbjtjb25zdCBlPXQuZmlsdGVyKGk9PiFVZShpKSk7cmV0dXJuIGUubGVuZ3RoPT09MT8obi52YWx1ZT1lWzBdLnZhbHVlLGVbMF0pOihuLmlzc3Vlcy5wdXNoKHtjb2RlOiJpbnZhbGlkX3VuaW9uIixpbnB1dDpuLnZhbHVlLGluc3Q6cixlcnJvcnM6dC5tYXAoaT0+aS5pc3N1ZXMubWFwKGE9PmxlKGEsbyxWKCkpKSl9KSxuKX1jb25zdCBlcj1kKCIkWm9kVW5pb24iLCh0LG4pPT57eC5pbml0KHQsbiksTyh0Ll96b2QsIm9wdGluIiwoKT0+bi5vcHRpb25zLnNvbWUobz0+by5fem9kLm9wdGluPT09Im9wdGlvbmFsIik/Im9wdGlvbmFsIjp2b2lkIDApLE8odC5fem9kLCJvcHRvdXQiLCgpPT5uLm9wdGlvbnMuc29tZShvPT5vLl96b2Qub3B0b3V0PT09Im9wdGlvbmFsIik/Im9wdGlvbmFsIjp2b2lkIDApLE8odC5fem9kLCJ2YWx1ZXMiLCgpPT57aWYobi5vcHRpb25zLmV2ZXJ5KG89Pm8uX3pvZC52YWx1ZXMpKXJldHVybiBuZXcgU2V0KG4ub3B0aW9ucy5mbGF0TWFwKG89PkFycmF5LmZyb20oby5fem9kLnZhbHVlcykpKX0pLE8odC5fem9kLCJwYXR0ZXJuIiwoKT0+e2lmKG4ub3B0aW9ucy5ldmVyeShvPT5vLl96b2QucGF0dGVybikpe2NvbnN0IG89bi5vcHRpb25zLm1hcChlPT5lLl96b2QucGF0dGVybik7cmV0dXJuIG5ldyBSZWdFeHAoYF4oJHtvLm1hcChlPT5CbihlLnNvdXJjZSkpLmpvaW4oInwiKX0pJGApfX0pO2NvbnN0IHI9bi5vcHRpb25zLmxlbmd0aD09PTE/bi5vcHRpb25zWzBdLl96b2QucnVuOm51bGw7dC5fem9kLnBhcnNlPShvLGUpPT57aWYocilyZXR1cm4gcihvLGUpO2xldCBpPSExO2NvbnN0IGE9W107Zm9yKGNvbnN0IHMgb2Ygbi5vcHRpb25zKXtjb25zdCBjPXMuX3pvZC5ydW4oe3ZhbHVlOm8udmFsdWUsaXNzdWVzOltdfSxlKTtpZihjIGluc3RhbmNlb2YgUHJvbWlzZSlhLnB1c2goYyksaT0hMDtlbHNle2lmKGMuaXNzdWVzLmxlbmd0aD09PTApcmV0dXJuIGM7YS5wdXNoKGMpfX1yZXR1cm4gaT9Qcm9taXNlLmFsbChhKS50aGVuKHM9PmhzKHMsbyx0LGUpKTpocyhhLG8sdCxlKX19KTtmdW5jdGlvbiAkcyh0LG4scixvKXtjb25zdCBlPXQuZmlsdGVyKGk9PmkuaXNzdWVzLmxlbmd0aD09PTApO3JldHVybiBlLmxlbmd0aD09PTE/KG4udmFsdWU9ZVswXS52YWx1ZSxuKTooZS5sZW5ndGg9PT0wP24uaXNzdWVzLnB1c2goe2NvZGU6ImludmFsaWRfdW5pb24iLGlucHV0Om4udmFsdWUsaW5zdDpyLGVycm9yczp0Lm1hcChpPT5pLmlzc3Vlcy5tYXAoYT0+bGUoYSxvLFYoKSkpKX0pOm4uaXNzdWVzLnB1c2goe2NvZGU6ImludmFsaWRfdW5pb24iLGlucHV0Om4udmFsdWUsaW5zdDpyLGVycm9yczpbXSxpbmNsdXNpdmU6ITF9KSxuKX1jb25zdCBlbD1kKCIkWm9kWG9yIiwodCxuKT0+e2VyLmluaXQodCxuKSxuLmluY2x1c2l2ZT0hMTtjb25zdCByPW4ub3B0aW9ucy5sZW5ndGg9PT0xP24ub3B0aW9uc1swXS5fem9kLnJ1bjpudWxsO3QuX3pvZC5wYXJzZT0obyxlKT0+e2lmKHIpcmV0dXJuIHIobyxlKTtsZXQgaT0hMTtjb25zdCBhPVtdO2Zvcihjb25zdCBzIG9mIG4ub3B0aW9ucyl7Y29uc3QgYz1zLl96b2QucnVuKHt2YWx1ZTpvLnZhbHVlLGlzc3VlczpbXX0sZSk7YyBpbnN0YW5jZW9mIFByb21pc2U/KGEucHVzaChjKSxpPSEwKTphLnB1c2goYyl9cmV0dXJuIGk/UHJvbWlzZS5hbGwoYSkudGhlbihzPT4kcyhzLG8sdCxlKSk6JHMoYSxvLHQsZSl9fSksdGw9ZCgiJFpvZERpc2NyaW1pbmF0ZWRVbmlvbiIsKHQsbik9PntuLmluY2x1c2l2ZT0hMSxlci5pbml0KHQsbik7Y29uc3Qgcj10Ll96b2QucGFyc2U7Tyh0Ll96b2QsInByb3BWYWx1ZXMiLCgpPT57Y29uc3QgZT17fTtmb3IoY29uc3QgaSBvZiBuLm9wdGlvbnMpe2NvbnN0IGE9aS5fem9kLnByb3BWYWx1ZXM7aWYoIWF8fE9iamVjdC5rZXlzKGEpLmxlbmd0aD09PTApdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGRpc2NyaW1pbmF0ZWQgdW5pb24gb3B0aW9uIGF0IGluZGV4ICIke24ub3B0aW9ucy5pbmRleE9mKGkpfSJgKTtmb3IoY29uc3RbcyxjXW9mIE9iamVjdC5lbnRyaWVzKGEpKXtlW3NdfHwoZVtzXT1uZXcgU2V0KTtmb3IoY29uc3QgdSBvZiBjKWVbc10uYWRkKHUpfX1yZXR1cm4gZX0pO2NvbnN0IG89VHQoKCk9Pntjb25zdCBlPW4ub3B0aW9ucyxpPW5ldyBNYXA7Zm9yKGNvbnN0IGEgb2YgZSl7Y29uc3Qgcz1hLl96b2QucHJvcFZhbHVlcz8uW24uZGlzY3JpbWluYXRvcl07aWYoIXN8fHMuc2l6ZT09PTApdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGRpc2NyaW1pbmF0ZWQgdW5pb24gb3B0aW9uIGF0IGluZGV4ICIke24ub3B0aW9ucy5pbmRleE9mKGEpfSJgKTtmb3IoY29uc3QgYyBvZiBzKXtpZihpLmhhcyhjKSl0aHJvdyBuZXcgRXJyb3IoYER1cGxpY2F0ZSBkaXNjcmltaW5hdG9yIHZhbHVlICIke1N0cmluZyhjKX0iYCk7aS5zZXQoYyxhKX19cmV0dXJuIGl9KTt0Ll96b2QucGFyc2U9KGUsaSk9Pntjb25zdCBhPWUudmFsdWU7aWYoIUplKGEpKXJldHVybiBlLmlzc3Vlcy5wdXNoKHtjb2RlOiJpbnZhbGlkX3R5cGUiLGV4cGVjdGVkOiJvYmplY3QiLGlucHV0OmEsaW5zdDp0fSksZTtjb25zdCBzPW8udmFsdWUuZ2V0KGE/LltuLmRpc2NyaW1pbmF0b3JdKTtyZXR1cm4gcz9zLl96b2QucnVuKGUsaSk6bi51bmlvbkZhbGxiYWNrfHxpLmRpcmVjdGlvbj09PSJiYWNrd2FyZCI/cihlLGkpOihlLmlzc3Vlcy5wdXNoKHtjb2RlOiJpbnZhbGlkX3VuaW9uIixlcnJvcnM6W10sbm90ZToiTm8gbWF0Y2hpbmcgZGlzY3JpbWluYXRvciIsZGlzY3JpbWluYXRvcjpuLmRpc2NyaW1pbmF0b3Isb3B0aW9uczpBcnJheS5mcm9tKG8udmFsdWUua2V5cygpKSxpbnB1dDphLHBhdGg6W24uZGlzY3JpbWluYXRvcl0saW5zdDp0fSksZSl9fSksbmw9ZCgiJFpvZEludGVyc2VjdGlvbiIsKHQsbik9Pnt4LmluaXQodCxuKSx0Ll96b2QucGFyc2U9KHIsbyk9Pntjb25zdCBlPXIudmFsdWUsaT1uLmxlZnQuX3pvZC5ydW4oe3ZhbHVlOmUsaXNzdWVzOltdfSxvKSxhPW4ucmlnaHQuX3pvZC5ydW4oe3ZhbHVlOmUsaXNzdWVzOltdfSxvKTtyZXR1cm4gaSBpbnN0YW5jZW9mIFByb21pc2V8fGEgaW5zdGFuY2VvZiBQcm9taXNlP1Byb21pc2UuYWxsKFtpLGFdKS50aGVuKChbYyx1XSk9Pl9zKHIsYyx1KSk6X3MocixpLGEpfX0pO2Z1bmN0aW9uIGxpKHQsbil7aWYodD09PW4pcmV0dXJue3ZhbGlkOiEwLGRhdGE6dH07aWYodCBpbnN0YW5jZW9mIERhdGUmJm4gaW5zdGFuY2VvZiBEYXRlJiYrdD09K24pcmV0dXJue3ZhbGlkOiEwLGRhdGE6dH07aWYoTmUodCkmJk5lKG4pKXtjb25zdCByPU9iamVjdC5rZXlzKG4pLG89T2JqZWN0LmtleXModCkuZmlsdGVyKGk9PnIuaW5kZXhPZihpKSE9PS0xKSxlPXsuLi50LC4uLm59O2Zvcihjb25zdCBpIG9mIG8pe2NvbnN0IGE9bGkodFtpXSxuW2ldKTtpZighYS52YWxpZClyZXR1cm57dmFsaWQ6ITEsbWVyZ2VFcnJvclBhdGg6W2ksLi4uYS5tZXJnZUVycm9yUGF0aF19O2VbaV09YS5kYXRhfXJldHVybnt2YWxpZDohMCxkYXRhOmV9fWlmKEFycmF5LmlzQXJyYXkodCkmJkFycmF5LmlzQXJyYXkobikpe2lmKHQubGVuZ3RoIT09bi5sZW5ndGgpcmV0dXJue3ZhbGlkOiExLG1lcmdlRXJyb3JQYXRoOltdfTtjb25zdCByPVtdO2ZvcihsZXQgbz0wO288dC5sZW5ndGg7bysrKXtjb25zdCBlPXRbb10saT1uW29dLGE9bGkoZSxpKTtpZighYS52YWxpZClyZXR1cm57dmFsaWQ6ITEsbWVyZ2VFcnJvclBhdGg6W28sLi4uYS5tZXJnZUVycm9yUGF0aF19O3IucHVzaChhLmRhdGEpfXJldHVybnt2YWxpZDohMCxkYXRhOnJ9fXJldHVybnt2YWxpZDohMSxtZXJnZUVycm9yUGF0aDpbXX19ZnVuY3Rpb24gX3ModCxuLHIpe2NvbnN0IG89bmV3IE1hcDtsZXQgZTtmb3IoY29uc3QgcyBvZiBuLmlzc3VlcylpZihzLmNvZGU9PT0idW5yZWNvZ25pemVkX2tleXMiKXtlPz8oZT1zKTtmb3IoY29uc3QgYyBvZiBzLmtleXMpby5oYXMoYyl8fG8uc2V0KGMse30pLG8uZ2V0KGMpLmw9ITB9ZWxzZSB0Lmlzc3Vlcy5wdXNoKHMpO2Zvcihjb25zdCBzIG9mIHIuaXNzdWVzKWlmKHMuY29kZT09PSJ1bnJlY29nbml6ZWRfa2V5cyIpZm9yKGNvbnN0IGMgb2Ygcy5rZXlzKW8uaGFzKGMpfHxvLnNldChjLHt9KSxvLmdldChjKS5yPSEwO2Vsc2UgdC5pc3N1ZXMucHVzaChzKTtjb25zdCBpPVsuLi5vXS5maWx0ZXIoKFssc10pPT5zLmwmJnMucikubWFwKChbc10pPT5zKTtpZihpLmxlbmd0aCYmZSYmdC5pc3N1ZXMucHVzaCh7Li4uZSxrZXlzOml9KSxVZSh0KSlyZXR1cm4gdDtjb25zdCBhPWxpKG4udmFsdWUsci52YWx1ZSk7aWYoIWEudmFsaWQpdGhyb3cgbmV3IEVycm9yKGBVbm1lcmdhYmxlIGludGVyc2VjdGlvbi4gRXJyb3IgcGF0aDogJHtKU09OLnN0cmluZ2lmeShhLm1lcmdlRXJyb3JQYXRoKX1gKTtyZXR1cm4gdC52YWx1ZT1hLmRhdGEsdH1jb25zdCBMaT1kKCIkWm9kVHVwbGUiLCh0LG4pPT57eC5pbml0KHQsbik7Y29uc3Qgcj1uLml0ZW1zO3QuX3pvZC5wYXJzZT0obyxlKT0+e2NvbnN0IGk9by52YWx1ZTtpZighQXJyYXkuaXNBcnJheShpKSlyZXR1cm4gby5pc3N1ZXMucHVzaCh7aW5wdXQ6aSxpbnN0OnQsZXhwZWN0ZWQ6InR1cGxlIixjb2RlOiJpbnZhbGlkX3R5cGUifSksbztvLnZhbHVlPVtdO2NvbnN0IGE9W10scz1icyhyLCJvcHRpbiIpLGM9YnMociwib3B0b3V0Iik7aWYoIW4ucmVzdCl7aWYoaS5sZW5ndGg8cylyZXR1cm4gby5pc3N1ZXMucHVzaCh7Y29kZToidG9vX3NtYWxsIixtaW5pbXVtOnMsaW5jbHVzaXZlOiEwLGlucHV0OmksaW5zdDp0LG9yaWdpbjoiYXJyYXkifSksbztpLmxlbmd0aD5yLmxlbmd0aCYmby5pc3N1ZXMucHVzaCh7Y29kZToidG9vX2JpZyIsbWF4aW11bTpyLmxlbmd0aCxpbmNsdXNpdmU6ITAsaW5wdXQ6aSxpbnN0OnQsb3JpZ2luOiJhcnJheSJ9KX1jb25zdCB1PW5ldyBBcnJheShyLmxlbmd0aCk7Zm9yKGxldCBsPTA7bDxyLmxlbmd0aDtsKyspe2NvbnN0IGc9cltsXS5fem9kLnJ1bih7dmFsdWU6aVtsXSxpc3N1ZXM6W119LGUpO2cgaW5zdGFuY2VvZiBQcm9taXNlP2EucHVzaChnLnRoZW4odj0+e3VbbF09dn0pKTp1W2xdPWd9aWYobi5yZXN0KXtsZXQgbD1yLmxlbmd0aC0xO2NvbnN0IGc9aS5zbGljZShyLmxlbmd0aCk7Zm9yKGNvbnN0IHYgb2YgZyl7bCsrO2NvbnN0ICQ9bi5yZXN0Ll96b2QucnVuKHt2YWx1ZTp2LGlzc3VlczpbXX0sZSk7JCBpbnN0YW5jZW9mIFByb21pc2U/YS5wdXNoKCQudGhlbih5PT55cyh5LG8sbCkpKTp5cygkLG8sbCl9fXJldHVybiBhLmxlbmd0aD9Qcm9taXNlLmFsbChhKS50aGVuKCgpPT5rcyh1LG8scixpLGMpKTprcyh1LG8scixpLGMpfX0pO2Z1bmN0aW9uIGJzKHQsbil7Zm9yKGxldCByPXQubGVuZ3RoLTE7cj49MDtyLS0paWYodFtyXS5fem9kW25dIT09Im9wdGlvbmFsIilyZXR1cm4gcisxO3JldHVybiAwfWZ1bmN0aW9uIHlzKHQsbixyKXt0Lmlzc3Vlcy5sZW5ndGgmJm4uaXNzdWVzLnB1c2goLi4uZmUocix0Lmlzc3VlcykpLG4udmFsdWVbcl09dC52YWx1ZX1mdW5jdGlvbiBrcyh0LG4scixvLGUpe2ZvcihsZXQgaT0wO2k8ci5sZW5ndGg7aSsrKXtjb25zdCBhPXRbaV0scz1pPG8ubGVuZ3RoO2lmKGEuaXNzdWVzLmxlbmd0aCl7aWYoIXMmJmk+PWUpe24udmFsdWUubGVuZ3RoPWk7YnJlYWt9bi5pc3N1ZXMucHVzaCguLi5mZShpLGEuaXNzdWVzKSl9bi52YWx1ZVtpXT1hLnZhbHVlfWZvcihsZXQgaT1uLnZhbHVlLmxlbmd0aC0xO2k+PW8ubGVuZ3RoJiYocltpXS5fem9kLm9wdG91dD09PSJvcHRpb25hbCImJm4udmFsdWVbaV09PT12b2lkIDApO2ktLSluLnZhbHVlLmxlbmd0aD1pO3JldHVybiBufWNvbnN0IHJsPWQoIiRab2RSZWNvcmQiLCh0LG4pPT57eC5pbml0KHQsbiksdC5fem9kLnBhcnNlPShyLG8pPT57Y29uc3QgZT1yLnZhbHVlO2lmKCFOZShlKSlyZXR1cm4gci5pc3N1ZXMucHVzaCh7ZXhwZWN0ZWQ6InJlY29yZCIsY29kZToiaW52YWxpZF90eXBlIixpbnB1dDplLGluc3Q6dH0pLHI7Y29uc3QgaT1bXSxhPW4ua2V5VHlwZS5fem9kLnZhbHVlcztpZihhKXtyLnZhbHVlPXt9O2NvbnN0IHM9bmV3IFNldDtmb3IoY29uc3QgdSBvZiBhKWlmKHR5cGVvZiB1PT0ic3RyaW5nInx8dHlwZW9mIHU9PSJudW1iZXIifHx0eXBlb2YgdT09InN5bWJvbCIpe3MuYWRkKHR5cGVvZiB1PT0ibnVtYmVyIj91LnRvU3RyaW5nKCk6dSk7Y29uc3QgbD1uLmtleVR5cGUuX3pvZC5ydW4oe3ZhbHVlOnUsaXNzdWVzOltdfSxvKTtpZihsIGluc3RhbmNlb2YgUHJvbWlzZSl0aHJvdyBuZXcgRXJyb3IoIkFzeW5jIHNjaGVtYXMgbm90IHN1cHBvcnRlZCBpbiBvYmplY3Qga2V5cyBjdXJyZW50bHkiKTtpZihsLmlzc3Vlcy5sZW5ndGgpe3IuaXNzdWVzLnB1c2goe2NvZGU6ImludmFsaWRfa2V5IixvcmlnaW46InJlY29yZCIsaXNzdWVzOmwuaXNzdWVzLm1hcCgkPT5sZSgkLG8sVigpKSksaW5wdXQ6dSxwYXRoOlt1XSxpbnN0OnR9KTtjb250aW51ZX1jb25zdCBnPWwudmFsdWUsdj1uLnZhbHVlVHlwZS5fem9kLnJ1bih7dmFsdWU6ZVt1XSxpc3N1ZXM6W119LG8pO3YgaW5zdGFuY2VvZiBQcm9taXNlP2kucHVzaCh2LnRoZW4oJD0+eyQuaXNzdWVzLmxlbmd0aCYmci5pc3N1ZXMucHVzaCguLi5mZSh1LCQuaXNzdWVzKSksci52YWx1ZVtnXT0kLnZhbHVlfSkpOih2Lmlzc3Vlcy5sZW5ndGgmJnIuaXNzdWVzLnB1c2goLi4uZmUodSx2Lmlzc3VlcykpLHIudmFsdWVbZ109di52YWx1ZSl9bGV0IGM7Zm9yKGNvbnN0IHUgaW4gZSlzLmhhcyh1KXx8KGM9Yz8/W10sYy5wdXNoKHUpKTtjJiZjLmxlbmd0aD4wJiZyLmlzc3Vlcy5wdXNoKHtjb2RlOiJ1bnJlY29nbml6ZWRfa2V5cyIsaW5wdXQ6ZSxpbnN0OnQsa2V5czpjfSl9ZWxzZXtyLnZhbHVlPXt9O2Zvcihjb25zdCBzIG9mIFJlZmxlY3Qub3duS2V5cyhlKSl7aWYocz09PSJfX3Byb3RvX18ifHwhT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKGUscykpY29udGludWU7bGV0IGM9bi5rZXlUeXBlLl96b2QucnVuKHt2YWx1ZTpzLGlzc3VlczpbXX0sbyk7aWYoYyBpbnN0YW5jZW9mIFByb21pc2UpdGhyb3cgbmV3IEVycm9yKCJBc3luYyBzY2hlbWFzIG5vdCBzdXBwb3J0ZWQgaW4gb2JqZWN0IGtleXMgY3VycmVudGx5Iik7aWYodHlwZW9mIHM9PSJzdHJpbmciJiZOaS50ZXN0KHMpJiZjLmlzc3Vlcy5sZW5ndGgpe2NvbnN0IGc9bi5rZXlUeXBlLl96b2QucnVuKHt2YWx1ZTpOdW1iZXIocyksaXNzdWVzOltdfSxvKTtpZihnIGluc3RhbmNlb2YgUHJvbWlzZSl0aHJvdyBuZXcgRXJyb3IoIkFzeW5jIHNjaGVtYXMgbm90IHN1cHBvcnRlZCBpbiBvYmplY3Qga2V5cyBjdXJyZW50bHkiKTtnLmlzc3Vlcy5sZW5ndGg9PT0wJiYoYz1nKX1pZihjLmlzc3Vlcy5sZW5ndGgpe24ubW9kZT09PSJsb29zZSI/ci52YWx1ZVtzXT1lW3NdOnIuaXNzdWVzLnB1c2goe2NvZGU6ImludmFsaWRfa2V5IixvcmlnaW46InJlY29yZCIsaXNzdWVzOmMuaXNzdWVzLm1hcChnPT5sZShnLG8sVigpKSksaW5wdXQ6cyxwYXRoOltzXSxpbnN0OnR9KTtjb250aW51ZX1jb25zdCBsPW4udmFsdWVUeXBlLl96b2QucnVuKHt2YWx1ZTplW3NdLGlzc3VlczpbXX0sbyk7bCBpbnN0YW5jZW9mIFByb21pc2U/aS5wdXNoKGwudGhlbihnPT57Zy5pc3N1ZXMubGVuZ3RoJiZyLmlzc3Vlcy5wdXNoKC4uLmZlKHMsZy5pc3N1ZXMpKSxyLnZhbHVlW2MudmFsdWVdPWcudmFsdWV9KSk6KGwuaXNzdWVzLmxlbmd0aCYmci5pc3N1ZXMucHVzaCguLi5mZShzLGwuaXNzdWVzKSksci52YWx1ZVtjLnZhbHVlXT1sLnZhbHVlKX19cmV0dXJuIGkubGVuZ3RoP1Byb21pc2UuYWxsKGkpLnRoZW4oKCk9PnIpOnJ9fSksaWw9ZCgiJFpvZE1hcCIsKHQsbik9Pnt4LmluaXQodCxuKSx0Ll96b2QucGFyc2U9KHIsbyk9Pntjb25zdCBlPXIudmFsdWU7aWYoIShlIGluc3RhbmNlb2YgTWFwKSlyZXR1cm4gci5pc3N1ZXMucHVzaCh7ZXhwZWN0ZWQ6Im1hcCIsY29kZToiaW52YWxpZF90eXBlIixpbnB1dDplLGluc3Q6dH0pLHI7Y29uc3QgaT1bXTtyLnZhbHVlPW5ldyBNYXA7Zm9yKGNvbnN0W2Esc11vZiBlKXtjb25zdCBjPW4ua2V5VHlwZS5fem9kLnJ1bih7dmFsdWU6YSxpc3N1ZXM6W119LG8pLHU9bi52YWx1ZVR5cGUuX3pvZC5ydW4oe3ZhbHVlOnMsaXNzdWVzOltdfSxvKTtjIGluc3RhbmNlb2YgUHJvbWlzZXx8dSBpbnN0YW5jZW9mIFByb21pc2U/aS5wdXNoKFByb21pc2UuYWxsKFtjLHVdKS50aGVuKChbbCxnXSk9PntTcyhsLGcscixhLGUsdCxvKX0pKTpTcyhjLHUscixhLGUsdCxvKX1yZXR1cm4gaS5sZW5ndGg/UHJvbWlzZS5hbGwoaSkudGhlbigoKT0+cik6cn19KTtmdW5jdGlvbiBTcyh0LG4scixvLGUsaSxhKXt0Lmlzc3Vlcy5sZW5ndGgmJihDbi5oYXModHlwZW9mIG8pP3IuaXNzdWVzLnB1c2goLi4uZmUobyx0Lmlzc3VlcykpOnIuaXNzdWVzLnB1c2goe2NvZGU6ImludmFsaWRfa2V5IixvcmlnaW46Im1hcCIsaW5wdXQ6ZSxpbnN0OmksaXNzdWVzOnQuaXNzdWVzLm1hcChzPT5sZShzLGEsVigpKSl9KSksbi5pc3N1ZXMubGVuZ3RoJiYoQ24uaGFzKHR5cGVvZiBvKT9yLmlzc3Vlcy5wdXNoKC4uLmZlKG8sbi5pc3N1ZXMpKTpyLmlzc3Vlcy5wdXNoKHtvcmlnaW46Im1hcCIsY29kZToiaW52YWxpZF9lbGVtZW50IixpbnB1dDplLGluc3Q6aSxrZXk6byxpc3N1ZXM6bi5pc3N1ZXMubWFwKHM9PmxlKHMsYSxWKCkpKX0pKSxyLnZhbHVlLnNldCh0LnZhbHVlLG4udmFsdWUpfWNvbnN0IG9sPWQoIiRab2RTZXQiLCh0LG4pPT57eC5pbml0KHQsbiksdC5fem9kLnBhcnNlPShyLG8pPT57Y29uc3QgZT1yLnZhbHVlO2lmKCEoZSBpbnN0YW5jZW9mIFNldCkpcmV0dXJuIHIuaXNzdWVzLnB1c2goe2lucHV0OmUsaW5zdDp0LGV4cGVjdGVkOiJzZXQiLGNvZGU6ImludmFsaWRfdHlwZSJ9KSxyO2NvbnN0IGk9W107ci52YWx1ZT1uZXcgU2V0O2Zvcihjb25zdCBhIG9mIGUpe2NvbnN0IHM9bi52YWx1ZVR5cGUuX3pvZC5ydW4oe3ZhbHVlOmEsaXNzdWVzOltdfSxvKTtzIGluc3RhbmNlb2YgUHJvbWlzZT9pLnB1c2gocy50aGVuKGM9PndzKGMscikpKTp3cyhzLHIpfXJldHVybiBpLmxlbmd0aD9Qcm9taXNlLmFsbChpKS50aGVuKCgpPT5yKTpyfX0pO2Z1bmN0aW9uIHdzKHQsbil7dC5pc3N1ZXMubGVuZ3RoJiZuLmlzc3Vlcy5wdXNoKC4uLnQuaXNzdWVzKSxuLnZhbHVlLmFkZCh0LnZhbHVlKX1jb25zdCBhbD1kKCIkWm9kRW51bSIsKHQsbik9Pnt4LmluaXQodCxuKTtjb25zdCByPXZpKG4uZW50cmllcyksbz1uZXcgU2V0KHIpO3QuX3pvZC52YWx1ZXM9byx0Ll96b2QucGF0dGVybj1uZXcgUmVnRXhwKGBeKCR7ci5maWx0ZXIoZT0+Q24uaGFzKHR5cGVvZiBlKSkubWFwKGU9PnR5cGVvZiBlPT0ic3RyaW5nIj9iZShlKTplLnRvU3RyaW5nKCkpLmpvaW4oInwiKX0pJGApLHQuX3pvZC5wYXJzZT0oZSxpKT0+e2NvbnN0IGE9ZS52YWx1ZTtyZXR1cm4gby5oYXMoYSl8fGUuaXNzdWVzLnB1c2goe2NvZGU6ImludmFsaWRfdmFsdWUiLHZhbHVlczpyLGlucHV0OmEsaW5zdDp0fSksZX19KSxzbD1kKCIkWm9kTGl0ZXJhbCIsKHQsbik9PntpZih4LmluaXQodCxuKSxuLnZhbHVlcy5sZW5ndGg9PT0wKXRocm93IG5ldyBFcnJvcigiQ2Fubm90IGNyZWF0ZSBsaXRlcmFsIHNjaGVtYSB3aXRoIG5vIHZhbGlkIHZhbHVlcyIpO2NvbnN0IHI9bmV3IFNldChuLnZhbHVlcyk7dC5fem9kLnZhbHVlcz1yLHQuX3pvZC5wYXR0ZXJuPW5ldyBSZWdFeHAoYF4oJHtuLnZhbHVlcy5tYXAobz0+dHlwZW9mIG89PSJzdHJpbmciP2JlKG8pOm8/YmUoby50b1N0cmluZygpKTpTdHJpbmcobykpLmpvaW4oInwiKX0pJGApLHQuX3pvZC5wYXJzZT0obyxlKT0+e2NvbnN0IGk9by52YWx1ZTtyZXR1cm4gci5oYXMoaSl8fG8uaXNzdWVzLnB1c2goe2NvZGU6ImludmFsaWRfdmFsdWUiLHZhbHVlczpuLnZhbHVlcyxpbnB1dDppLGluc3Q6dH0pLG99fSksY2w9ZCgiJFpvZEZpbGUiLCh0LG4pPT57eC5pbml0KHQsbiksdC5fem9kLnBhcnNlPShyLG8pPT57Y29uc3QgZT1yLnZhbHVlO3JldHVybiBlIGluc3RhbmNlb2YgRmlsZXx8ci5pc3N1ZXMucHVzaCh7ZXhwZWN0ZWQ6ImZpbGUiLGNvZGU6ImludmFsaWRfdHlwZSIsaW5wdXQ6ZSxpbnN0OnR9KSxyfX0pLHVsPWQoIiRab2RUcmFuc2Zvcm0iLCh0LG4pPT57eC5pbml0KHQsbiksdC5fem9kLm9wdGluPSJvcHRpb25hbCIsdC5fem9kLnBhcnNlPShyLG8pPT57aWYoby5kaXJlY3Rpb249PT0iYmFja3dhcmQiKXRocm93IG5ldyBXbih0LmNvbnN0cnVjdG9yLm5hbWUpO2NvbnN0IGU9bi50cmFuc2Zvcm0oci52YWx1ZSxyKTtpZihvLmFzeW5jKXJldHVybihlIGluc3RhbmNlb2YgUHJvbWlzZT9lOlByb21pc2UucmVzb2x2ZShlKSkudGhlbihhPT4oci52YWx1ZT1hLHIuZmFsbGJhY2s9ITAscikpO2lmKGUgaW5zdGFuY2VvZiBQcm9taXNlKXRocm93IG5ldyBQZTtyZXR1cm4gci52YWx1ZT1lLHIuZmFsbGJhY2s9ITAscn19KTtmdW5jdGlvbiBJcyh0LG4pe3JldHVybiBuPT09dm9pZCAwJiYodC5pc3N1ZXMubGVuZ3RofHx0LmZhbGxiYWNrKT97aXNzdWVzOltdLHZhbHVlOnZvaWQgMH06dH1jb25zdCBNaT1kKCIkWm9kT3B0aW9uYWwiLCh0LG4pPT57eC5pbml0KHQsbiksdC5fem9kLm9wdGluPSJvcHRpb25hbCIsdC5fem9kLm9wdG91dD0ib3B0aW9uYWwiLE8odC5fem9kLCJ2YWx1ZXMiLCgpPT5uLmlubmVyVHlwZS5fem9kLnZhbHVlcz9uZXcgU2V0KFsuLi5uLmlubmVyVHlwZS5fem9kLnZhbHVlcyx2b2lkIDBdKTp2b2lkIDApLE8odC5fem9kLCJwYXR0ZXJuIiwoKT0+e2NvbnN0IHI9bi5pbm5lclR5cGUuX3pvZC5wYXR0ZXJuO3JldHVybiByP25ldyBSZWdFeHAoYF4oJHtCbihyLnNvdXJjZSl9KT8kYCk6dm9pZCAwfSksdC5fem9kLnBhcnNlPShyLG8pPT57aWYobi5pbm5lclR5cGUuX3pvZC5vcHRpbj09PSJvcHRpb25hbCIpe2NvbnN0IGU9ci52YWx1ZSxpPW4uaW5uZXJUeXBlLl96b2QucnVuKHIsbyk7cmV0dXJuIGkgaW5zdGFuY2VvZiBQcm9taXNlP2kudGhlbihhPT5JcyhhLGUpKTpJcyhpLGUpfXJldHVybiByLnZhbHVlPT09dm9pZCAwP3I6bi5pbm5lclR5cGUuX3pvZC5ydW4ocixvKX19KSxsbD1kKCIkWm9kRXhhY3RPcHRpb25hbCIsKHQsbik9PntNaS5pbml0KHQsbiksTyh0Ll96b2QsInZhbHVlcyIsKCk9Pm4uaW5uZXJUeXBlLl96b2QudmFsdWVzKSxPKHQuX3pvZCwicGF0dGVybiIsKCk9Pm4uaW5uZXJUeXBlLl96b2QucGF0dGVybiksdC5fem9kLnBhcnNlPShyLG8pPT5uLmlubmVyVHlwZS5fem9kLnJ1bihyLG8pfSksZGw9ZCgiJFpvZE51bGxhYmxlIiwodCxuKT0+e3guaW5pdCh0LG4pLE8odC5fem9kLCJvcHRpbiIsKCk9Pm4uaW5uZXJUeXBlLl96b2Qub3B0aW4pLE8odC5fem9kLCJvcHRvdXQiLCgpPT5uLmlubmVyVHlwZS5fem9kLm9wdG91dCksTyh0Ll96b2QsInBhdHRlcm4iLCgpPT57Y29uc3Qgcj1uLmlubmVyVHlwZS5fem9kLnBhdHRlcm47cmV0dXJuIHI/bmV3IFJlZ0V4cChgXigke0JuKHIuc291cmNlKX18bnVsbCkkYCk6dm9pZCAwfSksTyh0Ll96b2QsInZhbHVlcyIsKCk9Pm4uaW5uZXJUeXBlLl96b2QudmFsdWVzP25ldyBTZXQoWy4uLm4uaW5uZXJUeXBlLl96b2QudmFsdWVzLG51bGxdKTp2b2lkIDApLHQuX3pvZC5wYXJzZT0ocixvKT0+ci52YWx1ZT09PW51bGw/cjpuLmlubmVyVHlwZS5fem9kLnJ1bihyLG8pfSksbWw9ZCgiJFpvZERlZmF1bHQiLCh0LG4pPT57eC5pbml0KHQsbiksdC5fem9kLm9wdGluPSJvcHRpb25hbCIsTyh0Ll96b2QsInZhbHVlcyIsKCk9Pm4uaW5uZXJUeXBlLl96b2QudmFsdWVzKSx0Ll96b2QucGFyc2U9KHIsbyk9PntpZihvLmRpcmVjdGlvbj09PSJiYWNrd2FyZCIpcmV0dXJuIG4uaW5uZXJUeXBlLl96b2QucnVuKHIsbyk7aWYoci52YWx1ZT09PXZvaWQgMClyZXR1cm4gci52YWx1ZT1uLmRlZmF1bHRWYWx1ZSxyO2NvbnN0IGU9bi5pbm5lclR5cGUuX3pvZC5ydW4ocixvKTtyZXR1cm4gZSBpbnN0YW5jZW9mIFByb21pc2U/ZS50aGVuKGk9PnpzKGksbikpOnpzKGUsbil9fSk7ZnVuY3Rpb24genModCxuKXtyZXR1cm4gdC52YWx1ZT09PXZvaWQgMCYmKHQudmFsdWU9bi5kZWZhdWx0VmFsdWUpLHR9Y29uc3QgcGw9ZCgiJFpvZFByZWZhdWx0IiwodCxuKT0+e3guaW5pdCh0LG4pLHQuX3pvZC5vcHRpbj0ib3B0aW9uYWwiLE8odC5fem9kLCJ2YWx1ZXMiLCgpPT5uLmlubmVyVHlwZS5fem9kLnZhbHVlcyksdC5fem9kLnBhcnNlPShyLG8pPT4oby5kaXJlY3Rpb249PT0iYmFja3dhcmQifHxyLnZhbHVlPT09dm9pZCAwJiYoci52YWx1ZT1uLmRlZmF1bHRWYWx1ZSksbi5pbm5lclR5cGUuX3pvZC5ydW4ocixvKSl9KSxmbD1kKCIkWm9kTm9uT3B0aW9uYWwiLCh0LG4pPT57eC5pbml0KHQsbiksTyh0Ll96b2QsInZhbHVlcyIsKCk9Pntjb25zdCByPW4uaW5uZXJUeXBlLl96b2QudmFsdWVzO3JldHVybiByP25ldyBTZXQoWy4uLnJdLmZpbHRlcihvPT5vIT09dm9pZCAwKSk6dm9pZCAwfSksdC5fem9kLnBhcnNlPShyLG8pPT57Y29uc3QgZT1uLmlubmVyVHlwZS5fem9kLnJ1bihyLG8pO3JldHVybiBlIGluc3RhbmNlb2YgUHJvbWlzZT9lLnRoZW4oaT0+eHMoaSx0KSk6eHMoZSx0KX19KTtmdW5jdGlvbiB4cyh0LG4pe3JldHVybiF0Lmlzc3Vlcy5sZW5ndGgmJnQudmFsdWU9PT12b2lkIDAmJnQuaXNzdWVzLnB1c2goe2NvZGU6ImludmFsaWRfdHlwZSIsZXhwZWN0ZWQ6Im5vbm9wdGlvbmFsIixpbnB1dDp0LnZhbHVlLGluc3Q6bn0pLHR9Y29uc3QgZ2w9ZCgiJFpvZFN1Y2Nlc3MiLCh0LG4pPT57eC5pbml0KHQsbiksdC5fem9kLnBhcnNlPShyLG8pPT57aWYoby5kaXJlY3Rpb249PT0iYmFja3dhcmQiKXRocm93IG5ldyBXbigiWm9kU3VjY2VzcyIpO2NvbnN0IGU9bi5pbm5lclR5cGUuX3pvZC5ydW4ocixvKTtyZXR1cm4gZSBpbnN0YW5jZW9mIFByb21pc2U/ZS50aGVuKGk9PihyLnZhbHVlPWkuaXNzdWVzLmxlbmd0aD09PTAscikpOihyLnZhbHVlPWUuaXNzdWVzLmxlbmd0aD09PTAscil9fSksdmw9ZCgiJFpvZENhdGNoIiwodCxuKT0+e3guaW5pdCh0LG4pLHQuX3pvZC5vcHRpbj0ib3B0aW9uYWwiLE8odC5fem9kLCJvcHRvdXQiLCgpPT5uLmlubmVyVHlwZS5fem9kLm9wdG91dCksTyh0Ll96b2QsInZhbHVlcyIsKCk9Pm4uaW5uZXJUeXBlLl96b2QudmFsdWVzKSx0Ll96b2QucGFyc2U9KHIsbyk9PntpZihvLmRpcmVjdGlvbj09PSJiYWNrd2FyZCIpcmV0dXJuIG4uaW5uZXJUeXBlLl96b2QucnVuKHIsbyk7Y29uc3QgZT1uLmlubmVyVHlwZS5fem9kLnJ1bihyLG8pO3JldHVybiBlIGluc3RhbmNlb2YgUHJvbWlzZT9lLnRoZW4oaT0+KHIudmFsdWU9aS52YWx1ZSxpLmlzc3Vlcy5sZW5ndGgmJihyLnZhbHVlPW4uY2F0Y2hWYWx1ZSh7Li4ucixlcnJvcjp7aXNzdWVzOmkuaXNzdWVzLm1hcChhPT5sZShhLG8sVigpKSl9LGlucHV0OnIudmFsdWV9KSxyLmlzc3Vlcz1bXSxyLmZhbGxiYWNrPSEwKSxyKSk6KHIudmFsdWU9ZS52YWx1ZSxlLmlzc3Vlcy5sZW5ndGgmJihyLnZhbHVlPW4uY2F0Y2hWYWx1ZSh7Li4ucixlcnJvcjp7aXNzdWVzOmUuaXNzdWVzLm1hcChpPT5sZShpLG8sVigpKSl9LGlucHV0OnIudmFsdWV9KSxyLmlzc3Vlcz1bXSxyLmZhbGxiYWNrPSEwKSxyKX19KSxobD1kKCIkWm9kTmFOIiwodCxuKT0+e3guaW5pdCh0LG4pLHQuX3pvZC5wYXJzZT0ocixvKT0+KCh0eXBlb2Ygci52YWx1ZSE9Im51bWJlciJ8fCFOdW1iZXIuaXNOYU4oci52YWx1ZSkpJiZyLmlzc3Vlcy5wdXNoKHtpbnB1dDpyLnZhbHVlLGluc3Q6dCxleHBlY3RlZDoibmFuIixjb2RlOiJpbnZhbGlkX3R5cGUifSkscil9KSxxaT1kKCIkWm9kUGlwZSIsKHQsbik9Pnt4LmluaXQodCxuKSxPKHQuX3pvZCwidmFsdWVzIiwoKT0+bi5pbi5fem9kLnZhbHVlcyksTyh0Ll96b2QsIm9wdGluIiwoKT0+bi5pbi5fem9kLm9wdGluKSxPKHQuX3pvZCwib3B0b3V0IiwoKT0+bi5vdXQuX3pvZC5vcHRvdXQpLE8odC5fem9kLCJwcm9wVmFsdWVzIiwoKT0+bi5pbi5fem9kLnByb3BWYWx1ZXMpLHQuX3pvZC5wYXJzZT0ocixvKT0+e2lmKG8uZGlyZWN0aW9uPT09ImJhY2t3YXJkIil7Y29uc3QgaT1uLm91dC5fem9kLnJ1bihyLG8pO3JldHVybiBpIGluc3RhbmNlb2YgUHJvbWlzZT9pLnRoZW4oYT0+Tm4oYSxuLmluLG8pKTpObihpLG4uaW4sbyl9Y29uc3QgZT1uLmluLl96b2QucnVuKHIsbyk7cmV0dXJuIGUgaW5zdGFuY2VvZiBQcm9taXNlP2UudGhlbihpPT5ObihpLG4ub3V0LG8pKTpObihlLG4ub3V0LG8pfX0pO2Z1bmN0aW9uIE5uKHQsbixyKXtyZXR1cm4gdC5pc3N1ZXMubGVuZ3RoPyh0LmFib3J0ZWQ9ITAsdCk6bi5fem9kLnJ1bih7dmFsdWU6dC52YWx1ZSxpc3N1ZXM6dC5pc3N1ZXMsZmFsbGJhY2s6dC5mYWxsYmFja30scil9Y29uc3QgRmk9ZCgiJFpvZENvZGVjIiwodCxuKT0+e3guaW5pdCh0LG4pLE8odC5fem9kLCJ2YWx1ZXMiLCgpPT5uLmluLl96b2QudmFsdWVzKSxPKHQuX3pvZCwib3B0aW4iLCgpPT5uLmluLl96b2Qub3B0aW4pLE8odC5fem9kLCJvcHRvdXQiLCgpPT5uLm91dC5fem9kLm9wdG91dCksTyh0Ll96b2QsInByb3BWYWx1ZXMiLCgpPT5uLmluLl96b2QucHJvcFZhbHVlcyksdC5fem9kLnBhcnNlPShyLG8pPT57aWYoKG8uZGlyZWN0aW9ufHwiZm9yd2FyZCIpPT09ImZvcndhcmQiKXtjb25zdCBpPW4uaW4uX3pvZC5ydW4ocixvKTtyZXR1cm4gaSBpbnN0YW5jZW9mIFByb21pc2U/aS50aGVuKGE9PkRuKGEsbixvKSk6RG4oaSxuLG8pfWVsc2V7Y29uc3QgaT1uLm91dC5fem9kLnJ1bihyLG8pO3JldHVybiBpIGluc3RhbmNlb2YgUHJvbWlzZT9pLnRoZW4oYT0+RG4oYSxuLG8pKTpEbihpLG4sbyl9fX0pO2Z1bmN0aW9uIERuKHQsbixyKXtpZih0Lmlzc3Vlcy5sZW5ndGgpcmV0dXJuIHQuYWJvcnRlZD0hMCx0O2lmKChyLmRpcmVjdGlvbnx8ImZvcndhcmQiKT09PSJmb3J3YXJkIil7Y29uc3QgZT1uLnRyYW5zZm9ybSh0LnZhbHVlLHQpO3JldHVybiBlIGluc3RhbmNlb2YgUHJvbWlzZT9lLnRoZW4oaT0+RW4odCxpLG4ub3V0LHIpKTpFbih0LGUsbi5vdXQscil9ZWxzZXtjb25zdCBlPW4ucmV2ZXJzZVRyYW5zZm9ybSh0LnZhbHVlLHQpO3JldHVybiBlIGluc3RhbmNlb2YgUHJvbWlzZT9lLnRoZW4oaT0+RW4odCxpLG4uaW4scikpOkVuKHQsZSxuLmluLHIpfX1mdW5jdGlvbiBFbih0LG4scixvKXtyZXR1cm4gdC5pc3N1ZXMubGVuZ3RoPyh0LmFib3J0ZWQ9ITAsdCk6ci5fem9kLnJ1bih7dmFsdWU6bixpc3N1ZXM6dC5pc3N1ZXN9LG8pfWNvbnN0ICRsPWQoIiRab2RQcmVwcm9jZXNzIiwodCxuKT0+e3FpLmluaXQodCxuKX0pLF9sPWQoIiRab2RSZWFkb25seSIsKHQsbik9Pnt4LmluaXQodCxuKSxPKHQuX3pvZCwicHJvcFZhbHVlcyIsKCk9Pm4uaW5uZXJUeXBlLl96b2QucHJvcFZhbHVlcyksTyh0Ll96b2QsInZhbHVlcyIsKCk9Pm4uaW5uZXJUeXBlLl96b2QudmFsdWVzKSxPKHQuX3pvZCwib3B0aW4iLCgpPT5uLmlubmVyVHlwZT8uX3pvZD8ub3B0aW4pLE8odC5fem9kLCJvcHRvdXQiLCgpPT5uLmlubmVyVHlwZT8uX3pvZD8ub3B0b3V0KSx0Ll96b2QucGFyc2U9KHIsbyk9PntpZihvLmRpcmVjdGlvbj09PSJiYWNrd2FyZCIpcmV0dXJuIG4uaW5uZXJUeXBlLl96b2QucnVuKHIsbyk7Y29uc3QgZT1uLmlubmVyVHlwZS5fem9kLnJ1bihyLG8pO3JldHVybiBlIGluc3RhbmNlb2YgUHJvbWlzZT9lLnRoZW4oVHMpOlRzKGUpfX0pO2Z1bmN0aW9uIFRzKHQpe3JldHVybiB0LnZhbHVlPU9iamVjdC5mcmVlemUodC52YWx1ZSksdH1jb25zdCBibD1kKCIkWm9kVGVtcGxhdGVMaXRlcmFsIiwodCxuKT0+e3guaW5pdCh0LG4pO2NvbnN0IHI9W107Zm9yKGNvbnN0IG8gb2Ygbi5wYXJ0cylpZih0eXBlb2Ygbz09Im9iamVjdCImJm8hPT1udWxsKXtpZighby5fem9kLnBhdHRlcm4pdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHRlbXBsYXRlIGxpdGVyYWwgcGFydCwgbm8gcGF0dGVybiBmb3VuZDogJHtbLi4uby5fem9kLnRyYWl0c10uc2hpZnQoKX1gKTtjb25zdCBlPW8uX3pvZC5wYXR0ZXJuIGluc3RhbmNlb2YgUmVnRXhwP28uX3pvZC5wYXR0ZXJuLnNvdXJjZTpvLl96b2QucGF0dGVybjtpZighZSl0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgdGVtcGxhdGUgbGl0ZXJhbCBwYXJ0OiAke28uX3pvZC50cmFpdHN9YCk7Y29uc3QgaT1lLnN0YXJ0c1dpdGgoIl4iKT8xOjAsYT1lLmVuZHNXaXRoKCIkIik/ZS5sZW5ndGgtMTplLmxlbmd0aDtyLnB1c2goZS5zbGljZShpLGEpKX1lbHNlIGlmKG89PT1udWxsfHxWcy5oYXModHlwZW9mIG8pKXIucHVzaChiZShgJHtvfWApKTtlbHNlIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCB0ZW1wbGF0ZSBsaXRlcmFsIHBhcnQ6ICR7b31gKTt0Ll96b2QucGF0dGVybj1uZXcgUmVnRXhwKGBeJHtyLmpvaW4oIiIpfSRgKSx0Ll96b2QucGFyc2U9KG8sZSk9PnR5cGVvZiBvLnZhbHVlIT0ic3RyaW5nIj8oby5pc3N1ZXMucHVzaCh7aW5wdXQ6by52YWx1ZSxpbnN0OnQsZXhwZWN0ZWQ6InN0cmluZyIsY29kZToiaW52YWxpZF90eXBlIn0pLG8pOih0Ll96b2QucGF0dGVybi5sYXN0SW5kZXg9MCx0Ll96b2QucGF0dGVybi50ZXN0KG8udmFsdWUpfHxvLmlzc3Vlcy5wdXNoKHtpbnB1dDpvLnZhbHVlLGluc3Q6dCxjb2RlOiJpbnZhbGlkX2Zvcm1hdCIsZm9ybWF0Om4uZm9ybWF0Pz8idGVtcGxhdGVfbGl0ZXJhbCIscGF0dGVybjp0Ll96b2QucGF0dGVybi5zb3VyY2V9KSxvKX0pLHlsPWQoIiRab2RGdW5jdGlvbiIsKHQsbik9Pih4LmluaXQodCxuKSx0Ll9kZWY9bix0Ll96b2QuZGVmPW4sdC5pbXBsZW1lbnQ9cj0+e2lmKHR5cGVvZiByIT0iZnVuY3Rpb24iKXRocm93IG5ldyBFcnJvcigiaW1wbGVtZW50KCkgbXVzdCBiZSBjYWxsZWQgd2l0aCBhIGZ1bmN0aW9uIik7cmV0dXJuIGZ1bmN0aW9uKC4uLm8pe2NvbnN0IGU9dC5fZGVmLmlucHV0P2NpKHQuX2RlZi5pbnB1dCxvKTpvLGk9UmVmbGVjdC5hcHBseShyLHRoaXMsZSk7cmV0dXJuIHQuX2RlZi5vdXRwdXQ/Y2kodC5fZGVmLm91dHB1dCxpKTppfX0sdC5pbXBsZW1lbnRBc3luYz1yPT57aWYodHlwZW9mIHIhPSJmdW5jdGlvbiIpdGhyb3cgbmV3IEVycm9yKCJpbXBsZW1lbnRBc3luYygpIG11c3QgYmUgY2FsbGVkIHdpdGggYSBmdW5jdGlvbiIpO3JldHVybiBhc3luYyBmdW5jdGlvbiguLi5vKXtjb25zdCBlPXQuX2RlZi5pbnB1dD9hd2FpdCB1aSh0Ll9kZWYuaW5wdXQsbyk6byxpPWF3YWl0IFJlZmxlY3QuYXBwbHkocix0aGlzLGUpO3JldHVybiB0Ll9kZWYub3V0cHV0P2F3YWl0IHVpKHQuX2RlZi5vdXRwdXQsaSk6aX19LHQuX3pvZC5wYXJzZT0ocixvKT0+dHlwZW9mIHIudmFsdWUhPSJmdW5jdGlvbiI/KHIuaXNzdWVzLnB1c2goe2NvZGU6ImludmFsaWRfdHlwZSIsZXhwZWN0ZWQ6ImZ1bmN0aW9uIixpbnB1dDpyLnZhbHVlLGluc3Q6dH0pLHIpOih0Ll9kZWYub3V0cHV0JiZ0Ll9kZWYub3V0cHV0Ll96b2QuZGVmLnR5cGU9PT0icHJvbWlzZSI/ci52YWx1ZT10LmltcGxlbWVudEFzeW5jKHIudmFsdWUpOnIudmFsdWU9dC5pbXBsZW1lbnQoci52YWx1ZSksciksdC5pbnB1dD0oLi4ucik9Pntjb25zdCBvPXQuY29uc3RydWN0b3I7cmV0dXJuIEFycmF5LmlzQXJyYXkoclswXSk/bmV3IG8oe3R5cGU6ImZ1bmN0aW9uIixpbnB1dDpuZXcgTGkoe3R5cGU6InR1cGxlIixpdGVtczpyWzBdLHJlc3Q6clsxXX0pLG91dHB1dDp0Ll9kZWYub3V0cHV0fSk6bmV3IG8oe3R5cGU6ImZ1bmN0aW9uIixpbnB1dDpyWzBdLG91dHB1dDp0Ll9kZWYub3V0cHV0fSl9LHQub3V0cHV0PXI9Pntjb25zdCBvPXQuY29uc3RydWN0b3I7cmV0dXJuIG5ldyBvKHt0eXBlOiJmdW5jdGlvbiIsaW5wdXQ6dC5fZGVmLmlucHV0LG91dHB1dDpyfSl9LHQpKSxrbD1kKCIkWm9kUHJvbWlzZSIsKHQsbik9Pnt4LmluaXQodCxuKSx0Ll96b2QucGFyc2U9KHIsbyk9PlByb21pc2UucmVzb2x2ZShyLnZhbHVlKS50aGVuKGU9Pm4uaW5uZXJUeXBlLl96b2QucnVuKHt2YWx1ZTplLGlzc3VlczpbXX0sbykpfSksU2w9ZCgiJFpvZExhenkiLCh0LG4pPT57eC5pbml0KHQsbiksTyh0Ll96b2QsImlubmVyVHlwZSIsKCk9Pntjb25zdCByPW47cmV0dXJuIHIuX2NhY2hlZElubmVyfHwoci5fY2FjaGVkSW5uZXI9bi5nZXR0ZXIoKSksci5fY2FjaGVkSW5uZXJ9KSxPKHQuX3pvZCwicGF0dGVybiIsKCk9PnQuX3pvZC5pbm5lclR5cGU/Ll96b2Q/LnBhdHRlcm4pLE8odC5fem9kLCJwcm9wVmFsdWVzIiwoKT0+dC5fem9kLmlubmVyVHlwZT8uX3pvZD8ucHJvcFZhbHVlcyksTyh0Ll96b2QsIm9wdGluIiwoKT0+dC5fem9kLmlubmVyVHlwZT8uX3pvZD8ub3B0aW4/P3ZvaWQgMCksTyh0Ll96b2QsIm9wdG91dCIsKCk9PnQuX3pvZC5pbm5lclR5cGU/Ll96b2Q/Lm9wdG91dD8/dm9pZCAwKSx0Ll96b2QucGFyc2U9KHIsbyk9PnQuX3pvZC5pbm5lclR5cGUuX3pvZC5ydW4ocixvKX0pLHdsPWQoIiRab2RDdXN0b20iLCh0LG4pPT57Si5pbml0KHQsbikseC5pbml0KHQsbiksdC5fem9kLnBhcnNlPShyLG8pPT5yLHQuX3pvZC5jaGVjaz1yPT57Y29uc3Qgbz1yLnZhbHVlLGU9bi5mbihvKTtpZihlIGluc3RhbmNlb2YgUHJvbWlzZSlyZXR1cm4gZS50aGVuKGk9PmpzKGkscixvLHQpKTtqcyhlLHIsbyx0KX19KTtmdW5jdGlvbiBqcyh0LG4scixvKXtpZighdCl7Y29uc3QgZT17Y29kZToiY3VzdG9tIixpbnB1dDpyLGluc3Q6byxwYXRoOlsuLi5vLl96b2QuZGVmLnBhdGg/P1tdXSxjb250aW51ZTohby5fem9kLmRlZi5hYm9ydH07by5fem9kLmRlZi5wYXJhbXMmJihlLnBhcmFtcz1vLl96b2QuZGVmLnBhcmFtcyksbi5pc3N1ZXMucHVzaChIZShlKSl9fWNvbnN0IFJwPSgpPT57Y29uc3QgdD17c3RyaW5nOnt1bml0OiLYrdix2YEiLHZlcmI6Itij2YYg2YrYrdmI2YoifSxmaWxlOnt1bml0OiLYqNin2YrYqiIsdmVyYjoi2KPZhiDZitit2YjZiiJ9LGFycmF5Ont1bml0OiLYudmG2LXYsSIsdmVyYjoi2KPZhiDZitit2YjZiiJ9LHNldDp7dW5pdDoi2LnZhti12LEiLHZlcmI6Itij2YYg2YrYrdmI2YoifX07ZnVuY3Rpb24gbihlKXtyZXR1cm4gdFtlXT8/bnVsbH1jb25zdCByPXtyZWdleDoi2YXYr9iu2YQiLGVtYWlsOiLYqNix2YrYryDYpdmE2YPYqtix2YjZhtmKIix1cmw6Itix2KfYqNi3IixlbW9qaToi2KXZitmF2YjYrNmKIix1dWlkOiJVVUlEIix1dWlkdjQ6IlVVSUR2NCIsdXVpZHY2OiJVVUlEdjYiLG5hbm9pZDoibmFub2lkIixndWlkOiJHVUlEIixjdWlkOiJjdWlkIixjdWlkMjoiY3VpZDIiLHVsaWQ6IlVMSUQiLHhpZDoiWElEIixrc3VpZDoiS1NVSUQiLGRhdGV0aW1lOiLYqtin2LHZitiuINmI2YjZgtiqINio2YXYudmK2KfYsSBJU08iLGRhdGU6Itiq2KfYsdmK2K4g2KjZhdi52YrYp9ixIElTTyIsdGltZToi2YjZgtiqINio2YXYudmK2KfYsSBJU08iLGR1cmF0aW9uOiLZhdiv2Kkg2KjZhdi52YrYp9ixIElTTyIsaXB2NDoi2LnZhtmI2KfZhiBJUHY0IixpcHY2OiLYudmG2YjYp9mGIElQdjYiLGNpZHJ2NDoi2YXYr9mJINi52YbYp9mI2YrZhiDYqNi12YrYutipIElQdjQiLGNpZHJ2Njoi2YXYr9mJINi52YbYp9mI2YrZhiDYqNi12YrYutipIElQdjYiLGJhc2U2NDoi2YbZjti1INio2KrYsdmF2YrYsiBiYXNlNjQtZW5jb2RlZCIsYmFzZTY0dXJsOiLZhtmO2LUg2KjYqtix2YXZitiyIGJhc2U2NHVybC1lbmNvZGVkIixqc29uX3N0cmluZzoi2YbZjti1INi52YTZiSDZh9mK2KbYqSBKU09OIixlMTY0OiLYsdmC2YUg2YfYp9iq2YEg2KjZhdi52YrYp9ixIEUuMTY0Iixqd3Q6IkpXVCIsdGVtcGxhdGVfbGl0ZXJhbDoi2YXYr9iu2YQifSxvPXtuYW46Ik5hTiJ9O3JldHVybiBlPT57c3dpdGNoKGUuY29kZSl7Y2FzZSJpbnZhbGlkX3R5cGUiOntjb25zdCBpPW9bZS5leHBlY3RlZF0/P2UuZXhwZWN0ZWQsYT13KGUuaW5wdXQpLHM9b1thXT8/YTtyZXR1cm4vXltBLVpdLy50ZXN0KGUuZXhwZWN0ZWQpP2DZhdiv2K7ZhNin2Kog2LrZitixINmF2YLYqNmI2YTYqTog2YrZgdiq2LHYtiDYpdiv2K7Yp9mEIGluc3RhbmNlb2YgJHtlLmV4cGVjdGVkfdiMINmI2YTZg9mGINiq2YUg2KXYr9iu2KfZhCAke3N9YDpg2YXYr9iu2YTYp9iqINi62YrYsSDZhdmC2KjZiNmE2Kk6INmK2YHYqtix2LYg2KXYr9iu2KfZhCAke2l92Iwg2YjZhNmD2YYg2KrZhSDYpdiv2K7Yp9mEICR7c31gfWNhc2UiaW52YWxpZF92YWx1ZSI6cmV0dXJuIGUudmFsdWVzLmxlbmd0aD09PTE/YNmF2K/YrtmE2KfYqiDYutmK2LEg2YXZgtio2YjZhNipOiDZitmB2KrYsdi2INil2K/Yrtin2YQgJHtTKGUudmFsdWVzWzBdKX1gOmDYp9iu2KrZitin2LEg2LrZitixINmF2YLYqNmI2YQ6INmK2KrZiNmC2Lkg2KfZhtiq2YLYp9ihINij2K3YryDZh9iw2Ycg2KfZhNiu2YrYp9ix2KfYqjogJHtfKGUudmFsdWVzLCJ8Iil9YDtjYXNlInRvb19iaWciOntjb25zdCBpPWUuaW5jbHVzaXZlPyI8PSI6IjwiLGE9bihlLm9yaWdpbik7cmV0dXJuIGE/YCDYo9mD2KjYsSDZhdmGINin2YTZhNin2LLZhTog2YrZgdiq2LHYtiDYo9mGINiq2YPZiNmGICR7ZS5vcmlnaW4/PyLYp9mE2YLZitmF2KkifSAke2l9ICR7ZS5tYXhpbXVtLnRvU3RyaW5nKCl9ICR7YS51bml0Pz8i2LnZhti12LEifWA6YNij2YPYqNixINmF2YYg2KfZhNmE2KfYstmFOiDZitmB2KrYsdi2INij2YYg2KrZg9mI2YYgJHtlLm9yaWdpbj8/Itin2YTZgtmK2YXYqSJ9ICR7aX0gJHtlLm1heGltdW0udG9TdHJpbmcoKX1gfWNhc2UidG9vX3NtYWxsIjp7Y29uc3QgaT1lLmluY2x1c2l2ZT8iPj0iOiI+IixhPW4oZS5vcmlnaW4pO3JldHVybiBhP2DYo9i12LrYsSDZhdmGINin2YTZhNin2LLZhTog2YrZgdiq2LHYtiDZhNmAICR7ZS5vcmlnaW59INij2YYg2YrZg9mI2YYgJHtpfSAke2UubWluaW11bS50b1N0cmluZygpfSAke2EudW5pdH1gOmDYo9i12LrYsSDZhdmGINin2YTZhNin2LLZhTog2YrZgdiq2LHYtiDZhNmAICR7ZS5vcmlnaW59INij2YYg2YrZg9mI2YYgJHtpfSAke2UubWluaW11bS50b1N0cmluZygpfWB9Y2FzZSJpbnZhbGlkX2Zvcm1hdCI6e2NvbnN0IGk9ZTtyZXR1cm4gaS5mb3JtYXQ9PT0ic3RhcnRzX3dpdGgiP2DZhtmO2LUg2LrZitixINmF2YLYqNmI2YQ6INmK2KzYqCDYo9mGINmK2KjYr9ijINio2YAgIiR7ZS5wcmVmaXh9ImA6aS5mb3JtYXQ9PT0iZW5kc193aXRoIj9g2YbZjti1INi62YrYsSDZhdmC2KjZiNmEOiDZitis2Kgg2KPZhiDZitmG2KrZh9mKINio2YAgIiR7aS5zdWZmaXh9ImA6aS5mb3JtYXQ9PT0iaW5jbHVkZXMiP2DZhtmO2LUg2LrZitixINmF2YLYqNmI2YQ6INmK2KzYqCDYo9mGINmK2KrYttmF2ZHZjtmGICIke2kuaW5jbHVkZXN9ImA6aS5mb3JtYXQ9PT0icmVnZXgiP2DZhtmO2LUg2LrZitixINmF2YLYqNmI2YQ6INmK2KzYqCDYo9mGINmK2LfYp9io2YIg2KfZhNmG2YXYtyAke2kucGF0dGVybn1gOmAke3JbaS5mb3JtYXRdPz9lLmZvcm1hdH0g2LrZitixINmF2YLYqNmI2YRgfWNhc2Uibm90X211bHRpcGxlX29mIjpyZXR1cm5g2LHZgtmFINi62YrYsSDZhdmC2KjZiNmEOiDZitis2Kgg2KPZhiDZitmD2YjZhiDZhdmGINmF2LbYp9i52YHYp9iqICR7ZS5kaXZpc29yfWA7Y2FzZSJ1bnJlY29nbml6ZWRfa2V5cyI6cmV0dXJuYNmF2LnYsdmBJHtlLmtleXMubGVuZ3RoPjE/Itin2KoiOiIifSDYutix2YrYqCR7ZS5rZXlzLmxlbmd0aD4xPyLYqSI6IiJ9OiAke18oZS5rZXlzLCLYjCAiKX1gO2Nhc2UiaW52YWxpZF9rZXkiOnJldHVybmDZhdi52LHZgSDYutmK2LEg2YXZgtio2YjZhCDZgdmKICR7ZS5vcmlnaW59YDtjYXNlImludmFsaWRfdW5pb24iOnJldHVybiLZhdiv2K7ZhCDYutmK2LEg2YXZgtio2YjZhCI7Y2FzZSJpbnZhbGlkX2VsZW1lbnQiOnJldHVybmDZhdiv2K7ZhCDYutmK2LEg2YXZgtio2YjZhCDZgdmKICR7ZS5vcmlnaW59YDtkZWZhdWx0OnJldHVybiLZhdiv2K7ZhCDYutmK2LEg2YXZgtio2YjZhCJ9fX07ZnVuY3Rpb24gQ3AoKXtyZXR1cm57bG9jYWxlRXJyb3I6UnAoKX19Y29uc3QgQXA9KCk9Pntjb25zdCB0PXtzdHJpbmc6e3VuaXQ6InNpbXZvbCIsdmVyYjoib2xtYWzEsWTEsXIifSxmaWxlOnt1bml0OiJiYXl0Iix2ZXJiOiJvbG1hbMSxZMSxciJ9LGFycmF5Ont1bml0OiJlbGVtZW50Iix2ZXJiOiJvbG1hbMSxZMSxciJ9LHNldDp7dW5pdDoiZWxlbWVudCIsdmVyYjoib2xtYWzEsWTEsXIifX07ZnVuY3Rpb24gbihlKXtyZXR1cm4gdFtlXT8/bnVsbH1jb25zdCByPXtyZWdleDoiaW5wdXQiLGVtYWlsOiJlbWFpbCBhZGRyZXNzIix1cmw6IlVSTCIsZW1vamk6ImVtb2ppIix1dWlkOiJVVUlEIix1dWlkdjQ6IlVVSUR2NCIsdXVpZHY2OiJVVUlEdjYiLG5hbm9pZDoibmFub2lkIixndWlkOiJHVUlEIixjdWlkOiJjdWlkIixjdWlkMjoiY3VpZDIiLHVsaWQ6IlVMSUQiLHhpZDoiWElEIixrc3VpZDoiS1NVSUQiLGRhdGV0aW1lOiJJU08gZGF0ZXRpbWUiLGRhdGU6IklTTyBkYXRlIix0aW1lOiJJU08gdGltZSIsZHVyYXRpb246IklTTyBkdXJhdGlvbiIsaXB2NDoiSVB2NCBhZGRyZXNzIixpcHY2OiJJUHY2IGFkZHJlc3MiLGNpZHJ2NDoiSVB2NCByYW5nZSIsY2lkcnY2OiJJUHY2IHJhbmdlIixiYXNlNjQ6ImJhc2U2NC1lbmNvZGVkIHN0cmluZyIsYmFzZTY0dXJsOiJiYXNlNjR1cmwtZW5jb2RlZCBzdHJpbmciLGpzb25fc3RyaW5nOiJKU09OIHN0cmluZyIsZTE2NDoiRS4xNjQgbnVtYmVyIixqd3Q6IkpXVCIsdGVtcGxhdGVfbGl0ZXJhbDoiaW5wdXQifSxvPXtuYW46Ik5hTiJ9O3JldHVybiBlPT57c3dpdGNoKGUuY29kZSl7Y2FzZSJpbnZhbGlkX3R5cGUiOntjb25zdCBpPW9bZS5leHBlY3RlZF0/P2UuZXhwZWN0ZWQsYT13KGUuaW5wdXQpLHM9b1thXT8/YTtyZXR1cm4vXltBLVpdLy50ZXN0KGUuZXhwZWN0ZWQpP2BZYW5sxLHFnyBkyZl5yZlyOiBnw7Z6bMmZbmlsyZluIGluc3RhbmNlb2YgJHtlLmV4cGVjdGVkfSwgZGF4aWwgb2xhbiAke3N9YDpgWWFubMSxxZ8gZMmZecmZcjogZ8O2emzJmW5pbMmZbiAke2l9LCBkYXhpbCBvbGFuICR7c31gfWNhc2UiaW52YWxpZF92YWx1ZSI6cmV0dXJuIGUudmFsdWVzLmxlbmd0aD09PTE/YFlhbmzEscWfIGTJmXnJmXI6IGfDtnpsyZluaWzJmW4gJHtTKGUudmFsdWVzWzBdKX1gOmBZYW5sxLHFnyBzZcOnaW06IGHFn2HEn8SxZGFrxLFsYXJkYW4gYmlyaSBvbG1hbMSxZMSxcjogJHtfKGUudmFsdWVzLCJ8Iil9YDtjYXNlInRvb19iaWciOntjb25zdCBpPWUuaW5jbHVzaXZlPyI8PSI6IjwiLGE9bihlLm9yaWdpbik7cmV0dXJuIGE/YMOHb3ggYsO2ecO8azogZ8O2emzJmW5pbMmZbiAke2Uub3JpZ2luPz8iZMmZecmZciJ9ICR7aX0ke2UubWF4aW11bS50b1N0cmluZygpfSAke2EudW5pdD8/ImVsZW1lbnQifWA6YMOHb3ggYsO2ecO8azogZ8O2emzJmW5pbMmZbiAke2Uub3JpZ2luPz8iZMmZecmZciJ9ICR7aX0ke2UubWF4aW11bS50b1N0cmluZygpfWB9Y2FzZSJ0b29fc21hbGwiOntjb25zdCBpPWUuaW5jbHVzaXZlPyI+PSI6Ij4iLGE9bihlLm9yaWdpbik7cmV0dXJuIGE/YMOHb3gga2nDp2lrOiBnw7Z6bMmZbmlsyZluICR7ZS5vcmlnaW59ICR7aX0ke2UubWluaW11bS50b1N0cmluZygpfSAke2EudW5pdH1gOmDDh294IGtpw6dpazogZ8O2emzJmW5pbMmZbiAke2Uub3JpZ2lufSAke2l9JHtlLm1pbmltdW0udG9TdHJpbmcoKX1gfWNhc2UiaW52YWxpZF9mb3JtYXQiOntjb25zdCBpPWU7cmV0dXJuIGkuZm9ybWF0PT09InN0YXJ0c193aXRoIj9gWWFubMSxxZ8gbcmZdG46ICIke2kucHJlZml4fSIgaWzJmSBiYcWfbGFtYWzEsWTEsXJgOmkuZm9ybWF0PT09ImVuZHNfd2l0aCI/YFlhbmzEscWfIG3JmXRuOiAiJHtpLnN1ZmZpeH0iIGlsyZkgYml0bcmZbGlkaXJgOmkuZm9ybWF0PT09ImluY2x1ZGVzIj9gWWFubMSxxZ8gbcmZdG46ICIke2kuaW5jbHVkZXN9IiBkYXhpbCBvbG1hbMSxZMSxcmA6aS5mb3JtYXQ9PT0icmVnZXgiP2BZYW5sxLHFnyBtyZl0bjogJHtpLnBhdHRlcm59IMWfYWJsb251bmEgdXnEn3VuIG9sbWFsxLFkxLFyYDpgWWFubMSxxZ8gJHtyW2kuZm9ybWF0XT8/ZS5mb3JtYXR9YH1jYXNlIm5vdF9tdWx0aXBsZV9vZiI6cmV0dXJuYFlhbmzEscWfIMmZZMmZZDogJHtlLmRpdmlzb3J9IGlsyZkgYsO2bMO8bsmZIGJpbMmZbiBvbG1hbMSxZMSxcmA7Y2FzZSJ1bnJlY29nbml6ZWRfa2V5cyI6cmV0dXJuYFRhbsSxbm1heWFuIGHDp2FyJHtlLmtleXMubGVuZ3RoPjE/ImxhciI6IiJ9OiAke18oZS5rZXlzLCIsICIpfWA7Y2FzZSJpbnZhbGlkX2tleSI6cmV0dXJuYCR7ZS5vcmlnaW59IGRheGlsaW5kyZkgeWFubMSxxZ8gYcOnYXJgO2Nhc2UiaW52YWxpZF91bmlvbiI6cmV0dXJuIllhbmzEscWfIGTJmXnJmXIiO2Nhc2UiaW52YWxpZF9lbGVtZW50IjpyZXR1cm5gJHtlLm9yaWdpbn0gZGF4aWxpbmTJmSB5YW5sxLHFnyBkyZl5yZlyYDtkZWZhdWx0OnJldHVybiJZYW5sxLHFnyBkyZl5yZlyIn19fTtmdW5jdGlvbiBMcCgpe3JldHVybntsb2NhbGVFcnJvcjpBcCgpfX1mdW5jdGlvbiBPcyh0LG4scixvKXtjb25zdCBlPU1hdGguYWJzKHQpLGk9ZSUxMCxhPWUlMTAwO3JldHVybiBhPj0xMSYmYTw9MTk/bzppPT09MT9uOmk+PTImJmk8PTQ/cjpvfWNvbnN0IE1wPSgpPT57Y29uc3QgdD17c3RyaW5nOnt1bml0OntvbmU6ItGB0ZbQvNCy0LDQuyIsZmV3OiLRgdGW0LzQstCw0LvRiyIsbWFueToi0YHRltC80LLQsNC70LDRniJ9LHZlcmI6ItC80LXRhtGMIn0sYXJyYXk6e3VuaXQ6e29uZToi0Y3Qu9C10LzQtdC90YIiLGZldzoi0Y3Qu9C10LzQtdC90YLRiyIsbWFueToi0Y3Qu9C10LzQtdC90YLQsNGeIn0sdmVyYjoi0LzQtdGG0YwifSxzZXQ6e3VuaXQ6e29uZToi0Y3Qu9C10LzQtdC90YIiLGZldzoi0Y3Qu9C10LzQtdC90YLRiyIsbWFueToi0Y3Qu9C10LzQtdC90YLQsNGeIn0sdmVyYjoi0LzQtdGG0YwifSxmaWxlOnt1bml0OntvbmU6ItCx0LDQudGCIixmZXc6ItCx0LDQudGC0YsiLG1hbnk6ItCx0LDQudGC0LDRniJ9LHZlcmI6ItC80LXRhtGMIn19O2Z1bmN0aW9uIG4oZSl7cmV0dXJuIHRbZV0/P251bGx9Y29uc3Qgcj17cmVnZXg6ItGD0LLQvtC0IixlbWFpbDoiZW1haWwg0LDQtNGA0LDRgSIsdXJsOiJVUkwiLGVtb2ppOiLRjdC80L7QtNC30ZYiLHV1aWQ6IlVVSUQiLHV1aWR2NDoiVVVJRHY0Iix1dWlkdjY6IlVVSUR2NiIsbmFub2lkOiJuYW5vaWQiLGd1aWQ6IkdVSUQiLGN1aWQ6ImN1aWQiLGN1aWQyOiJjdWlkMiIsdWxpZDoiVUxJRCIseGlkOiJYSUQiLGtzdWlkOiJLU1VJRCIsZGF0ZXRpbWU6IklTTyDQtNCw0YLQsCDRliDRh9Cw0YEiLGRhdGU6IklTTyDQtNCw0YLQsCIsdGltZToiSVNPINGH0LDRgSIsZHVyYXRpb246IklTTyDQv9GA0LDRhtGP0LPQu9Cw0YHRhtGMIixpcHY0OiJJUHY0INCw0LTRgNCw0YEiLGlwdjY6IklQdjYg0LDQtNGA0LDRgSIsY2lkcnY0OiJJUHY0INC00YvRj9C/0LDQt9C+0L0iLGNpZHJ2NjoiSVB2NiDQtNGL0Y/Qv9Cw0LfQvtC9IixiYXNlNjQ6ItGA0LDQtNC+0Log0YMg0YTQsNGA0LzQsNGG0LUgYmFzZTY0IixiYXNlNjR1cmw6ItGA0LDQtNC+0Log0YMg0YTQsNGA0LzQsNGG0LUgYmFzZTY0dXJsIixqc29uX3N0cmluZzoiSlNPTiDRgNCw0LTQvtC6IixlMTY0OiLQvdGD0LzQsNGAIEUuMTY0Iixqd3Q6IkpXVCIsdGVtcGxhdGVfbGl0ZXJhbDoi0YPQstC+0LQifSxvPXtuYW46Ik5hTiIsbnVtYmVyOiLQu9GW0LoiLGFycmF5OiLQvNCw0YHRltGeIn07cmV0dXJuIGU9Pntzd2l0Y2goZS5jb2RlKXtjYXNlImludmFsaWRfdHlwZSI6e2NvbnN0IGk9b1tlLmV4cGVjdGVkXT8/ZS5leHBlY3RlZCxhPXcoZS5pbnB1dCkscz1vW2FdPz9hO3JldHVybi9eW0EtWl0vLnRlc3QoZS5leHBlY3RlZCk/YNCd0Y/Qv9GA0LDQstGW0LvRjNC90Ysg0Z7QstC+0LQ6INGH0LDQutCw0Z7RgdGPIGluc3RhbmNlb2YgJHtlLmV4cGVjdGVkfSwg0LDRgtGA0YvQvNCw0L3QsCAke3N9YDpg0J3Rj9C/0YDQsNCy0ZbQu9GM0L3RiyDRntCy0L7QtDog0YfQsNC60LDRntGB0Y8gJHtpfSwg0LDRgtGA0YvQvNCw0L3QsCAke3N9YH1jYXNlImludmFsaWRfdmFsdWUiOnJldHVybiBlLnZhbHVlcy5sZW5ndGg9PT0xP2DQndGP0L/RgNCw0LLRltC70YzQvdGLINGe0LLQvtC0OiDRh9Cw0LrQsNC70LDRgdGPICR7UyhlLnZhbHVlc1swXSl9YDpg0J3Rj9C/0YDQsNCy0ZbQu9GM0L3RiyDQstCw0YDRi9GP0L3Rgjog0YfQsNC60LDRntGB0Y8g0LDQtNC30ZbQvSDQtyAke18oZS52YWx1ZXMsInwiKX1gO2Nhc2UidG9vX2JpZyI6e2NvbnN0IGk9ZS5pbmNsdXNpdmU/Ijw9IjoiPCIsYT1uKGUub3JpZ2luKTtpZihhKXtjb25zdCBzPU51bWJlcihlLm1heGltdW0pLGM9T3MocyxhLnVuaXQub25lLGEudW5pdC5mZXcsYS51bml0Lm1hbnkpO3JldHVybmDQl9Cw0L3QsNC00YLQsCDQstGP0LvRltC60ZY6INGH0LDQutCw0LvQsNGB0Y8sINGI0YLQviAke2Uub3JpZ2luPz8i0LfQvdCw0YfRjdC90L3QtSJ9INC/0LDQstGW0L3QvdCwICR7YS52ZXJifSAke2l9JHtlLm1heGltdW0udG9TdHJpbmcoKX0gJHtjfWB9cmV0dXJuYNCX0LDQvdCw0LTRgtCwINCy0Y/Qu9GW0LrRljog0YfQsNC60LDQu9Cw0YHRjywg0YjRgtC+ICR7ZS5vcmlnaW4/PyLQt9C90LDRh9GN0L3QvdC1In0g0L/QsNCy0ZbQvdC90LAg0LHRi9GG0YwgJHtpfSR7ZS5tYXhpbXVtLnRvU3RyaW5nKCl9YH1jYXNlInRvb19zbWFsbCI6e2NvbnN0IGk9ZS5pbmNsdXNpdmU/Ij49IjoiPiIsYT1uKGUub3JpZ2luKTtpZihhKXtjb25zdCBzPU51bWJlcihlLm1pbmltdW0pLGM9T3MocyxhLnVuaXQub25lLGEudW5pdC5mZXcsYS51bml0Lm1hbnkpO3JldHVybmDQl9Cw0L3QsNC00YLQsCDQvNCw0LvRizog0YfQsNC60LDQu9Cw0YHRjywg0YjRgtC+ICR7ZS5vcmlnaW59INC/0LDQstGW0L3QvdCwICR7YS52ZXJifSAke2l9JHtlLm1pbmltdW0udG9TdHJpbmcoKX0gJHtjfWB9cmV0dXJuYNCX0LDQvdCw0LTRgtCwINC80LDQu9GLOiDRh9Cw0LrQsNC70LDRgdGPLCDRiNGC0L4gJHtlLm9yaWdpbn0g0L/QsNCy0ZbQvdC90LAg0LHRi9GG0YwgJHtpfSR7ZS5taW5pbXVtLnRvU3RyaW5nKCl9YH1jYXNlImludmFsaWRfZm9ybWF0Ijp7Y29uc3QgaT1lO3JldHVybiBpLmZvcm1hdD09PSJzdGFydHNfd2l0aCI/YNCd0Y/Qv9GA0LDQstGW0LvRjNC90Ysg0YDQsNC00L7Qujog0L/QsNCy0ZbQvdC10L0g0L/QsNGH0YvQvdCw0YbRhtCwINC3ICIke2kucHJlZml4fSJgOmkuZm9ybWF0PT09ImVuZHNfd2l0aCI/YNCd0Y/Qv9GA0LDQstGW0LvRjNC90Ysg0YDQsNC00L7Qujog0L/QsNCy0ZbQvdC10L0g0LfQsNC60LDQvdGH0LLQsNGG0YbQsCDQvdCwICIke2kuc3VmZml4fSJgOmkuZm9ybWF0PT09ImluY2x1ZGVzIj9g0J3Rj9C/0YDQsNCy0ZbQu9GM0L3RiyDRgNCw0LTQvtC6OiDQv9Cw0LLRltC90LXQvSDQt9C80Y/RiNGH0LDRhtGMICIke2kuaW5jbHVkZXN9ImA6aS5mb3JtYXQ9PT0icmVnZXgiP2DQndGP0L/RgNCw0LLRltC70YzQvdGLINGA0LDQtNC+0Lo6INC/0LDQstGW0L3QtdC9INCw0LTQv9Cw0LLRj9C00LDRhtGMINGI0LDQsdC70L7QvdGDICR7aS5wYXR0ZXJufWA6YNCd0Y/Qv9GA0LDQstGW0LvRjNC90YsgJHtyW2kuZm9ybWF0XT8/ZS5mb3JtYXR9YH1jYXNlIm5vdF9tdWx0aXBsZV9vZiI6cmV0dXJuYNCd0Y/Qv9GA0LDQstGW0LvRjNC90Ysg0LvRltC6OiDQv9Cw0LLRltC90LXQvSDQsdGL0YbRjCDQutGA0LDRgtC90YvQvCAke2UuZGl2aXNvcn1gO2Nhc2UidW5yZWNvZ25pemVkX2tleXMiOnJldHVybmDQndC10YDQsNGB0L/QsNC30L3QsNC90YsgJHtlLmtleXMubGVuZ3RoPjE/ItC60LvRjtGH0YsiOiLQutC70Y7RhyJ9OiAke18oZS5rZXlzLCIsICIpfWA7Y2FzZSJpbnZhbGlkX2tleSI6cmV0dXJuYNCd0Y/Qv9GA0LDQstGW0LvRjNC90Ysg0LrQu9GO0Ycg0YMgJHtlLm9yaWdpbn1gO2Nhc2UiaW52YWxpZF91bmlvbiI6cmV0dXJuItCd0Y/Qv9GA0LDQstGW0LvRjNC90Ysg0Z7QstC+0LQiO2Nhc2UiaW52YWxpZF9lbGVtZW50IjpyZXR1cm5g0J3Rj9C/0YDQsNCy0ZbQu9GM0L3QsNC1INC30L3QsNGH0Y3QvdC90LUg0Z4gJHtlLm9yaWdpbn1gO2RlZmF1bHQ6cmV0dXJuItCd0Y/Qv9GA0LDQstGW0LvRjNC90Ysg0Z7QstC+0LQifX19O2Z1bmN0aW9uIHFwKCl7cmV0dXJue2xvY2FsZUVycm9yOk1wKCl9fWNvbnN0IEZwPSgpPT57Y29uc3QgdD17c3RyaW5nOnt1bml0OiLRgdC40LzQstC+0LvQsCIsdmVyYjoi0LTQsCDRgdGK0LTRitGA0LbQsCJ9LGZpbGU6e3VuaXQ6ItCx0LDQudGC0LAiLHZlcmI6ItC00LAg0YHRitC00YrRgNC20LAifSxhcnJheTp7dW5pdDoi0LXQu9C10LzQtdC90YLQsCIsdmVyYjoi0LTQsCDRgdGK0LTRitGA0LbQsCJ9LHNldDp7dW5pdDoi0LXQu9C10LzQtdC90YLQsCIsdmVyYjoi0LTQsCDRgdGK0LTRitGA0LbQsCJ9fTtmdW5jdGlvbiBuKGUpe3JldHVybiB0W2VdPz9udWxsfWNvbnN0IHI9e3JlZ2V4OiLQstGF0L7QtCIsZW1haWw6ItC40LzQtdC50Lsg0LDQtNGA0LXRgSIsdXJsOiJVUkwiLGVtb2ppOiLQtdC80L7QtNC20LgiLHV1aWQ6IlVVSUQiLHV1aWR2NDoiVVVJRHY0Iix1dWlkdjY6IlVVSUR2NiIsbmFub2lkOiJuYW5vaWQiLGd1aWQ6IkdVSUQiLGN1aWQ6ImN1aWQiLGN1aWQyOiJjdWlkMiIsdWxpZDoiVUxJRCIseGlkOiJYSUQiLGtzdWlkOiJLU1VJRCIsZGF0ZXRpbWU6IklTTyDQstGA0LXQvNC1IixkYXRlOiJJU08g0LTQsNGC0LAiLHRpbWU6IklTTyDQstGA0LXQvNC1IixkdXJhdGlvbjoiSVNPINC/0YDQvtC00YrQu9C20LjRgtC10LvQvdC+0YHRgiIsaXB2NDoiSVB2NCDQsNC00YDQtdGBIixpcHY2OiJJUHY2INCw0LTRgNC10YEiLGNpZHJ2NDoiSVB2NCDQtNC40LDQv9Cw0LfQvtC9IixjaWRydjY6IklQdjYg0LTQuNCw0L/QsNC30L7QvSIsYmFzZTY0OiJiYXNlNjQt0LrQvtC00LjRgNCw0L0g0L3QuNC3IixiYXNlNjR1cmw6ImJhc2U2NHVybC3QutC+0LTQuNGA0LDQvSDQvdC40LciLGpzb25fc3RyaW5nOiJKU09OINC90LjQtyIsZTE2NDoiRS4xNjQg0L3QvtC80LXRgCIsand0OiJKV1QiLHRlbXBsYXRlX2xpdGVyYWw6ItCy0YXQvtC0In0sbz17bmFuOiJOYU4iLG51bWJlcjoi0YfQuNGB0LvQviIsYXJyYXk6ItC80LDRgdC40LIifTtyZXR1cm4gZT0+e3N3aXRjaChlLmNvZGUpe2Nhc2UiaW52YWxpZF90eXBlIjp7Y29uc3QgaT1vW2UuZXhwZWN0ZWRdPz9lLmV4cGVjdGVkLGE9dyhlLmlucHV0KSxzPW9bYV0/P2E7cmV0dXJuL15bQS1aXS8udGVzdChlLmV4cGVjdGVkKT9g0J3QtdCy0LDQu9C40LTQtdC9INCy0YXQvtC0OiDQvtGH0LDQutCy0LDQvSBpbnN0YW5jZW9mICR7ZS5leHBlY3RlZH0sINC/0L7Qu9GD0YfQtdC9ICR7c31gOmDQndC10LLQsNC70LjQtNC10L0g0LLRhdC+0LQ6INC+0YfQsNC60LLQsNC9ICR7aX0sINC/0L7Qu9GD0YfQtdC9ICR7c31gfWNhc2UiaW52YWxpZF92YWx1ZSI6cmV0dXJuIGUudmFsdWVzLmxlbmd0aD09PTE/YNCd0LXQstCw0LvQuNC00LXQvSDQstGF0L7QtDog0L7Rh9Cw0LrQstCw0L0gJHtTKGUudmFsdWVzWzBdKX1gOmDQndC10LLQsNC70LjQtNC90LAg0L7Qv9GG0LjRjzog0L7Rh9Cw0LrQstCw0L3QviDQtdC00L3QviDQvtGCICR7XyhlLnZhbHVlcywifCIpfWA7Y2FzZSJ0b29fYmlnIjp7Y29uc3QgaT1lLmluY2x1c2l2ZT8iPD0iOiI8IixhPW4oZS5vcmlnaW4pO3JldHVybiBhP2DQotCy0YrRgNC00LUg0LPQvtC70Y/QvNC+OiDQvtGH0LDQutCy0LAg0YHQtSAke2Uub3JpZ2luPz8i0YHRgtC+0LnQvdC+0YHRgiJ9INC00LAg0YHRitC00YrRgNC20LAgJHtpfSR7ZS5tYXhpbXVtLnRvU3RyaW5nKCl9ICR7YS51bml0Pz8i0LXQu9C10LzQtdC90YLQsCJ9YDpg0KLQstGK0YDQtNC1INCz0L7Qu9GP0LzQvjog0L7Rh9Cw0LrQstCwINGB0LUgJHtlLm9yaWdpbj8/ItGB0YLQvtC50L3QvtGB0YIifSDQtNCwINCx0YrQtNC1ICR7aX0ke2UubWF4aW11bS50b1N0cmluZygpfWB9Y2FzZSJ0b29fc21hbGwiOntjb25zdCBpPWUuaW5jbHVzaXZlPyI+PSI6Ij4iLGE9bihlLm9yaWdpbik7cmV0dXJuIGE/YNCi0LLRitGA0LTQtSDQvNCw0LvQutC+OiDQvtGH0LDQutCy0LAg0YHQtSAke2Uub3JpZ2lufSDQtNCwINGB0YrQtNGK0YDQttCwICR7aX0ke2UubWluaW11bS50b1N0cmluZygpfSAke2EudW5pdH1gOmDQotCy0YrRgNC00LUg0LzQsNC70LrQvjog0L7Rh9Cw0LrQstCwINGB0LUgJHtlLm9yaWdpbn0g0LTQsCDQsdGK0LTQtSAke2l9JHtlLm1pbmltdW0udG9TdHJpbmcoKX1gfWNhc2UiaW52YWxpZF9mb3JtYXQiOntjb25zdCBpPWU7aWYoaS5mb3JtYXQ9PT0ic3RhcnRzX3dpdGgiKXJldHVybmDQndC10LLQsNC70LjQtNC10L0g0L3QuNC3OiDRgtGA0Y/QsdCy0LAg0LTQsCDQt9Cw0L/QvtGH0LLQsCDRgSAiJHtpLnByZWZpeH0iYDtpZihpLmZvcm1hdD09PSJlbmRzX3dpdGgiKXJldHVybmDQndC10LLQsNC70LjQtNC10L0g0L3QuNC3OiDRgtGA0Y/QsdCy0LAg0LTQsCDQt9Cw0LLRitGA0YjQstCwINGBICIke2kuc3VmZml4fSJgO2lmKGkuZm9ybWF0PT09ImluY2x1ZGVzIilyZXR1cm5g0J3QtdCy0LDQu9C40LTQtdC9INC90LjQtzog0YLRgNGP0LHQstCwINC00LAg0LLQutC70Y7Rh9Cy0LAgIiR7aS5pbmNsdWRlc30iYDtpZihpLmZvcm1hdD09PSJyZWdleCIpcmV0dXJuYNCd0LXQstCw0LvQuNC00LXQvSDQvdC40Lc6INGC0YDRj9Cx0LLQsCDQtNCwINGB0YrQstC/0LDQtNCwINGBICR7aS5wYXR0ZXJufWA7bGV0IGE9ItCd0LXQstCw0LvQuNC00LXQvSI7cmV0dXJuIGkuZm9ybWF0PT09ImVtb2ppIiYmKGE9ItCd0LXQstCw0LvQuNC00L3QviIpLGkuZm9ybWF0PT09ImRhdGV0aW1lIiYmKGE9ItCd0LXQstCw0LvQuNC00L3QviIpLGkuZm9ybWF0PT09ImRhdGUiJiYoYT0i0J3QtdCy0LDQu9C40LTQvdCwIiksaS5mb3JtYXQ9PT0idGltZSImJihhPSLQndC10LLQsNC70LjQtNC90L4iKSxpLmZvcm1hdD09PSJkdXJhdGlvbiImJihhPSLQndC10LLQsNC70LjQtNC90LAiKSxgJHthfSAke3JbaS5mb3JtYXRdPz9lLmZvcm1hdH1gfWNhc2Uibm90X211bHRpcGxlX29mIjpyZXR1cm5g0J3QtdCy0LDQu9C40LTQvdC+INGH0LjRgdC70L46INGC0YDRj9Cx0LLQsCDQtNCwINCx0YrQtNC1INC60YDQsNGC0L3QviDQvdCwICR7ZS5kaXZpc29yfWA7Y2FzZSJ1bnJlY29nbml6ZWRfa2V5cyI6cmV0dXJuYNCd0LXRgNCw0LfQv9C+0LfQvdCw0YIke2Uua2V5cy5sZW5ndGg+MT8i0LgiOiIifSDQutC70Y7RhyR7ZS5rZXlzLmxlbmd0aD4xPyLQvtCy0LUiOiIifTogJHtfKGUua2V5cywiLCAiKX1gO2Nhc2UiaW52YWxpZF9rZXkiOnJldHVybmDQndC10LLQsNC70LjQtNC10L0g0LrQu9GO0Ycg0LIgJHtlLm9yaWdpbn1gO2Nhc2UiaW52YWxpZF91bmlvbiI6cmV0dXJuItCd0LXQstCw0LvQuNC00LXQvSDQstGF0L7QtCI7Y2FzZSJpbnZhbGlkX2VsZW1lbnQiOnJldHVybmDQndC10LLQsNC70LjQtNC90LAg0YHRgtC+0LnQvdC+0YHRgiDQsiAke2Uub3JpZ2lufWA7ZGVmYXVsdDpyZXR1cm4i0J3QtdCy0LDQu9C40LTQtdC9INCy0YXQvtC0In19fTtmdW5jdGlvbiBKcCgpe3JldHVybntsb2NhbGVFcnJvcjpGcCgpfX1jb25zdCBIcD0oKT0+e2NvbnN0IHQ9e3N0cmluZzp7dW5pdDoiY2Fyw6BjdGVycyIsdmVyYjoiY29udGVuaXIifSxmaWxlOnt1bml0OiJieXRlcyIsdmVyYjoiY29udGVuaXIifSxhcnJheTp7dW5pdDoiZWxlbWVudHMiLHZlcmI6ImNvbnRlbmlyIn0sc2V0Ont1bml0OiJlbGVtZW50cyIsdmVyYjoiY29udGVuaXIifX07ZnVuY3Rpb24gbihlKXtyZXR1cm4gdFtlXT8/bnVsbH1jb25zdCByPXtyZWdleDoiZW50cmFkYSIsZW1haWw6ImFkcmXDp2EgZWxlY3Ryw7JuaWNhIix1cmw6IlVSTCIsZW1vamk6ImVtb2ppIix1dWlkOiJVVUlEIix1dWlkdjQ6IlVVSUR2NCIsdXVpZHY2OiJVVUlEdjYiLG5hbm9pZDoibmFub2lkIixndWlkOiJHVUlEIixjdWlkOiJjdWlkIixjdWlkMjoiY3VpZDIiLHVsaWQ6IlVMSUQiLHhpZDoiWElEIixrc3VpZDoiS1NVSUQiLGRhdGV0aW1lOiJkYXRhIGkgaG9yYSBJU08iLGRhdGU6ImRhdGEgSVNPIix0aW1lOiJob3JhIElTTyIsZHVyYXRpb246ImR1cmFkYSBJU08iLGlwdjQ6ImFkcmXDp2EgSVB2NCIsaXB2NjoiYWRyZcOnYSBJUHY2IixjaWRydjQ6InJhbmcgSVB2NCIsY2lkcnY2OiJyYW5nIElQdjYiLGJhc2U2NDoiY2FkZW5hIGNvZGlmaWNhZGEgZW4gYmFzZTY0IixiYXNlNjR1cmw6ImNhZGVuYSBjb2RpZmljYWRhIGVuIGJhc2U2NHVybCIsanNvbl9zdHJpbmc6ImNhZGVuYSBKU09OIixlMTY0OiJuw7ptZXJvIEUuMTY0Iixqd3Q6IkpXVCIsdGVtcGxhdGVfbGl0ZXJhbDoiZW50cmFkYSJ9LG89e25hbjoiTmFOIn07cmV0dXJuIGU9Pntzd2l0Y2goZS5jb2RlKXtjYXNlImludmFsaWRfdHlwZSI6e2NvbnN0IGk9b1tlLmV4cGVjdGVkXT8/ZS5leHBlY3RlZCxhPXcoZS5pbnB1dCkscz1vW2FdPz9hO3JldHVybi9eW0EtWl0vLnRlc3QoZS5leHBlY3RlZCk/YFRpcHVzIGludsOgbGlkOiBzJ2VzcGVyYXZhIGluc3RhbmNlb2YgJHtlLmV4cGVjdGVkfSwgcydoYSByZWJ1dCAke3N9YDpgVGlwdXMgaW52w6BsaWQ6IHMnZXNwZXJhdmEgJHtpfSwgcydoYSByZWJ1dCAke3N9YH1jYXNlImludmFsaWRfdmFsdWUiOnJldHVybiBlLnZhbHVlcy5sZW5ndGg9PT0xP2BWYWxvciBpbnbDoGxpZDogcydlc3BlcmF2YSAke1MoZS52YWx1ZXNbMF0pfWA6YE9wY2nDsyBpbnbDoGxpZGE6IHMnZXNwZXJhdmEgdW5hIGRlICR7XyhlLnZhbHVlcywiIG8gIil9YDtjYXNlInRvb19iaWciOntjb25zdCBpPWUuaW5jbHVzaXZlPyJjb20gYSBtw6B4aW0iOiJtZW55cyBkZSIsYT1uKGUub3JpZ2luKTtyZXR1cm4gYT9gTWFzc2EgZ3Jhbjogcydlc3BlcmF2YSBxdWUgJHtlLm9yaWdpbj8/ImVsIHZhbG9yIn0gY29udGluZ3XDqXMgJHtpfSAke2UubWF4aW11bS50b1N0cmluZygpfSAke2EudW5pdD8/ImVsZW1lbnRzIn1gOmBNYXNzYSBncmFuOiBzJ2VzcGVyYXZhIHF1ZSAke2Uub3JpZ2luPz8iZWwgdmFsb3IifSBmb3MgJHtpfSAke2UubWF4aW11bS50b1N0cmluZygpfWB9Y2FzZSJ0b29fc21hbGwiOntjb25zdCBpPWUuaW5jbHVzaXZlPyJjb20gYSBtw61uaW0iOiJtw6lzIGRlIixhPW4oZS5vcmlnaW4pO3JldHVybiBhP2BNYXNzYSBwZXRpdDogcydlc3BlcmF2YSBxdWUgJHtlLm9yaWdpbn0gY29udGluZ3XDqXMgJHtpfSAke2UubWluaW11bS50b1N0cmluZygpfSAke2EudW5pdH1gOmBNYXNzYSBwZXRpdDogcydlc3BlcmF2YSBxdWUgJHtlLm9yaWdpbn0gZm9zICR7aX0gJHtlLm1pbmltdW0udG9TdHJpbmcoKX1gfWNhc2UiaW52YWxpZF9mb3JtYXQiOntjb25zdCBpPWU7cmV0dXJuIGkuZm9ybWF0PT09InN0YXJ0c193aXRoIj9gRm9ybWF0IGludsOgbGlkOiBoYSBkZSBjb21lbsOnYXIgYW1iICIke2kucHJlZml4fSJgOmkuZm9ybWF0PT09ImVuZHNfd2l0aCI/YEZvcm1hdCBpbnbDoGxpZDogaGEgZCdhY2FiYXIgYW1iICIke2kuc3VmZml4fSJgOmkuZm9ybWF0PT09ImluY2x1ZGVzIj9gRm9ybWF0IGludsOgbGlkOiBoYSBkJ2luY2xvdXJlICIke2kuaW5jbHVkZXN9ImA6aS5mb3JtYXQ9PT0icmVnZXgiP2BGb3JtYXQgaW52w6BsaWQ6IGhhIGRlIGNvaW5jaWRpciBhbWIgZWwgcGF0csOzICR7aS5wYXR0ZXJufWA6YEZvcm1hdCBpbnbDoGxpZCBwZXIgYSAke3JbaS5mb3JtYXRdPz9lLmZvcm1hdH1gfWNhc2Uibm90X211bHRpcGxlX29mIjpyZXR1cm5gTsO6bWVybyBpbnbDoGxpZDogaGEgZGUgc2VyIG3Dumx0aXBsZSBkZSAke2UuZGl2aXNvcn1gO2Nhc2UidW5yZWNvZ25pemVkX2tleXMiOnJldHVybmBDbGF1JHtlLmtleXMubGVuZ3RoPjE/InMiOiIifSBubyByZWNvbmVndWRhJHtlLmtleXMubGVuZ3RoPjE/InMiOiIifTogJHtfKGUua2V5cywiLCAiKX1gO2Nhc2UiaW52YWxpZF9rZXkiOnJldHVybmBDbGF1IGludsOgbGlkYSBhICR7ZS5vcmlnaW59YDtjYXNlImludmFsaWRfdW5pb24iOnJldHVybiJFbnRyYWRhIGludsOgbGlkYSI7Y2FzZSJpbnZhbGlkX2VsZW1lbnQiOnJldHVybmBFbGVtZW50IGludsOgbGlkIGEgJHtlLm9yaWdpbn1gO2RlZmF1bHQ6cmV0dXJuIkVudHJhZGEgaW52w6BsaWRhIn19fTtmdW5jdGlvbiBXcCgpe3JldHVybntsb2NhbGVFcnJvcjpIcCgpfX1jb25zdCBCcD0oKT0+e2NvbnN0IHQ9e3N0cmluZzp7dW5pdDoiem5ha8WvIix2ZXJiOiJtw610In0sZmlsZTp7dW5pdDoiYmFqdMWvIix2ZXJiOiJtw610In0sYXJyYXk6e3VuaXQ6InBydmvFryIsdmVyYjoibcOtdCJ9LHNldDp7dW5pdDoicHJ2a8WvIix2ZXJiOiJtw610In19O2Z1bmN0aW9uIG4oZSl7cmV0dXJuIHRbZV0/P251bGx9Y29uc3Qgcj17cmVnZXg6InJlZ3Vsw6FybsOtIHbDvXJheiIsZW1haWw6ImUtbWFpbG92w6EgYWRyZXNhIix1cmw6IlVSTCIsZW1vamk6ImVtb2ppIix1dWlkOiJVVUlEIix1dWlkdjQ6IlVVSUR2NCIsdXVpZHY2OiJVVUlEdjYiLG5hbm9pZDoibmFub2lkIixndWlkOiJHVUlEIixjdWlkOiJjdWlkIixjdWlkMjoiY3VpZDIiLHVsaWQ6IlVMSUQiLHhpZDoiWElEIixrc3VpZDoiS1NVSUQiLGRhdGV0aW1lOiJkYXR1bSBhIMSNYXMgdmUgZm9ybcOhdHUgSVNPIixkYXRlOiJkYXR1bSB2ZSBmb3Jtw6F0dSBJU08iLHRpbWU6IsSNYXMgdmUgZm9ybcOhdHUgSVNPIixkdXJhdGlvbjoiZG9iYSB0cnbDoW7DrSBJU08iLGlwdjQ6IklQdjQgYWRyZXNhIixpcHY2OiJJUHY2IGFkcmVzYSIsY2lkcnY0OiJyb3pzYWggSVB2NCIsY2lkcnY2OiJyb3pzYWggSVB2NiIsYmFzZTY0OiLFmWV0xJt6ZWMgemFrw7Nkb3ZhbsO9IHZlIGZvcm3DoXR1IGJhc2U2NCIsYmFzZTY0dXJsOiLFmWV0xJt6ZWMgemFrw7Nkb3ZhbsO9IHZlIGZvcm3DoXR1IGJhc2U2NHVybCIsanNvbl9zdHJpbmc6IsWZZXTEm3plYyB2ZSBmb3Jtw6F0dSBKU09OIixlMTY0OiLEjcOtc2xvIEUuMTY0Iixqd3Q6IkpXVCIsdGVtcGxhdGVfbGl0ZXJhbDoidnN0dXAifSxvPXtuYW46Ik5hTiIsbnVtYmVyOiLEjcOtc2xvIixzdHJpbmc6IsWZZXTEm3plYyIsZnVuY3Rpb246ImZ1bmtjZSIsYXJyYXk6InBvbGUifTtyZXR1cm4gZT0+e3N3aXRjaChlLmNvZGUpe2Nhc2UiaW52YWxpZF90eXBlIjp7Y29uc3QgaT1vW2UuZXhwZWN0ZWRdPz9lLmV4cGVjdGVkLGE9dyhlLmlucHV0KSxzPW9bYV0/P2E7cmV0dXJuL15bQS1aXS8udGVzdChlLmV4cGVjdGVkKT9gTmVwbGF0bsO9IHZzdHVwOiBvxI1la8OhdsOhbm8gaW5zdGFuY2VvZiAke2UuZXhwZWN0ZWR9LCBvYmRyxb5lbm8gJHtzfWA6YE5lcGxhdG7DvSB2c3R1cDogb8SNZWvDoXbDoW5vICR7aX0sIG9iZHLFvmVubyAke3N9YH1jYXNlImludmFsaWRfdmFsdWUiOnJldHVybiBlLnZhbHVlcy5sZW5ndGg9PT0xP2BOZXBsYXRuw70gdnN0dXA6IG/EjWVrw6F2w6FubyAke1MoZS52YWx1ZXNbMF0pfWA6YE5lcGxhdG7DoSBtb8W+bm9zdDogb8SNZWvDoXbDoW5hIGplZG5hIHogaG9kbm90ICR7XyhlLnZhbHVlcywifCIpfWA7Y2FzZSJ0b29fYmlnIjp7Y29uc3QgaT1lLmluY2x1c2l2ZT8iPD0iOiI8IixhPW4oZS5vcmlnaW4pO3JldHVybiBhP2BIb2Rub3RhIGplIHDFmcOtbGnFoSB2ZWxrw6E6ICR7ZS5vcmlnaW4/PyJob2Rub3RhIn0gbXVzw60gbcOtdCAke2l9JHtlLm1heGltdW0udG9TdHJpbmcoKX0gJHthLnVuaXQ/PyJwcnZrxa8ifWA6YEhvZG5vdGEgamUgcMWZw61sacWhIHZlbGvDoTogJHtlLm9yaWdpbj8/ImhvZG5vdGEifSBtdXPDrSBiw710ICR7aX0ke2UubWF4aW11bS50b1N0cmluZygpfWB9Y2FzZSJ0b29fc21hbGwiOntjb25zdCBpPWUuaW5jbHVzaXZlPyI+PSI6Ij4iLGE9bihlLm9yaWdpbik7cmV0dXJuIGE/YEhvZG5vdGEgamUgcMWZw61sacWhIG1hbMOhOiAke2Uub3JpZ2luPz8iaG9kbm90YSJ9IG11c8OtIG3DrXQgJHtpfSR7ZS5taW5pbXVtLnRvU3RyaW5nKCl9ICR7YS51bml0Pz8icHJ2a8WvIn1gOmBIb2Rub3RhIGplIHDFmcOtbGnFoSBtYWzDoTogJHtlLm9yaWdpbj8/ImhvZG5vdGEifSBtdXPDrSBiw710ICR7aX0ke2UubWluaW11bS50b1N0cmluZygpfWB9Y2FzZSJpbnZhbGlkX2Zvcm1hdCI6e2NvbnN0IGk9ZTtyZXR1cm4gaS5mb3JtYXQ9PT0ic3RhcnRzX3dpdGgiP2BOZXBsYXRuw70gxZlldMSbemVjOiBtdXPDrSB6YcSNw61uYXQgbmEgIiR7aS5wcmVmaXh9ImA6aS5mb3JtYXQ9PT0iZW5kc193aXRoIj9gTmVwbGF0bsO9IMWZZXTEm3plYzogbXVzw60ga29uxI1pdCBuYSAiJHtpLnN1ZmZpeH0iYDppLmZvcm1hdD09PSJpbmNsdWRlcyI/YE5lcGxhdG7DvSDFmWV0xJt6ZWM6IG11c8OtIG9ic2Fob3ZhdCAiJHtpLmluY2x1ZGVzfSJgOmkuZm9ybWF0PT09InJlZ2V4Ij9gTmVwbGF0bsO9IMWZZXTEm3plYzogbXVzw60gb2Rwb3bDrWRhdCB2em9ydSAke2kucGF0dGVybn1gOmBOZXBsYXRuw70gZm9ybcOhdCAke3JbaS5mb3JtYXRdPz9lLmZvcm1hdH1gfWNhc2Uibm90X211bHRpcGxlX29mIjpyZXR1cm5gTmVwbGF0bsOpIMSNw61zbG86IG11c8OtIGLDvXQgbsOhc29ia2VtICR7ZS5kaXZpc29yfWA7Y2FzZSJ1bnJlY29nbml6ZWRfa2V5cyI6cmV0dXJuYE5lem7DoW3DqSBrbMOtxI1lOiAke18oZS5rZXlzLCIsICIpfWA7Y2FzZSJpbnZhbGlkX2tleSI6cmV0dXJuYE5lcGxhdG7DvSBrbMOtxI0gdiAke2Uub3JpZ2lufWA7Y2FzZSJpbnZhbGlkX3VuaW9uIjpyZXR1cm4iTmVwbGF0bsO9IHZzdHVwIjtjYXNlImludmFsaWRfZWxlbWVudCI6cmV0dXJuYE5lcGxhdG7DoSBob2Rub3RhIHYgJHtlLm9yaWdpbn1gO2RlZmF1bHQ6cmV0dXJuIk5lcGxhdG7DvSB2c3R1cCJ9fX07ZnVuY3Rpb24gVnAoKXtyZXR1cm57bG9jYWxlRXJyb3I6QnAoKX19Y29uc3QgS3A9KCk9Pntjb25zdCB0PXtzdHJpbmc6e3VuaXQ6InRlZ24iLHZlcmI6ImhhdmRlIn0sZmlsZTp7dW5pdDoiYnl0ZXMiLHZlcmI6ImhhdmRlIn0sYXJyYXk6e3VuaXQ6ImVsZW1lbnRlciIsdmVyYjoiaW5kZWhvbGR0In0sc2V0Ont1bml0OiJlbGVtZW50ZXIiLHZlcmI6ImluZGVob2xkdCJ9fTtmdW5jdGlvbiBuKGUpe3JldHVybiB0W2VdPz9udWxsfWNvbnN0IHI9e3JlZ2V4OiJpbnB1dCIsZW1haWw6ImUtbWFpbGFkcmVzc2UiLHVybDoiVVJMIixlbW9qaToiZW1vamkiLHV1aWQ6IlVVSUQiLHV1aWR2NDoiVVVJRHY0Iix1dWlkdjY6IlVVSUR2NiIsbmFub2lkOiJuYW5vaWQiLGd1aWQ6IkdVSUQiLGN1aWQ6ImN1aWQiLGN1aWQyOiJjdWlkMiIsdWxpZDoiVUxJRCIseGlkOiJYSUQiLGtzdWlkOiJLU1VJRCIsZGF0ZXRpbWU6IklTTyBkYXRvLSBvZyBrbG9ra2VzbMOmdCIsZGF0ZToiSVNPLWRhdG8iLHRpbWU6IklTTy1rbG9ra2VzbMOmdCIsZHVyYXRpb246IklTTy12YXJpZ2hlZCIsaXB2NDoiSVB2NC1vbXLDpWRlIixpcHY2OiJJUHY2LW9tcsOlZGUiLGNpZHJ2NDoiSVB2NC1zcGVrdHJ1bSIsY2lkcnY2OiJJUHY2LXNwZWt0cnVtIixiYXNlNjQ6ImJhc2U2NC1rb2RldCBzdHJlbmciLGJhc2U2NHVybDoiYmFzZTY0dXJsLWtvZGV0IHN0cmVuZyIsanNvbl9zdHJpbmc6IkpTT04tc3RyZW5nIixlMTY0OiJFLjE2NC1udW1tZXIiLGp3dDoiSldUIix0ZW1wbGF0ZV9saXRlcmFsOiJpbnB1dCJ9LG89e25hbjoiTmFOIixzdHJpbmc6InN0cmVuZyIsbnVtYmVyOiJ0YWwiLGJvb2xlYW46ImJvb2xlYW4iLGFycmF5OiJsaXN0ZSIsb2JqZWN0OiJvYmpla3QiLHNldDoic8OmdCIsZmlsZToiZmlsIn07cmV0dXJuIGU9Pntzd2l0Y2goZS5jb2RlKXtjYXNlImludmFsaWRfdHlwZSI6e2NvbnN0IGk9b1tlLmV4cGVjdGVkXT8/ZS5leHBlY3RlZCxhPXcoZS5pbnB1dCkscz1vW2FdPz9hO3JldHVybi9eW0EtWl0vLnRlc3QoZS5leHBlY3RlZCk/YFVneWxkaWd0IGlucHV0OiBmb3J2ZW50ZWRlIGluc3RhbmNlb2YgJHtlLmV4cGVjdGVkfSwgZmlrICR7c31gOmBVZ3lsZGlndCBpbnB1dDogZm9ydmVudGVkZSAke2l9LCBmaWsgJHtzfWB9Y2FzZSJpbnZhbGlkX3ZhbHVlIjpyZXR1cm4gZS52YWx1ZXMubGVuZ3RoPT09MT9gVWd5bGRpZyB2w6ZyZGk6IGZvcnZlbnRlZGUgJHtTKGUudmFsdWVzWzBdKX1gOmBVZ3lsZGlndCB2YWxnOiBmb3J2ZW50ZWRlIGVuIGFmIGbDuGxnZW5kZSAke18oZS52YWx1ZXMsInwiKX1gO2Nhc2UidG9vX2JpZyI6e2NvbnN0IGk9ZS5pbmNsdXNpdmU/Ijw9IjoiPCIsYT1uKGUub3JpZ2luKSxzPW9bZS5vcmlnaW5dPz9lLm9yaWdpbjtyZXR1cm4gYT9gRm9yIHN0b3I6IGZvcnZlbnRlZGUgJHtzPz8idmFsdWUifSAke2EudmVyYn0gJHtpfSAke2UubWF4aW11bS50b1N0cmluZygpfSAke2EudW5pdD8/ImVsZW1lbnRlciJ9YDpgRm9yIHN0b3I6IGZvcnZlbnRlZGUgJHtzPz8idmFsdWUifSBoYXZkZSAke2l9ICR7ZS5tYXhpbXVtLnRvU3RyaW5nKCl9YH1jYXNlInRvb19zbWFsbCI6e2NvbnN0IGk9ZS5pbmNsdXNpdmU/Ij49IjoiPiIsYT1uKGUub3JpZ2luKSxzPW9bZS5vcmlnaW5dPz9lLm9yaWdpbjtyZXR1cm4gYT9gRm9yIGxpbGxlOiBmb3J2ZW50ZWRlICR7c30gJHthLnZlcmJ9ICR7aX0gJHtlLm1pbmltdW0udG9TdHJpbmcoKX0gJHthLnVuaXR9YDpgRm9yIGxpbGxlOiBmb3J2ZW50ZWRlICR7c30gaGF2ZGUgJHtpfSAke2UubWluaW11bS50b1N0cmluZygpfWB9Y2FzZSJpbnZhbGlkX2Zvcm1hdCI6e2NvbnN0IGk9ZTtyZXR1cm4gaS5mb3JtYXQ9PT0ic3RhcnRzX3dpdGgiP2BVZ3lsZGlnIHN0cmVuZzogc2thbCBzdGFydGUgbWVkICIke2kucHJlZml4fSJgOmkuZm9ybWF0PT09ImVuZHNfd2l0aCI/YFVneWxkaWcgc3RyZW5nOiBza2FsIGVuZGUgbWVkICIke2kuc3VmZml4fSJgOmkuZm9ybWF0PT09ImluY2x1ZGVzIj9gVWd5bGRpZyBzdHJlbmc6IHNrYWwgaW5kZWhvbGRlICIke2kuaW5jbHVkZXN9ImA6aS5mb3JtYXQ9PT0icmVnZXgiP2BVZ3lsZGlnIHN0cmVuZzogc2thbCBtYXRjaGUgbcO4bnN0ZXJldCAke2kucGF0dGVybn1gOmBVZ3lsZGlnICR7cltpLmZvcm1hdF0/P2UuZm9ybWF0fWB9Y2FzZSJub3RfbXVsdGlwbGVfb2YiOnJldHVybmBVZ3lsZGlndCB0YWw6IHNrYWwgdsOmcmUgZGVsZWxpZ3QgbWVkICR7ZS5kaXZpc29yfWA7Y2FzZSJ1bnJlY29nbml6ZWRfa2V5cyI6cmV0dXJuYCR7ZS5rZXlzLmxlbmd0aD4xPyJVa2VuZHRlIG7DuGdsZXIiOiJVa2VuZHQgbsO4Z2xlIn06ICR7XyhlLmtleXMsIiwgIil9YDtjYXNlImludmFsaWRfa2V5IjpyZXR1cm5gVWd5bGRpZyBuw7hnbGUgaSAke2Uub3JpZ2lufWA7Y2FzZSJpbnZhbGlkX3VuaW9uIjpyZXR1cm4iVWd5bGRpZ3QgaW5wdXQ6IG1hdGNoZXIgaW5nZW4gYWYgZGUgdGlsbGFkdGUgdHlwZXIiO2Nhc2UiaW52YWxpZF9lbGVtZW50IjpyZXR1cm5gVWd5bGRpZyB2w6ZyZGkgaSAke2Uub3JpZ2lufWA7ZGVmYXVsdDpyZXR1cm4iVWd5bGRpZ3QgaW5wdXQifX19O2Z1bmN0aW9uIEdwKCl7cmV0dXJue2xvY2FsZUVycm9yOktwKCl9fWNvbnN0IFhwPSgpPT57Y29uc3QgdD17c3RyaW5nOnt1bml0OiJaZWljaGVuIix2ZXJiOiJ6dSBoYWJlbiJ9LGZpbGU6e3VuaXQ6IkJ5dGVzIix2ZXJiOiJ6dSBoYWJlbiJ9LGFycmF5Ont1bml0OiJFbGVtZW50ZSIsdmVyYjoienUgaGFiZW4ifSxzZXQ6e3VuaXQ6IkVsZW1lbnRlIix2ZXJiOiJ6dSBoYWJlbiJ9fTtmdW5jdGlvbiBuKGUpe3JldHVybiB0W2VdPz9udWxsfWNvbnN0IHI9e3JlZ2V4OiJFaW5nYWJlIixlbWFpbDoiRS1NYWlsLUFkcmVzc2UiLHVybDoiVVJMIixlbW9qaToiRW1vamkiLHV1aWQ6IlVVSUQiLHV1aWR2NDoiVVVJRHY0Iix1dWlkdjY6IlVVSUR2NiIsbmFub2lkOiJuYW5vaWQiLGd1aWQ6IkdVSUQiLGN1aWQ6ImN1aWQiLGN1aWQyOiJjdWlkMiIsdWxpZDoiVUxJRCIseGlkOiJYSUQiLGtzdWlkOiJLU1VJRCIsZGF0ZXRpbWU6IklTTy1EYXR1bSB1bmQgLVVocnplaXQiLGRhdGU6IklTTy1EYXR1bSIsdGltZToiSVNPLVVocnplaXQiLGR1cmF0aW9uOiJJU08tRGF1ZXIiLGlwdjQ6IklQdjQtQWRyZXNzZSIsaXB2NjoiSVB2Ni1BZHJlc3NlIixjaWRydjQ6IklQdjQtQmVyZWljaCIsY2lkcnY2OiJJUHY2LUJlcmVpY2giLGJhc2U2NDoiQmFzZTY0LWNvZGllcnRlciBTdHJpbmciLGJhc2U2NHVybDoiQmFzZTY0LVVSTC1jb2RpZXJ0ZXIgU3RyaW5nIixqc29uX3N0cmluZzoiSlNPTi1TdHJpbmciLGUxNjQ6IkUuMTY0LU51bW1lciIsand0OiJKV1QiLHRlbXBsYXRlX2xpdGVyYWw6IkVpbmdhYmUifSxvPXtuYW46Ik5hTiIsbnVtYmVyOiJaYWhsIixhcnJheToiQXJyYXkifTtyZXR1cm4gZT0+e3N3aXRjaChlLmNvZGUpe2Nhc2UiaW52YWxpZF90eXBlIjp7Y29uc3QgaT1vW2UuZXhwZWN0ZWRdPz9lLmV4cGVjdGVkLGE9dyhlLmlucHV0KSxzPW9bYV0/P2E7cmV0dXJuL15bQS1aXS8udGVzdChlLmV4cGVjdGVkKT9gVW5nw7xsdGlnZSBFaW5nYWJlOiBlcndhcnRldCBpbnN0YW5jZW9mICR7ZS5leHBlY3RlZH0sIGVyaGFsdGVuICR7c31gOmBVbmfDvGx0aWdlIEVpbmdhYmU6IGVyd2FydGV0ICR7aX0sIGVyaGFsdGVuICR7c31gfWNhc2UiaW52YWxpZF92YWx1ZSI6cmV0dXJuIGUudmFsdWVzLmxlbmd0aD09PTE/YFVuZ8O8bHRpZ2UgRWluZ2FiZTogZXJ3YXJ0ZXQgJHtTKGUudmFsdWVzWzBdKX1gOmBVbmfDvGx0aWdlIE9wdGlvbjogZXJ3YXJ0ZXQgZWluZSB2b24gJHtfKGUudmFsdWVzLCJ8Iil9YDtjYXNlInRvb19iaWciOntjb25zdCBpPWUuaW5jbHVzaXZlPyI8PSI6IjwiLGE9bihlLm9yaWdpbik7cmV0dXJuIGE/YFp1IGdyb8OfOiBlcndhcnRldCwgZGFzcyAke2Uub3JpZ2luPz8iV2VydCJ9ICR7aX0ke2UubWF4aW11bS50b1N0cmluZygpfSAke2EudW5pdD8/IkVsZW1lbnRlIn0gaGF0YDpgWnUgZ3Jvw586IGVyd2FydGV0LCBkYXNzICR7ZS5vcmlnaW4/PyJXZXJ0In0gJHtpfSR7ZS5tYXhpbXVtLnRvU3RyaW5nKCl9IGlzdGB9Y2FzZSJ0b29fc21hbGwiOntjb25zdCBpPWUuaW5jbHVzaXZlPyI+PSI6Ij4iLGE9bihlLm9yaWdpbik7cmV0dXJuIGE/YFp1IGtsZWluOiBlcndhcnRldCwgZGFzcyAke2Uub3JpZ2lufSAke2l9JHtlLm1pbmltdW0udG9TdHJpbmcoKX0gJHthLnVuaXR9IGhhdGA6YFp1IGtsZWluOiBlcndhcnRldCwgZGFzcyAke2Uub3JpZ2lufSAke2l9JHtlLm1pbmltdW0udG9TdHJpbmcoKX0gaXN0YH1jYXNlImludmFsaWRfZm9ybWF0Ijp7Y29uc3QgaT1lO3JldHVybiBpLmZvcm1hdD09PSJzdGFydHNfd2l0aCI/YFVuZ8O8bHRpZ2VyIFN0cmluZzogbXVzcyBtaXQgIiR7aS5wcmVmaXh9IiBiZWdpbm5lbmA6aS5mb3JtYXQ9PT0iZW5kc193aXRoIj9gVW5nw7xsdGlnZXIgU3RyaW5nOiBtdXNzIG1pdCAiJHtpLnN1ZmZpeH0iIGVuZGVuYDppLmZvcm1hdD09PSJpbmNsdWRlcyI/YFVuZ8O8bHRpZ2VyIFN0cmluZzogbXVzcyAiJHtpLmluY2x1ZGVzfSIgZW50aGFsdGVuYDppLmZvcm1hdD09PSJyZWdleCI/YFVuZ8O8bHRpZ2VyIFN0cmluZzogbXVzcyBkZW0gTXVzdGVyICR7aS5wYXR0ZXJufSBlbnRzcHJlY2hlbmA6YFVuZ8O8bHRpZzogJHtyW2kuZm9ybWF0XT8/ZS5mb3JtYXR9YH1jYXNlIm5vdF9tdWx0aXBsZV9vZiI6cmV0dXJuYFVuZ8O8bHRpZ2UgWmFobDogbXVzcyBlaW4gVmllbGZhY2hlcyB2b24gJHtlLmRpdmlzb3J9IHNlaW5gO2Nhc2UidW5yZWNvZ25pemVkX2tleXMiOnJldHVybmAke2Uua2V5cy5sZW5ndGg+MT8iVW5iZWthbm50ZSBTY2hsw7xzc2VsIjoiVW5iZWthbm50ZXIgU2NobMO8c3NlbCJ9OiAke18oZS5rZXlzLCIsICIpfWA7Y2FzZSJpbnZhbGlkX2tleSI6cmV0dXJuYFVuZ8O8bHRpZ2VyIFNjaGzDvHNzZWwgaW4gJHtlLm9yaWdpbn1gO2Nhc2UiaW52YWxpZF91bmlvbiI6cmV0dXJuIlVuZ8O8bHRpZ2UgRWluZ2FiZSI7Y2FzZSJpbnZhbGlkX2VsZW1lbnQiOnJldHVybmBVbmfDvGx0aWdlciBXZXJ0IGluICR7ZS5vcmlnaW59YDtkZWZhdWx0OnJldHVybiJVbmfDvGx0aWdlIEVpbmdhYmUifX19O2Z1bmN0aW9uIFlwKCl7cmV0dXJue2xvY2FsZUVycm9yOlhwKCl9fWNvbnN0IFFwPSgpPT57Y29uc3QgdD17c3RyaW5nOnt1bml0OiLPh86xz4HOsc66z4TOrs+BzrXPgiIsdmVyYjoizr3OsSDOrc+HzrXOuSJ9LGZpbGU6e3VuaXQ6ImJ5dGVzIix2ZXJiOiLOvc6xIM6tz4fOtc65In0sYXJyYXk6e3VuaXQ6Is+Dz4TOv865z4fOtc6vzrEiLHZlcmI6Is69zrEgzq3Ph861zrkifSxzZXQ6e3VuaXQ6Is+Dz4TOv865z4fOtc6vzrEiLHZlcmI6Is69zrEgzq3Ph861zrkifSxtYXA6e3VuaXQ6Is66zrHPhM6xz4fPic+Bzq7Pg861zrnPgiIsdmVyYjoizr3OsSDOrc+HzrXOuSJ9fTtmdW5jdGlvbiBuKGUpe3JldHVybiB0W2VdPz9udWxsfWNvbnN0IHI9e3JlZ2V4OiLOtc6vz4POv860zr/PgiIsZW1haWw6Is60zrnOtc+NzrjPhc69z4POtyBlbWFpbCIsdXJsOiJVUkwiLGVtb2ppOiJlbW9qaSIsdXVpZDoiVVVJRCIsdXVpZHY0OiJVVUlEdjQiLHV1aWR2NjoiVVVJRHY2IixuYW5vaWQ6Im5hbm9pZCIsZ3VpZDoiR1VJRCIsY3VpZDoiY3VpZCIsY3VpZDI6ImN1aWQyIix1bGlkOiJVTElEIix4aWQ6IlhJRCIsa3N1aWQ6IktTVUlEIixkYXRldGltZToiSVNPIM63zrzOtc+Bzr/OvM63zr3Or86xIM66zrHOuSDPjs+BzrEiLGRhdGU6IklTTyDOt868zrXPgc6/zrzOt869zq/OsSIsdGltZToiSVNPIM+Oz4HOsSIsZHVyYXRpb246IklTTyDOtM65zqzPgc66zrXOuc6xIixpcHY0OiLOtM65zrXPjc64z4XOvc+DzrcgSVB2NCIsaXB2NjoizrTOuc61z43OuM+Fzr3Pg863IElQdjYiLG1hYzoizrTOuc61z43OuM+Fzr3Pg863IE1BQyIsY2lkcnY0OiLOtc+Nz4HOv8+CIElQdjQiLGNpZHJ2NjoizrXPjc+Bzr/PgiBJUHY2IixiYXNlNjQ6Is+Dz4XOvM6yzr/Ou86/z4POtc65z4HOrCDOus+JzrTOuc66zr/PgM6/zrnOt868zq3Ovc63IM+DzrUgYmFzZTY0IixiYXNlNjR1cmw6Is+Dz4XOvM6yzr/Ou86/z4POtc65z4HOrCDOus+JzrTOuc66zr/PgM6/zrnOt868zq3Ovc63IM+DzrUgYmFzZTY0dXJsIixqc29uX3N0cmluZzoiz4PPhc68zrLOv867zr/Pg861zrnPgc6sIEpTT04iLGUxNjQ6Is6xz4HOuc64zrzPjM+CIEUuMTY0Iixqd3Q6IkpXVCIsdGVtcGxhdGVfbGl0ZXJhbDoizrXOr8+Dzr/OtM6/z4IifSxvPXtuYW46Ik5hTiJ9O3JldHVybiBlPT57c3dpdGNoKGUuY29kZSl7Y2FzZSJpbnZhbGlkX3R5cGUiOntjb25zdCBpPW9bZS5leHBlY3RlZF0/P2UuZXhwZWN0ZWQsYT13KGUuaW5wdXQpLHM9b1thXT8/YTtyZXR1cm4gdHlwZW9mIGUuZXhwZWN0ZWQ9PSJzdHJpbmciJiYvXltBLVpdLy50ZXN0KGUuZXhwZWN0ZWQpP2DOnM63IM6tzrPOus+Fz4HOtyDOtc6vz4POv860zr/PgjogzrHOvc6xzrzOtc69z4zPhM6xzr0gaW5zdGFuY2VvZiAke2UuZXhwZWN0ZWR9LCDOu86uz4bOuM63zrrOtSAke3N9YDpgzpzOtyDOrc6zzrrPhc+BzrcgzrXOr8+Dzr/OtM6/z4I6IM6xzr3Osc68zrXOvc+Mz4TOsc69ICR7aX0sIM67zq7Phs64zrfOus61ICR7c31gfWNhc2UiaW52YWxpZF92YWx1ZSI6cmV0dXJuIGUudmFsdWVzLmxlbmd0aD09PTE/YM6czrcgzq3Os866z4XPgc63IM61zq/Pg86/zrTOv8+COiDOsc69zrHOvM61zr3PjM+EzrHOvSAke1MoZS52YWx1ZXNbMF0pfWA6YM6czrcgzq3Os866z4XPgc63IM61z4DOuc67zr/Os86uOiDOsc69zrHOvM61zr3PjM+EzrHOvSDOrc69zrEgzrHPgM+MICR7XyhlLnZhbHVlcywifCIpfWA7Y2FzZSJ0b29fYmlnIjp7Y29uc3QgaT1lLmluY2x1c2l2ZT8iPD0iOiI8IixhPW4oZS5vcmlnaW4pO3JldHVybiBhP2DOoM6/zrvPjSDOvM61zrPOrM67zr86IM6xzr3Osc68zrXOvc+Mz4TOsc69ICR7ZS5vcmlnaW4/PyLPhM65zrzOriJ9IM69zrEgzq3Ph861zrkgJHtpfSR7ZS5tYXhpbXVtLnRvU3RyaW5nKCl9ICR7YS51bml0Pz8iz4PPhM6/zrnPh861zq/OsSJ9YDpgzqDOv867z40gzrzOtc6zzqzOu86/OiDOsc69zrHOvM61zr3PjM+EzrHOvSAke2Uub3JpZ2luPz8iz4TOuc68zq4ifSDOvc6xIM61zq/Ovc6xzrkgJHtpfSR7ZS5tYXhpbXVtLnRvU3RyaW5nKCl9YH1jYXNlInRvb19zbWFsbCI6e2NvbnN0IGk9ZS5pbmNsdXNpdmU/Ij49IjoiPiIsYT1uKGUub3JpZ2luKTtyZXR1cm4gYT9gzqDOv867z40gzrzOuc66z4HPjDogzrHOvc6xzrzOtc69z4zPhM6xzr0gJHtlLm9yaWdpbn0gzr3OsSDOrc+HzrXOuSAke2l9JHtlLm1pbmltdW0udG9TdHJpbmcoKX0gJHthLnVuaXR9YDpgzqDOv867z40gzrzOuc66z4HPjDogzrHOvc6xzrzOtc69z4zPhM6xzr0gJHtlLm9yaWdpbn0gzr3OsSDOtc6vzr3Osc65ICR7aX0ke2UubWluaW11bS50b1N0cmluZygpfWB9Y2FzZSJpbnZhbGlkX2Zvcm1hdCI6e2NvbnN0IGk9ZTtyZXR1cm4gaS5mb3JtYXQ9PT0ic3RhcnRzX3dpdGgiP2DOnM63IM6tzrPOus+Fz4HOtyDPg8+FzrzOss6/zrvOv8+DzrXOuc+Bzqw6IM+Az4HOrc+AzrXOuSDOvc6xIM6+zrXOus65zr3OrCDOvM61ICIke2kucHJlZml4fSJgOmkuZm9ybWF0PT09ImVuZHNfd2l0aCI/YM6czrcgzq3Os866z4XPgc63IM+Dz4XOvM6yzr/Ou86/z4POtc65z4HOrDogz4DPgc6tz4DOtc65IM69zrEgz4TOtc67zrXOuc+Ozr3Otc65IM68zrUgIiR7aS5zdWZmaXh9ImA6aS5mb3JtYXQ9PT0iaW5jbHVkZXMiP2DOnM63IM6tzrPOus+Fz4HOtyDPg8+FzrzOss6/zrvOv8+DzrXOuc+Bzqw6IM+Az4HOrc+AzrXOuSDOvc6xIM+AzrXPgc65zq3Ph861zrkgIiR7aS5pbmNsdWRlc30iYDppLmZvcm1hdD09PSJyZWdleCI/YM6czrcgzq3Os866z4XPgc63IM+Dz4XOvM6yzr/Ou86/z4POtc65z4HOrDogz4DPgc6tz4DOtc65IM69zrEgz4TOsc65z4HOuc6szrbOtc65IM68zrUgz4TOvyDOvM6/z4TOr86yzr8gJHtpLnBhdHRlcm59YDpgzpzOtyDOrc6zzrrPhc+Bzr86ICR7cltpLmZvcm1hdF0/P2UuZm9ybWF0fWB9Y2FzZSJub3RfbXVsdGlwbGVfb2YiOnJldHVybmDOnM63IM6tzrPOus+Fz4HOv8+CIM6xz4HOuc64zrzPjM+COiDPgM+Bzq3PgM61zrkgzr3OsSDOtc6vzr3Osc65IM+Azr/Ou867zrHPgM67zqzPg865zr8gz4TOv8+FICR7ZS5kaXZpc29yfWA7Y2FzZSJ1bnJlY29nbml6ZWRfa2V5cyI6cmV0dXJuYM6GzrPOvc+Jz4PPhCR7ZS5rZXlzLmxlbmd0aD4xPyLOsSI6Is6/In0gzrrOu861zrnOtCR7ZS5rZXlzLmxlbmd0aD4xPyLOuc6sIjoizq8ifTogJHtfKGUua2V5cywiLCAiKX1gO2Nhc2UiaW52YWxpZF9rZXkiOnJldHVybmDOnM63IM6tzrPOus+Fz4HOvyDOus67zrXOuc60zq8gz4PPhM6/ICR7ZS5vcmlnaW59YDtjYXNlImludmFsaWRfdW5pb24iOnJldHVybiLOnM63IM6tzrPOus+Fz4HOtyDOtc6vz4POv860zr/PgiI7Y2FzZSJpbnZhbGlkX2VsZW1lbnQiOnJldHVybmDOnM63IM6tzrPOus+Fz4HOtyDPhM65zrzOriDPg8+Ezr8gJHtlLm9yaWdpbn1gO2RlZmF1bHQ6cmV0dXJuIs6czrcgzq3Os866z4XPgc63IM61zq/Pg86/zrTOv8+CIn19fTtmdW5jdGlvbiBlZigpe3JldHVybntsb2NhbGVFcnJvcjpRcCgpfX1jb25zdCB0Zj0oKT0+e2NvbnN0IHQ9e3N0cmluZzp7dW5pdDoiY2hhcmFjdGVycyIsdmVyYjoidG8gaGF2ZSJ9LGZpbGU6e3VuaXQ6ImJ5dGVzIix2ZXJiOiJ0byBoYXZlIn0sYXJyYXk6e3VuaXQ6Iml0ZW1zIix2ZXJiOiJ0byBoYXZlIn0sc2V0Ont1bml0OiJpdGVtcyIsdmVyYjoidG8gaGF2ZSJ9LG1hcDp7dW5pdDoiZW50cmllcyIsdmVyYjoidG8gaGF2ZSJ9fTtmdW5jdGlvbiBuKGUpe3JldHVybiB0W2VdPz9udWxsfWNvbnN0IHI9e3JlZ2V4OiJpbnB1dCIsZW1haWw6ImVtYWlsIGFkZHJlc3MiLHVybDoiVVJMIixlbW9qaToiZW1vamkiLHV1aWQ6IlVVSUQiLHV1aWR2NDoiVVVJRHY0Iix1dWlkdjY6IlVVSUR2NiIsbmFub2lkOiJuYW5vaWQiLGd1aWQ6IkdVSUQiLGN1aWQ6ImN1aWQiLGN1aWQyOiJjdWlkMiIsdWxpZDoiVUxJRCIseGlkOiJYSUQiLGtzdWlkOiJLU1VJRCIsZGF0ZXRpbWU6IklTTyBkYXRldGltZSIsZGF0ZToiSVNPIGRhdGUiLHRpbWU6IklTTyB0aW1lIixkdXJhdGlvbjoiSVNPIGR1cmF0aW9uIixpcHY0OiJJUHY0IGFkZHJlc3MiLGlwdjY6IklQdjYgYWRkcmVzcyIsbWFjOiJNQUMgYWRkcmVzcyIsY2lkcnY0OiJJUHY0IHJhbmdlIixjaWRydjY6IklQdjYgcmFuZ2UiLGJhc2U2NDoiYmFzZTY0LWVuY29kZWQgc3RyaW5nIixiYXNlNjR1cmw6ImJhc2U2NHVybC1lbmNvZGVkIHN0cmluZyIsanNvbl9zdHJpbmc6IkpTT04gc3RyaW5nIixlMTY0OiJFLjE2NCBudW1iZXIiLGp3dDoiSldUIix0ZW1wbGF0ZV9saXRlcmFsOiJpbnB1dCJ9LG89e25hbjoiTmFOIn07cmV0dXJuIGU9Pntzd2l0Y2goZS5jb2RlKXtjYXNlImludmFsaWRfdHlwZSI6e2NvbnN0IGk9b1tlLmV4cGVjdGVkXT8/ZS5leHBlY3RlZCxhPXcoZS5pbnB1dCkscz1vW2FdPz9hO3JldHVybmBJbnZhbGlkIGlucHV0OiBleHBlY3RlZCAke2l9LCByZWNlaXZlZCAke3N9YH1jYXNlImludmFsaWRfdmFsdWUiOnJldHVybiBlLnZhbHVlcy5sZW5ndGg9PT0xP2BJbnZhbGlkIGlucHV0OiBleHBlY3RlZCAke1MoZS52YWx1ZXNbMF0pfWA6YEludmFsaWQgb3B0aW9uOiBleHBlY3RlZCBvbmUgb2YgJHtfKGUudmFsdWVzLCJ8Iil9YDtjYXNlInRvb19iaWciOntjb25zdCBpPWUuaW5jbHVzaXZlPyI8PSI6IjwiLGE9bihlLm9yaWdpbik7cmV0dXJuIGE/YFRvbyBiaWc6IGV4cGVjdGVkICR7ZS5vcmlnaW4/PyJ2YWx1ZSJ9IHRvIGhhdmUgJHtpfSR7ZS5tYXhpbXVtLnRvU3RyaW5nKCl9ICR7YS51bml0Pz8iZWxlbWVudHMifWA6YFRvbyBiaWc6IGV4cGVjdGVkICR7ZS5vcmlnaW4/PyJ2YWx1ZSJ9IHRvIGJlICR7aX0ke2UubWF4aW11bS50b1N0cmluZygpfWB9Y2FzZSJ0b29fc21hbGwiOntjb25zdCBpPWUuaW5jbHVzaXZlPyI+PSI6Ij4iLGE9bihlLm9yaWdpbik7cmV0dXJuIGE/YFRvbyBzbWFsbDogZXhwZWN0ZWQgJHtlLm9yaWdpbn0gdG8gaGF2ZSAke2l9JHtlLm1pbmltdW0udG9TdHJpbmcoKX0gJHthLnVuaXR9YDpgVG9vIHNtYWxsOiBleHBlY3RlZCAke2Uub3JpZ2lufSB0byBiZSAke2l9JHtlLm1pbmltdW0udG9TdHJpbmcoKX1gfWNhc2UiaW52YWxpZF9mb3JtYXQiOntjb25zdCBpPWU7cmV0dXJuIGkuZm9ybWF0PT09InN0YXJ0c193aXRoIj9gSW52YWxpZCBzdHJpbmc6IG11c3Qgc3RhcnQgd2l0aCAiJHtpLnByZWZpeH0iYDppLmZvcm1hdD09PSJlbmRzX3dpdGgiP2BJbnZhbGlkIHN0cmluZzogbXVzdCBlbmQgd2l0aCAiJHtpLnN1ZmZpeH0iYDppLmZvcm1hdD09PSJpbmNsdWRlcyI/YEludmFsaWQgc3RyaW5nOiBtdXN0IGluY2x1ZGUgIiR7aS5pbmNsdWRlc30iYDppLmZvcm1hdD09PSJyZWdleCI/YEludmFsaWQgc3RyaW5nOiBtdXN0IG1hdGNoIHBhdHRlcm4gJHtpLnBhdHRlcm59YDpgSW52YWxpZCAke3JbaS5mb3JtYXRdPz9lLmZvcm1hdH1gfWNhc2Uibm90X211bHRpcGxlX29mIjpyZXR1cm5gSW52YWxpZCBudW1iZXI6IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAke2UuZGl2aXNvcn1gO2Nhc2UidW5yZWNvZ25pemVkX2tleXMiOnJldHVybmBVbnJlY29nbml6ZWQga2V5JHtlLmtleXMubGVuZ3RoPjE/InMiOiIifTogJHtfKGUua2V5cywiLCAiKX1gO2Nhc2UiaW52YWxpZF9rZXkiOnJldHVybmBJbnZhbGlkIGtleSBpbiAke2Uub3JpZ2lufWA7Y2FzZSJpbnZhbGlkX3VuaW9uIjpyZXR1cm4gZS5vcHRpb25zJiZBcnJheS5pc0FycmF5KGUub3B0aW9ucykmJmUub3B0aW9ucy5sZW5ndGg+MD9gSW52YWxpZCBkaXNjcmltaW5hdG9yIHZhbHVlLiBFeHBlY3RlZCAke2Uub3B0aW9ucy5tYXAoYT0+YCcke2F9J2ApLmpvaW4oIiB8ICIpfWA6IkludmFsaWQgaW5wdXQiO2Nhc2UiaW52YWxpZF9lbGVtZW50IjpyZXR1cm5gSW52YWxpZCB2YWx1ZSBpbiAke2Uub3JpZ2lufWA7ZGVmYXVsdDpyZXR1cm4iSW52YWxpZCBpbnB1dCJ9fX07ZnVuY3Rpb24gSWwoKXtyZXR1cm57bG9jYWxlRXJyb3I6dGYoKX19Y29uc3QgbmY9KCk9Pntjb25zdCB0PXtzdHJpbmc6e3VuaXQ6ImthcmFrdHJvam4iLHZlcmI6ImhhdmkifSxmaWxlOnt1bml0OiJiYWp0b2puIix2ZXJiOiJoYXZpIn0sYXJyYXk6e3VuaXQ6ImVsZW1lbnRvam4iLHZlcmI6ImhhdmkifSxzZXQ6e3VuaXQ6ImVsZW1lbnRvam4iLHZlcmI6ImhhdmkifX07ZnVuY3Rpb24gbihlKXtyZXR1cm4gdFtlXT8/bnVsbH1jb25zdCByPXtyZWdleDoiZW5pZ28iLGVtYWlsOiJyZXRhZHJlc28iLHVybDoiVVJMIixlbW9qaToiZW1vxJ1pbyIsdXVpZDoiVVVJRCIsdXVpZHY0OiJVVUlEdjQiLHV1aWR2NjoiVVVJRHY2IixuYW5vaWQ6Im5hbm9pZCIsZ3VpZDoiR1VJRCIsY3VpZDoiY3VpZCIsY3VpZDI6ImN1aWQyIix1bGlkOiJVTElEIix4aWQ6IlhJRCIsa3N1aWQ6IktTVUlEIixkYXRldGltZToiSVNPLWRhdG90ZW1wbyIsZGF0ZToiSVNPLWRhdG8iLHRpbWU6IklTTy10ZW1wbyIsZHVyYXRpb246IklTTy1kYcWtcm8iLGlwdjQ6IklQdjQtYWRyZXNvIixpcHY2OiJJUHY2LWFkcmVzbyIsY2lkcnY0OiJJUHY0LXJhbmdvIixjaWRydjY6IklQdjYtcmFuZ28iLGJhc2U2NDoiNjQtdW1lIGtvZGl0YSBrYXJha3RyYXJvIixiYXNlNjR1cmw6IlVSTC02NC11bWUga29kaXRhIGthcmFrdHJhcm8iLGpzb25fc3RyaW5nOiJKU09OLWthcmFrdHJhcm8iLGUxNjQ6IkUuMTY0LW5vbWJybyIsand0OiJKV1QiLHRlbXBsYXRlX2xpdGVyYWw6ImVuaWdvIn0sbz17bmFuOiJOYU4iLG51bWJlcjoibm9tYnJvIixhcnJheToidGFiZWxvIixudWxsOiJzZW52YWxvcmEifTtyZXR1cm4gZT0+e3N3aXRjaChlLmNvZGUpe2Nhc2UiaW52YWxpZF90eXBlIjp7Y29uc3QgaT1vW2UuZXhwZWN0ZWRdPz9lLmV4cGVjdGVkLGE9dyhlLmlucHV0KSxzPW9bYV0/P2E7cmV0dXJuL15bQS1aXS8udGVzdChlLmV4cGVjdGVkKT9gTmV2YWxpZGEgZW5pZ286IGF0ZW5kacSdaXMgaW5zdGFuY2VvZiAke2UuZXhwZWN0ZWR9LCByaWNldmnEnWlzICR7c31gOmBOZXZhbGlkYSBlbmlnbzogYXRlbmRpxJ1pcyAke2l9LCByaWNldmnEnWlzICR7c31gfWNhc2UiaW52YWxpZF92YWx1ZSI6cmV0dXJuIGUudmFsdWVzLmxlbmd0aD09PTE/YE5ldmFsaWRhIGVuaWdvOiBhdGVuZGnEnWlzICR7UyhlLnZhbHVlc1swXSl9YDpgTmV2YWxpZGEgb3BjaW86IGF0ZW5kacSdaXMgdW51IGVsICR7XyhlLnZhbHVlcywifCIpfWA7Y2FzZSJ0b29fYmlnIjp7Y29uc3QgaT1lLmluY2x1c2l2ZT8iPD0iOiI8IixhPW4oZS5vcmlnaW4pO3JldHVybiBhP2BUcm8gZ3JhbmRhOiBhdGVuZGnEnWlzIGtlICR7ZS5vcmlnaW4/PyJ2YWxvcm8ifSBoYXZ1ICR7aX0ke2UubWF4aW11bS50b1N0cmluZygpfSAke2EudW5pdD8/ImVsZW1lbnRvam4ifWA6YFRybyBncmFuZGE6IGF0ZW5kacSdaXMga2UgJHtlLm9yaWdpbj8/InZhbG9ybyJ9IGhhdnUgJHtpfSR7ZS5tYXhpbXVtLnRvU3RyaW5nKCl9YH1jYXNlInRvb19zbWFsbCI6e2NvbnN0IGk9ZS5pbmNsdXNpdmU/Ij49IjoiPiIsYT1uKGUub3JpZ2luKTtyZXR1cm4gYT9gVHJvIG1hbGdyYW5kYTogYXRlbmRpxJ1pcyBrZSAke2Uub3JpZ2lufSBoYXZ1ICR7aX0ke2UubWluaW11bS50b1N0cmluZygpfSAke2EudW5pdH1gOmBUcm8gbWFsZ3JhbmRhOiBhdGVuZGnEnWlzIGtlICR7ZS5vcmlnaW59IGVzdHUgJHtpfSR7ZS5taW5pbXVtLnRvU3RyaW5nKCl9YH1jYXNlImludmFsaWRfZm9ybWF0Ijp7Y29uc3QgaT1lO3JldHVybiBpLmZvcm1hdD09PSJzdGFydHNfd2l0aCI/YE5ldmFsaWRhIGthcmFrdHJhcm86IGRldmFzIGtvbWVuY2nEnWkgcGVyICIke2kucHJlZml4fSJgOmkuZm9ybWF0PT09ImVuZHNfd2l0aCI/YE5ldmFsaWRhIGthcmFrdHJhcm86IGRldmFzIGZpbmnEnWkgcGVyICIke2kuc3VmZml4fSJgOmkuZm9ybWF0PT09ImluY2x1ZGVzIj9gTmV2YWxpZGEga2FyYWt0cmFybzogZGV2YXMgaW5rbHV6aXZpICIke2kuaW5jbHVkZXN9ImA6aS5mb3JtYXQ9PT0icmVnZXgiP2BOZXZhbGlkYSBrYXJha3RyYXJvOiBkZXZhcyBrb25ncnVpIGt1biBsYSBtb2RlbG8gJHtpLnBhdHRlcm59YDpgTmV2YWxpZGEgJHtyW2kuZm9ybWF0XT8/ZS5mb3JtYXR9YH1jYXNlIm5vdF9tdWx0aXBsZV9vZiI6cmV0dXJuYE5ldmFsaWRhIG5vbWJybzogZGV2YXMgZXN0aSBvYmxvIGRlICR7ZS5kaXZpc29yfWA7Y2FzZSJ1bnJlY29nbml6ZWRfa2V5cyI6cmV0dXJuYE5la29uYXRhJHtlLmtleXMubGVuZ3RoPjE/ImoiOiIifSDFnWxvc2lsbyR7ZS5rZXlzLmxlbmd0aD4xPyJqIjoiIn06ICR7XyhlLmtleXMsIiwgIil9YDtjYXNlImludmFsaWRfa2V5IjpyZXR1cm5gTmV2YWxpZGEgxZ1sb3NpbG8gZW4gJHtlLm9yaWdpbn1gO2Nhc2UiaW52YWxpZF91bmlvbiI6cmV0dXJuIk5ldmFsaWRhIGVuaWdvIjtjYXNlImludmFsaWRfZWxlbWVudCI6cmV0dXJuYE5ldmFsaWRhIHZhbG9ybyBlbiAke2Uub3JpZ2lufWA7ZGVmYXVsdDpyZXR1cm4iTmV2YWxpZGEgZW5pZ28ifX19O2Z1bmN0aW9uIHJmKCl7cmV0dXJue2xvY2FsZUVycm9yOm5mKCl9fWNvbnN0IG9mPSgpPT57Y29uc3QgdD17c3RyaW5nOnt1bml0OiJjYXJhY3RlcmVzIix2ZXJiOiJ0ZW5lciJ9LGZpbGU6e3VuaXQ6ImJ5dGVzIix2ZXJiOiJ0ZW5lciJ9LGFycmF5Ont1bml0OiJlbGVtZW50b3MiLHZlcmI6InRlbmVyIn0sc2V0Ont1bml0OiJlbGVtZW50b3MiLHZlcmI6InRlbmVyIn19O2Z1bmN0aW9uIG4oZSl7cmV0dXJuIHRbZV0/P251bGx9Y29uc3Qgcj17cmVnZXg6ImVudHJhZGEiLGVtYWlsOiJkaXJlY2Npw7NuIGRlIGNvcnJlbyBlbGVjdHLDs25pY28iLHVybDoiVVJMIixlbW9qaToiZW1vamkiLHV1aWQ6IlVVSUQiLHV1aWR2NDoiVVVJRHY0Iix1dWlkdjY6IlVVSUR2NiIsbmFub2lkOiJuYW5vaWQiLGd1aWQ6IkdVSUQiLGN1aWQ6ImN1aWQiLGN1aWQyOiJjdWlkMiIsdWxpZDoiVUxJRCIseGlkOiJYSUQiLGtzdWlkOiJLU1VJRCIsZGF0ZXRpbWU6ImZlY2hhIHkgaG9yYSBJU08iLGRhdGU6ImZlY2hhIElTTyIsdGltZToiaG9yYSBJU08iLGR1cmF0aW9uOiJkdXJhY2nDs24gSVNPIixpcHY0OiJkaXJlY2Npw7NuIElQdjQiLGlwdjY6ImRpcmVjY2nDs24gSVB2NiIsY2lkcnY0OiJyYW5nbyBJUHY0IixjaWRydjY6InJhbmdvIElQdjYiLGJhc2U2NDoiY2FkZW5hIGNvZGlmaWNhZGEgZW4gYmFzZTY0IixiYXNlNjR1cmw6IlVSTCBjb2RpZmljYWRhIGVuIGJhc2U2NCIsanNvbl9zdHJpbmc6ImNhZGVuYSBKU09OIixlMTY0OiJuw7ptZXJvIEUuMTY0Iixqd3Q6IkpXVCIsdGVtcGxhdGVfbGl0ZXJhbDoiZW50cmFkYSJ9LG89e25hbjoiTmFOIixzdHJpbmc6InRleHRvIixudW1iZXI6Im7Dum1lcm8iLGJvb2xlYW46ImJvb2xlYW5vIixhcnJheToiYXJyZWdsbyIsb2JqZWN0OiJvYmpldG8iLHNldDoiY29uanVudG8iLGZpbGU6ImFyY2hpdm8iLGRhdGU6ImZlY2hhIixiaWdpbnQ6Im7Dum1lcm8gZ3JhbmRlIixzeW1ib2w6InPDrW1ib2xvIix1bmRlZmluZWQ6ImluZGVmaW5pZG8iLG51bGw6Im51bG8iLGZ1bmN0aW9uOiJmdW5jacOzbiIsbWFwOiJtYXBhIixyZWNvcmQ6InJlZ2lzdHJvIix0dXBsZToidHVwbGEiLGVudW06ImVudW1lcmFjacOzbiIsdW5pb246InVuacOzbiIsbGl0ZXJhbDoibGl0ZXJhbCIscHJvbWlzZToicHJvbWVzYSIsdm9pZDoidmFjw61vIixuZXZlcjoibnVuY2EiLHVua25vd246ImRlc2Nvbm9jaWRvIixhbnk6ImN1YWxxdWllcmEifTtyZXR1cm4gZT0+e3N3aXRjaChlLmNvZGUpe2Nhc2UiaW52YWxpZF90eXBlIjp7Y29uc3QgaT1vW2UuZXhwZWN0ZWRdPz9lLmV4cGVjdGVkLGE9dyhlLmlucHV0KSxzPW9bYV0/P2E7cmV0dXJuL15bQS1aXS8udGVzdChlLmV4cGVjdGVkKT9gRW50cmFkYSBpbnbDoWxpZGE6IHNlIGVzcGVyYWJhIGluc3RhbmNlb2YgJHtlLmV4cGVjdGVkfSwgcmVjaWJpZG8gJHtzfWA6YEVudHJhZGEgaW52w6FsaWRhOiBzZSBlc3BlcmFiYSAke2l9LCByZWNpYmlkbyAke3N9YH1jYXNlImludmFsaWRfdmFsdWUiOnJldHVybiBlLnZhbHVlcy5sZW5ndGg9PT0xP2BFbnRyYWRhIGludsOhbGlkYTogc2UgZXNwZXJhYmEgJHtTKGUudmFsdWVzWzBdKX1gOmBPcGNpw7NuIGludsOhbGlkYTogc2UgZXNwZXJhYmEgdW5hIGRlICR7XyhlLnZhbHVlcywifCIpfWA7Y2FzZSJ0b29fYmlnIjp7Y29uc3QgaT1lLmluY2x1c2l2ZT8iPD0iOiI8IixhPW4oZS5vcmlnaW4pLHM9b1tlLm9yaWdpbl0/P2Uub3JpZ2luO3JldHVybiBhP2BEZW1hc2lhZG8gZ3JhbmRlOiBzZSBlc3BlcmFiYSBxdWUgJHtzPz8idmFsb3IifSB0dXZpZXJhICR7aX0ke2UubWF4aW11bS50b1N0cmluZygpfSAke2EudW5pdD8/ImVsZW1lbnRvcyJ9YDpgRGVtYXNpYWRvIGdyYW5kZTogc2UgZXNwZXJhYmEgcXVlICR7cz8/InZhbG9yIn0gZnVlcmEgJHtpfSR7ZS5tYXhpbXVtLnRvU3RyaW5nKCl9YH1jYXNlInRvb19zbWFsbCI6e2NvbnN0IGk9ZS5pbmNsdXNpdmU/Ij49IjoiPiIsYT1uKGUub3JpZ2luKSxzPW9bZS5vcmlnaW5dPz9lLm9yaWdpbjtyZXR1cm4gYT9gRGVtYXNpYWRvIHBlcXVlw7FvOiBzZSBlc3BlcmFiYSBxdWUgJHtzfSB0dXZpZXJhICR7aX0ke2UubWluaW11bS50b1N0cmluZygpfSAke2EudW5pdH1gOmBEZW1hc2lhZG8gcGVxdWXDsW86IHNlIGVzcGVyYWJhIHF1ZSAke3N9IGZ1ZXJhICR7aX0ke2UubWluaW11bS50b1N0cmluZygpfWB9Y2FzZSJpbnZhbGlkX2Zvcm1hdCI6e2NvbnN0IGk9ZTtyZXR1cm4gaS5mb3JtYXQ9PT0ic3RhcnRzX3dpdGgiP2BDYWRlbmEgaW52w6FsaWRhOiBkZWJlIGNvbWVuemFyIGNvbiAiJHtpLnByZWZpeH0iYDppLmZvcm1hdD09PSJlbmRzX3dpdGgiP2BDYWRlbmEgaW52w6FsaWRhOiBkZWJlIHRlcm1pbmFyIGVuICIke2kuc3VmZml4fSJgOmkuZm9ybWF0PT09ImluY2x1ZGVzIj9gQ2FkZW5hIGludsOhbGlkYTogZGViZSBpbmNsdWlyICIke2kuaW5jbHVkZXN9ImA6aS5mb3JtYXQ9PT0icmVnZXgiP2BDYWRlbmEgaW52w6FsaWRhOiBkZWJlIGNvaW5jaWRpciBjb24gZWwgcGF0csOzbiAke2kucGF0dGVybn1gOmBJbnbDoWxpZG8gJHtyW2kuZm9ybWF0XT8/ZS5mb3JtYXR9YH1jYXNlIm5vdF9tdWx0aXBsZV9vZiI6cmV0dXJuYE7Dum1lcm8gaW52w6FsaWRvOiBkZWJlIHNlciBtw7psdGlwbG8gZGUgJHtlLmRpdmlzb3J9YDtjYXNlInVucmVjb2duaXplZF9rZXlzIjpyZXR1cm5gTGxhdmUke2Uua2V5cy5sZW5ndGg+MT8icyI6IiJ9IGRlc2Nvbm9jaWRhJHtlLmtleXMubGVuZ3RoPjE/InMiOiIifTogJHtfKGUua2V5cywiLCAiKX1gO2Nhc2UiaW52YWxpZF9rZXkiOnJldHVybmBMbGF2ZSBpbnbDoWxpZGEgZW4gJHtvW2Uub3JpZ2luXT8/ZS5vcmlnaW59YDtjYXNlImludmFsaWRfdW5pb24iOnJldHVybiJFbnRyYWRhIGludsOhbGlkYSI7Y2FzZSJpbnZhbGlkX2VsZW1lbnQiOnJldHVybmBWYWxvciBpbnbDoWxpZG8gZW4gJHtvW2Uub3JpZ2luXT8/ZS5vcmlnaW59YDtkZWZhdWx0OnJldHVybiJFbnRyYWRhIGludsOhbGlkYSJ9fX07ZnVuY3Rpb24gYWYoKXtyZXR1cm57bG9jYWxlRXJyb3I6b2YoKX19Y29uc3Qgc2Y9KCk9Pntjb25zdCB0PXtzdHJpbmc6e3VuaXQ6Itqp2KfYsdin2qnYqtixIix2ZXJiOiLYr9in2LTYqtmHINio2KfYtNivIn0sZmlsZTp7dW5pdDoi2KjYp9uM2KoiLHZlcmI6Itiv2KfYtNiq2Ycg2KjYp9i02K8ifSxhcnJheTp7dW5pdDoi2KLbjNiq2YUiLHZlcmI6Itiv2KfYtNiq2Ycg2KjYp9i02K8ifSxzZXQ6e3VuaXQ6Itii24zYqtmFIix2ZXJiOiLYr9in2LTYqtmHINio2KfYtNivIn19O2Z1bmN0aW9uIG4oZSl7cmV0dXJuIHRbZV0/P251bGx9Y29uc3Qgcj17cmVnZXg6ItmI2LHZiNiv24wiLGVtYWlsOiLYotiv2LHYsyDYp9uM2YXbjNmEIix1cmw6IlVSTCIsZW1vamk6Itin24zZhdmI2KzbjCIsdXVpZDoiVVVJRCIsdXVpZHY0OiJVVUlEdjQiLHV1aWR2NjoiVVVJRHY2IixuYW5vaWQ6Im5hbm9pZCIsZ3VpZDoiR1VJRCIsY3VpZDoiY3VpZCIsY3VpZDI6ImN1aWQyIix1bGlkOiJVTElEIix4aWQ6IlhJRCIsa3N1aWQ6IktTVUlEIixkYXRldGltZToi2KrYp9ix24zYriDZiCDYstmF2KfZhiDYp9uM2LLZiCIsZGF0ZToi2KrYp9ix24zYriDYp9uM2LLZiCIsdGltZToi2LLZhdin2YYg2KfbjNiy2YgiLGR1cmF0aW9uOiLZhdiv2Kog2LLZhdin2YYg2KfbjNiy2YgiLGlwdjQ6IklQdjQg2KLYr9ix2LMiLGlwdjY6IklQdjYg2KLYr9ix2LMiLGNpZHJ2NDoiSVB2NCDYr9in2YXZhtmHIixjaWRydjY6IklQdjYg2K/Yp9mF2YbZhyIsYmFzZTY0OiJiYXNlNjQtZW5jb2RlZCDYsdi02KrZhyIsYmFzZTY0dXJsOiJiYXNlNjR1cmwtZW5jb2RlZCDYsdi02KrZhyIsanNvbl9zdHJpbmc6IkpTT04g2LHYtNiq2YciLGUxNjQ6IkUuMTY0INi52K/YryIsand0OiJKV1QiLHRlbXBsYXRlX2xpdGVyYWw6ItmI2LHZiNiv24wifSxvPXtuYW46Ik5hTiIsbnVtYmVyOiLYudiv2K8iLGFycmF5OiLYotix2KfbjNmHIn07cmV0dXJuIGU9Pntzd2l0Y2goZS5jb2RlKXtjYXNlImludmFsaWRfdHlwZSI6e2NvbnN0IGk9b1tlLmV4cGVjdGVkXT8/ZS5leHBlY3RlZCxhPXcoZS5pbnB1dCkscz1vW2FdPz9hO3JldHVybi9eW0EtWl0vLnRlc3QoZS5leHBlY3RlZCk/YNmI2LHZiNiv24wg2YbYp9mF2LnYqtio2LE6INmF24zigIzYqNin24zYs9iqIGluc3RhbmNlb2YgJHtlLmV4cGVjdGVkfSDZhduM4oCM2KjZiNiv2IwgJHtzfSDYr9ix24zYp9mB2Kog2LTYr2A6YNmI2LHZiNiv24wg2YbYp9mF2LnYqtio2LE6INmF24zigIzYqNin24zYs9iqICR7aX0g2YXbjOKAjNio2YjYr9iMICR7c30g2K/YsduM2KfZgdiqINi02K9gfWNhc2UiaW52YWxpZF92YWx1ZSI6cmV0dXJuIGUudmFsdWVzLmxlbmd0aD09PTE/YNmI2LHZiNiv24wg2YbYp9mF2LnYqtio2LE6INmF24zigIzYqNin24zYs9iqICR7UyhlLnZhbHVlc1swXSl9INmF24zigIzYqNmI2K9gOmDar9iy24zZhtmHINmG2KfZhdi52KrYqNixOiDZhduM4oCM2KjYp9uM2LPYqiDbjNqp24wg2KfYsiAke18oZS52YWx1ZXMsInwiKX0g2YXbjOKAjNio2YjYr2A7Y2FzZSJ0b29fYmlnIjp7Y29uc3QgaT1lLmluY2x1c2l2ZT8iPD0iOiI8IixhPW4oZS5vcmlnaW4pO3JldHVybiBhP2DYrtuM2YTbjCDYqNiy2LHarzogJHtlLm9yaWdpbj8/ItmF2YLYr9in2LEifSDYqNin24zYryAke2l9JHtlLm1heGltdW0udG9TdHJpbmcoKX0gJHthLnVuaXQ/PyLYudmG2LXYsSJ9INio2KfYtNivYDpg2K7bjNmE24wg2KjYstix2q86ICR7ZS5vcmlnaW4/PyLZhdmC2K/Yp9ixIn0g2KjYp9uM2K8gJHtpfSR7ZS5tYXhpbXVtLnRvU3RyaW5nKCl9INio2KfYtNivYH1jYXNlInRvb19zbWFsbCI6e2NvbnN0IGk9ZS5pbmNsdXNpdmU/Ij49IjoiPiIsYT1uKGUub3JpZ2luKTtyZXR1cm4gYT9g2K7bjNmE24wg2qnZiNqG2qk6ICR7ZS5vcmlnaW59INio2KfbjNivICR7aX0ke2UubWluaW11bS50b1N0cmluZygpfSAke2EudW5pdH0g2KjYp9i02K9gOmDYrtuM2YTbjCDaqdmI2obaqTogJHtlLm9yaWdpbn0g2KjYp9uM2K8gJHtpfSR7ZS5taW5pbXVtLnRvU3RyaW5nKCl9INio2KfYtNivYH1jYXNlImludmFsaWRfZm9ybWF0Ijp7Y29uc3QgaT1lO3JldHVybiBpLmZvcm1hdD09PSJzdGFydHNfd2l0aCI/YNix2LTYqtmHINmG2KfZhdi52KrYqNixOiDYqNin24zYryDYqNinICIke2kucHJlZml4fSIg2LTYsdmI2Lkg2LTZiNivYDppLmZvcm1hdD09PSJlbmRzX3dpdGgiP2DYsdi02KrZhyDZhtin2YXYudiq2KjYsTog2KjYp9uM2K8g2KjYpyAiJHtpLnN1ZmZpeH0iINiq2YXYp9mFINi02YjYr2A6aS5mb3JtYXQ9PT0iaW5jbHVkZXMiP2DYsdi02KrZhyDZhtin2YXYudiq2KjYsTog2KjYp9uM2K8g2LTYp9mF2YQgIiR7aS5pbmNsdWRlc30iINio2KfYtNivYDppLmZvcm1hdD09PSJyZWdleCI/YNix2LTYqtmHINmG2KfZhdi52KrYqNixOiDYqNin24zYryDYqNinINin2YTar9mI24wgJHtpLnBhdHRlcm59INmF2LfYp9io2YLYqiDYr9in2LTYqtmHINio2KfYtNivYDpgJHtyW2kuZm9ybWF0XT8/ZS5mb3JtYXR9INmG2KfZhdi52KrYqNixYH1jYXNlIm5vdF9tdWx0aXBsZV9vZiI6cmV0dXJuYNi52K/YryDZhtin2YXYudiq2KjYsTog2KjYp9uM2K8g2YXYttix2KggJHtlLmRpdmlzb3J9INio2KfYtNivYDtjYXNlInVucmVjb2duaXplZF9rZXlzIjpyZXR1cm5g2qnZhNuM2K8ke2Uua2V5cy5sZW5ndGg+MT8i2YfYp9uMIjoiIn0g2YbYp9i02YbYp9izOiAke18oZS5rZXlzLCIsICIpfWA7Y2FzZSJpbnZhbGlkX2tleSI6cmV0dXJuYNqp2YTbjNivINmG2KfYtNmG2KfYsyDYr9ixICR7ZS5vcmlnaW59YDtjYXNlImludmFsaWRfdW5pb24iOnJldHVybiLZiNix2YjYr9uMINmG2KfZhdi52KrYqNixIjtjYXNlImludmFsaWRfZWxlbWVudCI6cmV0dXJuYNmF2YLYr9in2LEg2YbYp9mF2LnYqtio2LEg2K/YsSAke2Uub3JpZ2lufWA7ZGVmYXVsdDpyZXR1cm4i2YjYsdmI2K/bjCDZhtin2YXYudiq2KjYsSJ9fX07ZnVuY3Rpb24gY2YoKXtyZXR1cm57bG9jYWxlRXJyb3I6c2YoKX19Y29uc3QgdWY9KCk9Pntjb25zdCB0PXtzdHJpbmc6e3VuaXQ6Im1lcmtracOkIixzdWJqZWN0OiJtZXJra2lqb25vbiJ9LGZpbGU6e3VuaXQ6InRhdnVhIixzdWJqZWN0OiJ0aWVkb3N0b24ifSxhcnJheTp7dW5pdDoiYWxraW90YSIsc3ViamVjdDoibGlzdGFuIn0sc2V0Ont1bml0OiJhbGtpb3RhIixzdWJqZWN0OiJqb3Vrb24ifSxudW1iZXI6e3VuaXQ6IiIsc3ViamVjdDoibHV2dW4ifSxiaWdpbnQ6e3VuaXQ6IiIsc3ViamVjdDoic3V1cmVuIGtva29uYWlzbHV2dW4ifSxpbnQ6e3VuaXQ6IiIsc3ViamVjdDoia29rb25haXNsdXZ1biJ9LGRhdGU6e3VuaXQ6IiIsc3ViamVjdDoicMOkaXbDpG3DpMOkcsOkbiJ9fTtmdW5jdGlvbiBuKGUpe3JldHVybiB0W2VdPz9udWxsfWNvbnN0IHI9e3JlZ2V4OiJzw6TDpG5uw7ZsbGluZW4gbGF1c2VrZSIsZW1haWw6InPDpGhrw7Zwb3N0aW9zb2l0ZSIsdXJsOiJVUkwtb3NvaXRlIixlbW9qaToiZW1vamkiLHV1aWQ6IlVVSUQiLHV1aWR2NDoiVVVJRHY0Iix1dWlkdjY6IlVVSUR2NiIsbmFub2lkOiJuYW5vaWQiLGd1aWQ6IkdVSUQiLGN1aWQ6ImN1aWQiLGN1aWQyOiJjdWlkMiIsdWxpZDoiVUxJRCIseGlkOiJYSUQiLGtzdWlkOiJLU1VJRCIsZGF0ZXRpbWU6IklTTy1haWthbGVpbWEiLGRhdGU6IklTTy1ww6RpdsOkbcOkw6Ryw6QiLHRpbWU6IklTTy1haWthIixkdXJhdGlvbjoiSVNPLWtlc3RvIixpcHY0OiJJUHY0LW9zb2l0ZSIsaXB2NjoiSVB2Ni1vc29pdGUiLGNpZHJ2NDoiSVB2NC1hbHVlIixjaWRydjY6IklQdjYtYWx1ZSIsYmFzZTY0OiJiYXNlNjQta29vZGF0dHUgbWVya2tpam9ubyIsYmFzZTY0dXJsOiJiYXNlNjR1cmwta29vZGF0dHUgbWVya2tpam9ubyIsanNvbl9zdHJpbmc6IkpTT04tbWVya2tpam9ubyIsZTE2NDoiRS4xNjQtbHVrdSIsand0OiJKV1QiLHRlbXBsYXRlX2xpdGVyYWw6InRlbXBsYWF0dGltZXJra2lqb25vIn0sbz17bmFuOiJOYU4ifTtyZXR1cm4gZT0+e3N3aXRjaChlLmNvZGUpe2Nhc2UiaW52YWxpZF90eXBlIjp7Y29uc3QgaT1vW2UuZXhwZWN0ZWRdPz9lLmV4cGVjdGVkLGE9dyhlLmlucHV0KSxzPW9bYV0/P2E7cmV0dXJuL15bQS1aXS8udGVzdChlLmV4cGVjdGVkKT9gVmlyaGVlbGxpbmVuIHR5eXBwaTogb2RvdGV0dGlpbiBpbnN0YW5jZW9mICR7ZS5leHBlY3RlZH0sIG9saSAke3N9YDpgVmlyaGVlbGxpbmVuIHR5eXBwaTogb2RvdGV0dGlpbiAke2l9LCBvbGkgJHtzfWB9Y2FzZSJpbnZhbGlkX3ZhbHVlIjpyZXR1cm4gZS52YWx1ZXMubGVuZ3RoPT09MT9gVmlyaGVlbGxpbmVuIHN5w7Z0ZTogdMOkeXR5eSBvbGxhICR7UyhlLnZhbHVlc1swXSl9YDpgVmlyaGVlbGxpbmVuIHZhbGludGE6IHTDpHl0eXkgb2xsYSB5a3NpIHNldXJhYXZpc3RhOiAke18oZS52YWx1ZXMsInwiKX1gO2Nhc2UidG9vX2JpZyI6e2NvbnN0IGk9ZS5pbmNsdXNpdmU/Ijw9IjoiPCIsYT1uKGUub3JpZ2luKTtyZXR1cm4gYT9gTGlpYW4gc3V1cmk6ICR7YS5zdWJqZWN0fSB0w6R5dHl5IG9sbGEgJHtpfSR7ZS5tYXhpbXVtLnRvU3RyaW5nKCl9ICR7YS51bml0fWAudHJpbSgpOmBMaWlhbiBzdXVyaTogYXJ2b24gdMOkeXR5eSBvbGxhICR7aX0ke2UubWF4aW11bS50b1N0cmluZygpfWB9Y2FzZSJ0b29fc21hbGwiOntjb25zdCBpPWUuaW5jbHVzaXZlPyI+PSI6Ij4iLGE9bihlLm9yaWdpbik7cmV0dXJuIGE/YExpaWFuIHBpZW5pOiAke2Euc3ViamVjdH0gdMOkeXR5eSBvbGxhICR7aX0ke2UubWluaW11bS50b1N0cmluZygpfSAke2EudW5pdH1gLnRyaW0oKTpgTGlpYW4gcGllbmk6IGFydm9uIHTDpHl0eXkgb2xsYSAke2l9JHtlLm1pbmltdW0udG9TdHJpbmcoKX1gfWNhc2UiaW52YWxpZF9mb3JtYXQiOntjb25zdCBpPWU7cmV0dXJuIGkuZm9ybWF0PT09InN0YXJ0c193aXRoIj9gVmlyaGVlbGxpbmVuIHN5w7Z0ZTogdMOkeXR5eSBhbGthYSAiJHtpLnByZWZpeH0iYDppLmZvcm1hdD09PSJlbmRzX3dpdGgiP2BWaXJoZWVsbGluZW4gc3nDtnRlOiB0w6R5dHl5IGxvcHB1YSAiJHtpLnN1ZmZpeH0iYDppLmZvcm1hdD09PSJpbmNsdWRlcyI/YFZpcmhlZWxsaW5lbiBzecO2dGU6IHTDpHl0eXkgc2lzw6RsdMOkw6QgIiR7aS5pbmNsdWRlc30iYDppLmZvcm1hdD09PSJyZWdleCI/YFZpcmhlZWxsaW5lbiBzecO2dGU6IHTDpHl0eXkgdmFzdGF0YSBzw6TDpG5uw7ZsbGlzdMOkIGxhdXNla2V0dGEgJHtpLnBhdHRlcm59YDpgVmlyaGVlbGxpbmVuICR7cltpLmZvcm1hdF0/P2UuZm9ybWF0fWB9Y2FzZSJub3RfbXVsdGlwbGVfb2YiOnJldHVybmBWaXJoZWVsbGluZW4gbHVrdTogdMOkeXR5eSBvbGxhIGx1dnVuICR7ZS5kaXZpc29yfSBtb25pa2VydGFgO2Nhc2UidW5yZWNvZ25pemVkX2tleXMiOnJldHVybmAke2Uua2V5cy5sZW5ndGg+MT8iVHVudGVtYXR0b21hdCBhdmFpbWV0IjoiVHVudGVtYXRvbiBhdmFpbiJ9OiAke18oZS5rZXlzLCIsICIpfWA7Y2FzZSJpbnZhbGlkX2tleSI6cmV0dXJuIlZpcmhlZWxsaW5lbiBhdmFpbiB0aWV0dWVlc3NhIjtjYXNlImludmFsaWRfdW5pb24iOnJldHVybiJWaXJoZWVsbGluZW4gdW5pb25pIjtjYXNlImludmFsaWRfZWxlbWVudCI6cmV0dXJuIlZpcmhlZWxsaW5lbiBhcnZvIGpvdWtvc3NhIjtkZWZhdWx0OnJldHVybiJWaXJoZWVsbGluZW4gc3nDtnRlIn19fTtmdW5jdGlvbiBsZigpe3JldHVybntsb2NhbGVFcnJvcjp1ZigpfX1jb25zdCBkZj0oKT0+e2NvbnN0IHQ9e3N0cmluZzp7dW5pdDoiY2FyYWN0w6hyZXMiLHZlcmI6ImF2b2lyIn0sZmlsZTp7dW5pdDoib2N0ZXRzIix2ZXJiOiJhdm9pciJ9LGFycmF5Ont1bml0OiLDqWzDqW1lbnRzIix2ZXJiOiJhdm9pciJ9LHNldDp7dW5pdDoiw6lsw6ltZW50cyIsdmVyYjoiYXZvaXIifX07ZnVuY3Rpb24gbihlKXtyZXR1cm4gdFtlXT8/bnVsbH1jb25zdCByPXtyZWdleDoiZW50csOpZSIsZW1haWw6ImFkcmVzc2UgZS1tYWlsIix1cmw6IlVSTCIsZW1vamk6ImVtb2ppIix1dWlkOiJVVUlEIix1dWlkdjQ6IlVVSUR2NCIsdXVpZHY2OiJVVUlEdjYiLG5hbm9pZDoibmFub2lkIixndWlkOiJHVUlEIixjdWlkOiJjdWlkIixjdWlkMjoiY3VpZDIiLHVsaWQ6IlVMSUQiLHhpZDoiWElEIixrc3VpZDoiS1NVSUQiLGRhdGV0aW1lOiJkYXRlIGV0IGhldXJlIElTTyIsZGF0ZToiZGF0ZSBJU08iLHRpbWU6ImhldXJlIElTTyIsZHVyYXRpb246ImR1csOpZSBJU08iLGlwdjQ6ImFkcmVzc2UgSVB2NCIsaXB2NjoiYWRyZXNzZSBJUHY2IixjaWRydjQ6InBsYWdlIElQdjQiLGNpZHJ2NjoicGxhZ2UgSVB2NiIsYmFzZTY0OiJjaGHDrm5lIGVuY29kw6llIGVuIGJhc2U2NCIsYmFzZTY0dXJsOiJjaGHDrm5lIGVuY29kw6llIGVuIGJhc2U2NHVybCIsanNvbl9zdHJpbmc6ImNoYcOubmUgSlNPTiIsZTE2NDoibnVtw6lybyBFLjE2NCIsand0OiJKV1QiLHRlbXBsYXRlX2xpdGVyYWw6ImVudHLDqWUifSxvPXtzdHJpbmc6ImNoYcOubmUiLG51bWJlcjoibm9tYnJlIixpbnQ6ImVudGllciIsYm9vbGVhbjoiYm9vbMOpZW4iLGJpZ2ludDoiZ3JhbmQgZW50aWVyIixzeW1ib2w6InN5bWJvbGUiLHVuZGVmaW5lZDoiaW5kw6lmaW5pIixudWxsOiJudWxsIixuZXZlcjoiamFtYWlzIix2b2lkOiJ2aWRlIixkYXRlOiJkYXRlIixhcnJheToidGFibGVhdSIsb2JqZWN0OiJvYmpldCIsdHVwbGU6InR1cGxlIixyZWNvcmQ6ImVucmVnaXN0cmVtZW50IixtYXA6ImNhcnRlIixzZXQ6ImVuc2VtYmxlIixmaWxlOiJmaWNoaWVyIixub25vcHRpb25hbDoibm9uLW9wdGlvbm5lbCIsbmFuOiJOYU4iLGZ1bmN0aW9uOiJmb25jdGlvbiJ9O3JldHVybiBlPT57c3dpdGNoKGUuY29kZSl7Y2FzZSJpbnZhbGlkX3R5cGUiOntjb25zdCBpPW9bZS5leHBlY3RlZF0/P2UuZXhwZWN0ZWQsYT13KGUuaW5wdXQpLHM9b1thXT8/YTtyZXR1cm4vXltBLVpdLy50ZXN0KGUuZXhwZWN0ZWQpP2BFbnRyw6llIGludmFsaWRlIDogaW5zdGFuY2VvZiAke2UuZXhwZWN0ZWR9IGF0dGVuZHUsICR7c30gcmXDp3VgOmBFbnRyw6llIGludmFsaWRlIDogJHtpfSBhdHRlbmR1LCAke3N9IHJlw6d1YH1jYXNlImludmFsaWRfdmFsdWUiOnJldHVybiBlLnZhbHVlcy5sZW5ndGg9PT0xP2BFbnRyw6llIGludmFsaWRlIDogJHtTKGUudmFsdWVzWzBdKX0gYXR0ZW5kdWA6YE9wdGlvbiBpbnZhbGlkZSA6IHVuZSB2YWxldXIgcGFybWkgJHtfKGUudmFsdWVzLCJ8Iil9IGF0dGVuZHVlYDtjYXNlInRvb19iaWciOntjb25zdCBpPWUuaW5jbHVzaXZlPyI8PSI6IjwiLGE9bihlLm9yaWdpbik7cmV0dXJuIGE/YFRyb3AgZ3JhbmQgOiAke29bZS5vcmlnaW5dPz8idmFsZXVyIn0gZG9pdCAke2EudmVyYn0gJHtpfSR7ZS5tYXhpbXVtLnRvU3RyaW5nKCl9ICR7YS51bml0Pz8iw6lsw6ltZW50KHMpIn1gOmBUcm9wIGdyYW5kIDogJHtvW2Uub3JpZ2luXT8/InZhbGV1ciJ9IGRvaXQgw6p0cmUgJHtpfSR7ZS5tYXhpbXVtLnRvU3RyaW5nKCl9YH1jYXNlInRvb19zbWFsbCI6e2NvbnN0IGk9ZS5pbmNsdXNpdmU/Ij49IjoiPiIsYT1uKGUub3JpZ2luKTtyZXR1cm4gYT9gVHJvcCBwZXRpdCA6ICR7b1tlLm9yaWdpbl0/PyJ2YWxldXIifSBkb2l0ICR7YS52ZXJifSAke2l9JHtlLm1pbmltdW0udG9TdHJpbmcoKX0gJHthLnVuaXR9YDpgVHJvcCBwZXRpdCA6ICR7b1tlLm9yaWdpbl0/PyJ2YWxldXIifSBkb2l0IMOqdHJlICR7aX0ke2UubWluaW11bS50b1N0cmluZygpfWB9Y2FzZSJpbnZhbGlkX2Zvcm1hdCI6e2NvbnN0IGk9ZTtyZXR1cm4gaS5mb3JtYXQ9PT0ic3RhcnRzX3dpdGgiP2BDaGHDrm5lIGludmFsaWRlIDogZG9pdCBjb21tZW5jZXIgcGFyICIke2kucHJlZml4fSJgOmkuZm9ybWF0PT09ImVuZHNfd2l0aCI/YENoYcOubmUgaW52YWxpZGUgOiBkb2l0IHNlIHRlcm1pbmVyIHBhciAiJHtpLnN1ZmZpeH0iYDppLmZvcm1hdD09PSJpbmNsdWRlcyI/YENoYcOubmUgaW52YWxpZGUgOiBkb2l0IGluY2x1cmUgIiR7aS5pbmNsdWRlc30iYDppLmZvcm1hdD09PSJyZWdleCI/YENoYcOubmUgaW52YWxpZGUgOiBkb2l0IGNvcnJlc3BvbmRyZSBhdSBtb2TDqGxlICR7aS5wYXR0ZXJufWA6YCR7cltpLmZvcm1hdF0/P2UuZm9ybWF0fSBpbnZhbGlkZWB9Y2FzZSJub3RfbXVsdGlwbGVfb2YiOnJldHVybmBOb21icmUgaW52YWxpZGUgOiBkb2l0IMOqdHJlIHVuIG11bHRpcGxlIGRlICR7ZS5kaXZpc29yfWA7Y2FzZSJ1bnJlY29nbml6ZWRfa2V5cyI6cmV0dXJuYENsw6kke2Uua2V5cy5sZW5ndGg+MT8icyI6IiJ9IG5vbiByZWNvbm51ZSR7ZS5rZXlzLmxlbmd0aD4xPyJzIjoiIn0gOiAke18oZS5rZXlzLCIsICIpfWA7Y2FzZSJpbnZhbGlkX2tleSI6cmV0dXJuYENsw6kgaW52YWxpZGUgZGFucyAke2Uub3JpZ2lufWA7Y2FzZSJpbnZhbGlkX3VuaW9uIjpyZXR1cm4iRW50csOpZSBpbnZhbGlkZSI7Y2FzZSJpbnZhbGlkX2VsZW1lbnQiOnJldHVybmBWYWxldXIgaW52YWxpZGUgZGFucyAke2Uub3JpZ2lufWA7ZGVmYXVsdDpyZXR1cm4iRW50csOpZSBpbnZhbGlkZSJ9fX07ZnVuY3Rpb24gbWYoKXtyZXR1cm57bG9jYWxlRXJyb3I6ZGYoKX19Y29uc3QgcGY9KCk9Pntjb25zdCB0PXtzdHJpbmc6e3VuaXQ6ImNhcmFjdMOocmVzIix2ZXJiOiJhdm9pciJ9LGZpbGU6e3VuaXQ6Im9jdGV0cyIsdmVyYjoiYXZvaXIifSxhcnJheTp7dW5pdDoiw6lsw6ltZW50cyIsdmVyYjoiYXZvaXIifSxzZXQ6e3VuaXQ6IsOpbMOpbWVudHMiLHZlcmI6ImF2b2lyIn19O2Z1bmN0aW9uIG4oZSl7cmV0dXJuIHRbZV0/P251bGx9Y29uc3Qgcj17cmVnZXg6ImVudHLDqWUiLGVtYWlsOiJhZHJlc3NlIGNvdXJyaWVsIix1cmw6IlVSTCIsZW1vamk6ImVtb2ppIix1dWlkOiJVVUlEIix1dWlkdjQ6IlVVSUR2NCIsdXVpZHY2OiJVVUlEdjYiLG5hbm9pZDoibmFub2lkIixndWlkOiJHVUlEIixjdWlkOiJjdWlkIixjdWlkMjoiY3VpZDIiLHVsaWQ6IlVMSUQiLHhpZDoiWElEIixrc3VpZDoiS1NVSUQiLGRhdGV0aW1lOiJkYXRlLWhldXJlIElTTyIsZGF0ZToiZGF0ZSBJU08iLHRpbWU6ImhldXJlIElTTyIsZHVyYXRpb246ImR1csOpZSBJU08iLGlwdjQ6ImFkcmVzc2UgSVB2NCIsaXB2NjoiYWRyZXNzZSBJUHY2IixjaWRydjQ6InBsYWdlIElQdjQiLGNpZHJ2NjoicGxhZ2UgSVB2NiIsYmFzZTY0OiJjaGHDrm5lIGVuY29kw6llIGVuIGJhc2U2NCIsYmFzZTY0dXJsOiJjaGHDrm5lIGVuY29kw6llIGVuIGJhc2U2NHVybCIsanNvbl9zdHJpbmc6ImNoYcOubmUgSlNPTiIsZTE2NDoibnVtw6lybyBFLjE2NCIsand0OiJKV1QiLHRlbXBsYXRlX2xpdGVyYWw6ImVudHLDqWUifSxvPXtuYW46Ik5hTiJ9O3JldHVybiBlPT57c3dpdGNoKGUuY29kZSl7Y2FzZSJpbnZhbGlkX3R5cGUiOntjb25zdCBpPW9bZS5leHBlY3RlZF0/P2UuZXhwZWN0ZWQsYT13KGUuaW5wdXQpLHM9b1thXT8/YTtyZXR1cm4vXltBLVpdLy50ZXN0KGUuZXhwZWN0ZWQpP2BFbnRyw6llIGludmFsaWRlIDogYXR0ZW5kdSBpbnN0YW5jZW9mICR7ZS5leHBlY3RlZH0sIHJlw6d1ICR7c31gOmBFbnRyw6llIGludmFsaWRlIDogYXR0ZW5kdSAke2l9LCByZcOndSAke3N9YH1jYXNlImludmFsaWRfdmFsdWUiOnJldHVybiBlLnZhbHVlcy5sZW5ndGg9PT0xP2BFbnRyw6llIGludmFsaWRlIDogYXR0ZW5kdSAke1MoZS52YWx1ZXNbMF0pfWA6YE9wdGlvbiBpbnZhbGlkZSA6IGF0dGVuZHUgbCd1bmUgZGVzIHZhbGV1cnMgc3VpdmFudGVzICR7XyhlLnZhbHVlcywifCIpfWA7Y2FzZSJ0b29fYmlnIjp7Y29uc3QgaT1lLmluY2x1c2l2ZT8i4omkIjoiPCIsYT1uKGUub3JpZ2luKTtyZXR1cm4gYT9gVHJvcCBncmFuZCA6IGF0dGVuZHUgcXVlICR7ZS5vcmlnaW4/PyJsYSB2YWxldXIifSBhaXQgJHtpfSR7ZS5tYXhpbXVtLnRvU3RyaW5nKCl9ICR7YS51bml0fWA6YFRyb3AgZ3JhbmQgOiBhdHRlbmR1IHF1ZSAke2Uub3JpZ2luPz8ibGEgdmFsZXVyIn0gc29pdCAke2l9JHtlLm1heGltdW0udG9TdHJpbmcoKX1gfWNhc2UidG9vX3NtYWxsIjp7Y29uc3QgaT1lLmluY2x1c2l2ZT8i4omlIjoiPiIsYT1uKGUub3JpZ2luKTtyZXR1cm4gYT9gVHJvcCBwZXRpdCA6IGF0dGVuZHUgcXVlICR7ZS5vcmlnaW59IGFpdCAke2l9JHtlLm1pbmltdW0udG9TdHJpbmcoKX0gJHthLnVuaXR9YDpgVHJvcCBwZXRpdCA6IGF0dGVuZHUgcXVlICR7ZS5vcmlnaW59IHNvaXQgJHtpfSR7ZS5taW5pbXVtLnRvU3RyaW5nKCl9YH1jYXNlImludmFsaWRfZm9ybWF0Ijp7Y29uc3QgaT1lO3JldHVybiBpLmZvcm1hdD09PSJzdGFydHNfd2l0aCI/YENoYcOubmUgaW52YWxpZGUgOiBkb2l0IGNvbW1lbmNlciBwYXIgIiR7aS5wcmVmaXh9ImA6aS5mb3JtYXQ9PT0iZW5kc193aXRoIj9gQ2hhw65uZSBpbnZhbGlkZSA6IGRvaXQgc2UgdGVybWluZXIgcGFyICIke2kuc3VmZml4fSJgOmkuZm9ybWF0PT09ImluY2x1ZGVzIj9gQ2hhw65uZSBpbnZhbGlkZSA6IGRvaXQgaW5jbHVyZSAiJHtpLmluY2x1ZGVzfSJgOmkuZm9ybWF0PT09InJlZ2V4Ij9gQ2hhw65uZSBpbnZhbGlkZSA6IGRvaXQgY29ycmVzcG9uZHJlIGF1IG1vdGlmICR7aS5wYXR0ZXJufWA6YCR7cltpLmZvcm1hdF0/P2UuZm9ybWF0fSBpbnZhbGlkZWB9Y2FzZSJub3RfbXVsdGlwbGVfb2YiOnJldHVybmBOb21icmUgaW52YWxpZGUgOiBkb2l0IMOqdHJlIHVuIG11bHRpcGxlIGRlICR7ZS5kaXZpc29yfWA7Y2FzZSJ1bnJlY29nbml6ZWRfa2V5cyI6cmV0dXJuYENsw6kke2Uua2V5cy5sZW5ndGg+MT8icyI6IiJ9IG5vbiByZWNvbm51ZSR7ZS5rZXlzLmxlbmd0aD4xPyJzIjoiIn0gOiAke18oZS5rZXlzLCIsICIpfWA7Y2FzZSJpbnZhbGlkX2tleSI6cmV0dXJuYENsw6kgaW52YWxpZGUgZGFucyAke2Uub3JpZ2lufWA7Y2FzZSJpbnZhbGlkX3VuaW9uIjpyZXR1cm4iRW50csOpZSBpbnZhbGlkZSI7Y2FzZSJpbnZhbGlkX2VsZW1lbnQiOnJldHVybmBWYWxldXIgaW52YWxpZGUgZGFucyAke2Uub3JpZ2lufWA7ZGVmYXVsdDpyZXR1cm4iRW50csOpZSBpbnZhbGlkZSJ9fX07ZnVuY3Rpb24gZmYoKXtyZXR1cm57bG9jYWxlRXJyb3I6cGYoKX19Y29uc3QgZ2Y9KCk9Pntjb25zdCB0PXtzdHJpbmc6e2xhYmVsOiLXnteX16jXldeW16oiLGdlbmRlcjoiZiJ9LG51bWJlcjp7bGFiZWw6Itee16HXpNeoIixnZW5kZXI6Im0ifSxib29sZWFuOntsYWJlbDoi16LXqNeaINeR15XXnNeZ15DXoNeZIixnZW5kZXI6Im0ifSxiaWdpbnQ6e2xhYmVsOiJCaWdJbnQiLGdlbmRlcjoibSJ9LGRhdGU6e2xhYmVsOiLXqteQ16jXmdeaIixnZW5kZXI6Im0ifSxhcnJheTp7bGFiZWw6Itee16LXqNeaIixnZW5kZXI6Im0ifSxvYmplY3Q6e2xhYmVsOiLXkNeV15HXmdeZ16fXmCIsZ2VuZGVyOiJtIn0sbnVsbDp7bGFiZWw6Itei16jXmiDXqNeZ16cgKG51bGwpIixnZW5kZXI6Im0ifSx1bmRlZmluZWQ6e2xhYmVsOiLXoteo15og15zXkCDXnteV15LXk9eoICh1bmRlZmluZWQpIixnZW5kZXI6Im0ifSxzeW1ib2w6e2xhYmVsOiLXodeZ157XkdeV15wgKFN5bWJvbCkiLGdlbmRlcjoibSJ9LGZ1bmN0aW9uOntsYWJlbDoi16TXldeg16fXpteZ15QiLGdlbmRlcjoiZiJ9LG1hcDp7bGFiZWw6Itee16TXlCAoTWFwKSIsZ2VuZGVyOiJmIn0sc2V0OntsYWJlbDoi16fXkdeV16bXlCAoU2V0KSIsZ2VuZGVyOiJmIn0sZmlsZTp7bGFiZWw6Iten15XXkdelIixnZW5kZXI6Im0ifSxwcm9taXNlOntsYWJlbDoiUHJvbWlzZSIsZ2VuZGVyOiJtIn0sTmFOOntsYWJlbDoiTmFOIixnZW5kZXI6Im0ifSx1bmtub3duOntsYWJlbDoi16LXqNeaINec15Ag15nXk9eV16IiLGdlbmRlcjoibSJ9LHZhbHVlOntsYWJlbDoi16LXqNeaIixnZW5kZXI6Im0ifX0sbj17c3RyaW5nOnt1bml0OiLXqteV15XXmdedIixzaG9ydExhYmVsOiLXp9em16giLGxvbmdMYWJlbDoi15DXqNeV15oifSxmaWxlOnt1bml0OiLXkdeZ15nXmNeZ150iLHNob3J0TGFiZWw6Iten15jXnyIsbG9uZ0xhYmVsOiLXkteT15XXnCJ9LGFycmF5Ont1bml0OiLXpNeo15nXmNeZ150iLHNob3J0TGFiZWw6Iten15jXnyIsbG9uZ0xhYmVsOiLXkteT15XXnCJ9LHNldDp7dW5pdDoi16TXqNeZ15jXmdedIixzaG9ydExhYmVsOiLXp9eY158iLGxvbmdMYWJlbDoi15LXk9eV15wifSxudW1iZXI6e3VuaXQ6IiIsc2hvcnRMYWJlbDoi16fXmNefIixsb25nTGFiZWw6IteS15PXldecIn19LHI9dT0+dT90W3VdOnZvaWQgMCxvPXU9Pntjb25zdCBsPXIodSk7cmV0dXJuIGw/bC5sYWJlbDp1Pz90LnVua25vd24ubGFiZWx9LGU9dT0+YNeUJHtvKHUpfWAsaT11PT4ocih1KT8uZ2VuZGVyPz8ibSIpPT09ImYiPyLXpteo15nXm9eUINec15TXmdeV16oiOiLXpteo15nXmiDXnNeU15nXldeqIixhPXU9PnU/blt1XT8/bnVsbDpudWxsLHM9e3JlZ2V4OntsYWJlbDoi16fXnNeYIixnZW5kZXI6Im0ifSxlbWFpbDp7bGFiZWw6Iteb16rXldeR16og15DXmdee15nXmdecIixnZW5kZXI6ImYifSx1cmw6e2xhYmVsOiLXm9eq15XXkdeqINeo16nXqiIsZ2VuZGVyOiJmIn0sZW1vamk6e2xhYmVsOiLXkNeZ157XldeSJ9eZIixnZW5kZXI6Im0ifSx1dWlkOntsYWJlbDoiVVVJRCIsZ2VuZGVyOiJtIn0sbmFub2lkOntsYWJlbDoibmFub2lkIixnZW5kZXI6Im0ifSxndWlkOntsYWJlbDoiR1VJRCIsZ2VuZGVyOiJtIn0sY3VpZDp7bGFiZWw6ImN1aWQiLGdlbmRlcjoibSJ9LGN1aWQyOntsYWJlbDoiY3VpZDIiLGdlbmRlcjoibSJ9LHVsaWQ6e2xhYmVsOiJVTElEIixnZW5kZXI6Im0ifSx4aWQ6e2xhYmVsOiJYSUQiLGdlbmRlcjoibSJ9LGtzdWlkOntsYWJlbDoiS1NVSUQiLGdlbmRlcjoibSJ9LGRhdGV0aW1lOntsYWJlbDoi16rXkNeo15nXmiDXldeW157XnyBJU08iLGdlbmRlcjoibSJ9LGRhdGU6e2xhYmVsOiLXqteQ16jXmdeaIElTTyIsZ2VuZGVyOiJtIn0sdGltZTp7bGFiZWw6IteW157XnyBJU08iLGdlbmRlcjoibSJ9LGR1cmF0aW9uOntsYWJlbDoi157XqdeaINeW157XnyBJU08iLGdlbmRlcjoibSJ9LGlwdjQ6e2xhYmVsOiLXm9eq15XXkdeqIElQdjQiLGdlbmRlcjoiZiJ9LGlwdjY6e2xhYmVsOiLXm9eq15XXkdeqIElQdjYiLGdlbmRlcjoiZiJ9LGNpZHJ2NDp7bGFiZWw6IteY15XXldeXIElQdjQiLGdlbmRlcjoibSJ9LGNpZHJ2Njp7bGFiZWw6IteY15XXldeXIElQdjYiLGdlbmRlcjoibSJ9LGJhc2U2NDp7bGFiZWw6Itee15fXqNeV15bXqiDXkdeR16HXmdehIDY0IixnZW5kZXI6ImYifSxiYXNlNjR1cmw6e2xhYmVsOiLXnteX16jXldeW16og15HXkdeh15nXoSA2NCDXnNeb16rXldeR15XXqiDXqNep16oiLGdlbmRlcjoiZiJ9LGpzb25fc3RyaW5nOntsYWJlbDoi157Xl9eo15XXlteqIEpTT04iLGdlbmRlcjoiZiJ9LGUxNjQ6e2xhYmVsOiLXnteh16TXqCBFLjE2NCIsZ2VuZGVyOiJtIn0sand0OntsYWJlbDoiSldUIixnZW5kZXI6Im0ifSxlbmRzX3dpdGg6e2xhYmVsOiLXp9ec15giLGdlbmRlcjoibSJ9LGluY2x1ZGVzOntsYWJlbDoi16fXnNeYIixnZW5kZXI6Im0ifSxsb3dlcmNhc2U6e2xhYmVsOiLXp9ec15giLGdlbmRlcjoibSJ9LHN0YXJ0c193aXRoOntsYWJlbDoi16fXnNeYIixnZW5kZXI6Im0ifSx1cHBlcmNhc2U6e2xhYmVsOiLXp9ec15giLGdlbmRlcjoibSJ9fSxjPXtuYW46Ik5hTiJ9O3JldHVybiB1PT57c3dpdGNoKHUuY29kZSl7Y2FzZSJpbnZhbGlkX3R5cGUiOntjb25zdCBsPXUuZXhwZWN0ZWQsZz1jW2w/PyIiXT8/byhsKSx2PXcodS5pbnB1dCksJD1jW3ZdPz90W3ZdPy5sYWJlbD8/djtyZXR1cm4vXltBLVpdLy50ZXN0KHUuZXhwZWN0ZWQpP2DXp9ec15gg15zXkCDXqten15nXnzog16bXqNeZ15og15zXlNeZ15XXqiBpbnN0YW5jZW9mICR7dS5leHBlY3RlZH0sINeU16rXp9eR15wgJHskfWA6YNen15zXmCDXnNeQINeq16fXmdefOiDXpteo15nXmiDXnNeU15nXldeqICR7Z30sINeU16rXp9eR15wgJHskfWB9Y2FzZSJpbnZhbGlkX3ZhbHVlIjp7aWYodS52YWx1ZXMubGVuZ3RoPT09MSlyZXR1cm5g16LXqNeaINec15Ag16rXp9eZ1586INeU16LXqNeaINeX15nXmdeRINec15TXmdeV16ogJHtTKHUudmFsdWVzWzBdKX1gO2NvbnN0IGw9dS52YWx1ZXMubWFwKCQ9PlMoJCkpO2lmKHUudmFsdWVzLmxlbmd0aD09PTIpcmV0dXJuYNei16jXmiDXnNeQINeq16fXmdefOiDXlNeQ16TXqdeo15XXmdeV16og15TXnteq15DXmdee15XXqiDXlNefICR7bFswXX0g15DXlSAke2xbMV19YDtjb25zdCBnPWxbbC5sZW5ndGgtMV07cmV0dXJuYNei16jXmiDXnNeQINeq16fXmdefOiDXlNeQ16TXqdeo15XXmdeV16og15TXnteq15DXmdee15XXqiDXlNefICR7bC5zbGljZSgwLC0xKS5qb2luKCIsICIpfSDXkNeVICR7Z31gfWNhc2UidG9vX2JpZyI6e2NvbnN0IGw9YSh1Lm9yaWdpbiksZz1lKHUub3JpZ2luPz8idmFsdWUiKTtpZih1Lm9yaWdpbj09PSJzdHJpbmciKXJldHVybmAke2w/LmxvbmdMYWJlbD8/IteQ16jXldeaIn0g157Xk9eZOiAke2d9INem16jXmdeb15Qg15zXlNeb15nXnCAke3UubWF4aW11bS50b1N0cmluZygpfSAke2w/LnVuaXQ/PyIifSAke3UuaW5jbHVzaXZlPyLXkNeVINek15fXldeqIjoi15zXm9ecINeU15nXldeq16gifWAudHJpbSgpO2lmKHUub3JpZ2luPT09Im51bWJlciIpe2NvbnN0IHk9dS5pbmNsdXNpdmU/YNen15jXnyDXkNeVINep15XXldeUINecLSR7dS5tYXhpbXVtfWA6YNen15jXnyDXni0ke3UubWF4aW11bX1gO3JldHVybmDXkteT15XXnCDXnteT15k6ICR7Z30g16bXqNeZ15og15zXlNeZ15XXqiAke3l9YH1pZih1Lm9yaWdpbj09PSJhcnJheSJ8fHUub3JpZ2luPT09InNldCIpe2NvbnN0IHk9dS5vcmlnaW49PT0ic2V0Ij8i16bXqNeZ15vXlCI6Item16jXmdeaIixIPXUuaW5jbHVzaXZlP2Ake3UubWF4aW11bX0gJHtsPy51bml0Pz8iIn0g15DXlSDXpNeX15XXqmA6YNek15fXldeqINeeLSR7dS5tYXhpbXVtfSAke2w/LnVuaXQ/PyIifWA7cmV0dXJuYNeS15PXldecINee15PXmTogJHtnfSAke3l9INec15TXm9eZ15wgJHtIfWAudHJpbSgpfWNvbnN0IHY9dS5pbmNsdXNpdmU/Ijw9IjoiPCIsJD1pKHUub3JpZ2luPz8idmFsdWUiKTtyZXR1cm4gbD8udW5pdD9gJHtsLmxvbmdMYWJlbH0g157Xk9eZOiAke2d9ICR7JH0gJHt2fSR7dS5tYXhpbXVtLnRvU3RyaW5nKCl9ICR7bC51bml0fWA6YCR7bD8ubG9uZ0xhYmVsPz8i15LXk9eV15wifSDXnteT15k6ICR7Z30gJHskfSAke3Z9JHt1Lm1heGltdW0udG9TdHJpbmcoKX1gfWNhc2UidG9vX3NtYWxsIjp7Y29uc3QgbD1hKHUub3JpZ2luKSxnPWUodS5vcmlnaW4/PyJ2YWx1ZSIpO2lmKHUub3JpZ2luPT09InN0cmluZyIpcmV0dXJuYCR7bD8uc2hvcnRMYWJlbD8/Iten16bXqCJ9INee15PXmTogJHtnfSDXpteo15nXm9eUINec15TXm9eZ15wgJHt1Lm1pbmltdW0udG9TdHJpbmcoKX0gJHtsPy51bml0Pz8iIn0gJHt1LmluY2x1c2l2ZT8i15DXlSDXmdeV16rXqCI6Itec16TXl9eV16oifWAudHJpbSgpO2lmKHUub3JpZ2luPT09Im51bWJlciIpe2NvbnN0IHk9dS5pbmNsdXNpdmU/YNeS15PXldecINeQ15Ug16nXldeV15Qg15wtJHt1Lm1pbmltdW19YDpg15LXk9eV15wg154tJHt1Lm1pbmltdW19YDtyZXR1cm5g16fXmNefINee15PXmTogJHtnfSDXpteo15nXmiDXnNeU15nXldeqICR7eX1gfWlmKHUub3JpZ2luPT09ImFycmF5Inx8dS5vcmlnaW49PT0ic2V0Iil7Y29uc3QgeT11Lm9yaWdpbj09PSJzZXQiPyLXpteo15nXm9eUIjoi16bXqNeZ15oiO2lmKHUubWluaW11bT09PTEmJnUuaW5jbHVzaXZlKXtjb25zdCBMPSh1Lm9yaWdpbj09PSJzZXQiLCLXnNek15fXldeqINek16jXmdeYINeQ15fXkyIpO3JldHVybmDXp9eY158g157Xk9eZOiAke2d9ICR7eX0g15zXlNeb15nXnCAke0x9YH1jb25zdCBIPXUuaW5jbHVzaXZlP2Ake3UubWluaW11bX0gJHtsPy51bml0Pz8iIn0g15DXlSDXmdeV16rXqGA6YNeZ15XXqteoINeeLSR7dS5taW5pbXVtfSAke2w/LnVuaXQ/PyIifWA7cmV0dXJuYNen15jXnyDXnteT15k6ICR7Z30gJHt5fSDXnNeU15vXmdecICR7SH1gLnRyaW0oKX1jb25zdCB2PXUuaW5jbHVzaXZlPyI+PSI6Ij4iLCQ9aSh1Lm9yaWdpbj8/InZhbHVlIik7cmV0dXJuIGw/LnVuaXQ/YCR7bC5zaG9ydExhYmVsfSDXnteT15k6ICR7Z30gJHskfSAke3Z9JHt1Lm1pbmltdW0udG9TdHJpbmcoKX0gJHtsLnVuaXR9YDpgJHtsPy5zaG9ydExhYmVsPz8i16fXmNefIn0g157Xk9eZOiAke2d9ICR7JH0gJHt2fSR7dS5taW5pbXVtLnRvU3RyaW5nKCl9YH1jYXNlImludmFsaWRfZm9ybWF0Ijp7Y29uc3QgbD11O2lmKGwuZm9ybWF0PT09InN0YXJ0c193aXRoIilyZXR1cm5g15TXnteX16jXldeW16og15fXmdeZ15HXqiDXnNeU16rXl9eZ15wg15EgIiR7bC5wcmVmaXh9ImA7aWYobC5mb3JtYXQ9PT0iZW5kc193aXRoIilyZXR1cm5g15TXnteX16jXldeW16og15fXmdeZ15HXqiDXnNeU16HXqteZ15nXnSDXkSAiJHtsLnN1ZmZpeH0iYDtpZihsLmZvcm1hdD09PSJpbmNsdWRlcyIpcmV0dXJuYNeU157Xl9eo15XXlteqINeX15nXmdeR16og15zXm9ec15XXnCAiJHtsLmluY2x1ZGVzfSJgO2lmKGwuZm9ybWF0PT09InJlZ2V4IilyZXR1cm5g15TXnteX16jXldeW16og15fXmdeZ15HXqiDXnNeU16rXkNeZ150g15zXqteR16DXmdeqICR7bC5wYXR0ZXJufWA7Y29uc3QgZz1zW2wuZm9ybWF0XSx2PWc/LmxhYmVsPz9sLmZvcm1hdCx5PShnPy5nZW5kZXI/PyJtIik9PT0iZiI/Iteq16fXmdeg15QiOiLXqten15nXnyI7cmV0dXJuYCR7dn0g15zXkCAke3l9YH1jYXNlIm5vdF9tdWx0aXBsZV9vZiI6cmV0dXJuYNee16HXpNeoINec15Ag16rXp9eZ1586INeX15nXmdeRINec15TXmdeV16og157Xm9ek15zXlCDXqdecICR7dS5kaXZpc29yfWA7Y2FzZSJ1bnJlY29nbml6ZWRfa2V5cyI6cmV0dXJuYNee16TXqteXJHt1LmtleXMubGVuZ3RoPjE/IteV16oiOiIifSDXnNeQINee15bXldeUJHt1LmtleXMubGVuZ3RoPjE/IteZ150iOiLXlCJ9OiAke18odS5rZXlzLCIsICIpfWA7Y2FzZSJpbnZhbGlkX2tleSI6cmV0dXJuItep15PXlCDXnNeQINeq16fXmdefINeR15DXldeR15nXmden15giO2Nhc2UiaW52YWxpZF91bmlvbiI6cmV0dXJuIten15zXmCDXnNeQINeq16fXmdefIjtjYXNlImludmFsaWRfZWxlbWVudCI6cmV0dXJuYNei16jXmiDXnNeQINeq16fXmdefINeRJHtlKHUub3JpZ2luPz8iYXJyYXkiKX1gO2RlZmF1bHQ6cmV0dXJuIten15zXmCDXnNeQINeq16fXmdefIn19fTtmdW5jdGlvbiB2Zigpe3JldHVybntsb2NhbGVFcnJvcjpnZigpfX1jb25zdCBoZj0oKT0+e2NvbnN0IHQ9e3N0cmluZzp7dW5pdDoiem5ha292YSIsdmVyYjoiaW1hdGkifSxmaWxlOnt1bml0OiJiYWp0b3ZhIix2ZXJiOiJpbWF0aSJ9LGFycmF5Ont1bml0OiJzdGF2a2kiLHZlcmI6ImltYXRpIn0sc2V0Ont1bml0OiJzdGF2a2kiLHZlcmI6ImltYXRpIn19O2Z1bmN0aW9uIG4oZSl7cmV0dXJuIHRbZV0/P251bGx9Y29uc3Qgcj17cmVnZXg6InVub3MiLGVtYWlsOiJlbWFpbCBhZHJlc2EiLHVybDoiVVJMIixlbW9qaToiZW1vamkiLHV1aWQ6IlVVSUQiLHV1aWR2NDoiVVVJRHY0Iix1dWlkdjY6IlVVSUR2NiIsbmFub2lkOiJuYW5vaWQiLGd1aWQ6IkdVSUQiLGN1aWQ6ImN1aWQiLGN1aWQyOiJjdWlkMiIsdWxpZDoiVUxJRCIseGlkOiJYSUQiLGtzdWlkOiJLU1VJRCIsZGF0ZXRpbWU6IklTTyBkYXR1bSBpIHZyaWplbWUiLGRhdGU6IklTTyBkYXR1bSIsdGltZToiSVNPIHZyaWplbWUiLGR1cmF0aW9uOiJJU08gdHJhamFuamUiLGlwdjQ6IklQdjQgYWRyZXNhIixpcHY2OiJJUHY2IGFkcmVzYSIsY2lkcnY0OiJJUHY0IHJhc3BvbiIsY2lkcnY2OiJJUHY2IHJhc3BvbiIsYmFzZTY0OiJiYXNlNjQga29kaXJhbmkgdGVrc3QiLGJhc2U2NHVybDoiYmFzZTY0dXJsIGtvZGlyYW5pIHRla3N0Iixqc29uX3N0cmluZzoiSlNPTiB0ZWtzdCIsZTE2NDoiRS4xNjQgYnJvaiIsand0OiJKV1QiLHRlbXBsYXRlX2xpdGVyYWw6InVub3MifSxvPXtuYW46Ik5hTiIsc3RyaW5nOiJ0ZWtzdCIsbnVtYmVyOiJicm9qIixib29sZWFuOiJib29sZWFuIixhcnJheToibml6IixvYmplY3Q6Im9iamVrdCIsc2V0OiJza3VwIixmaWxlOiJkYXRvdGVrYSIsZGF0ZToiZGF0dW0iLGJpZ2ludDoiYmlnaW50IixzeW1ib2w6InNpbWJvbCIsdW5kZWZpbmVkOiJ1bmRlZmluZWQiLG51bGw6Im51bGwiLGZ1bmN0aW9uOiJmdW5rY2lqYSIsbWFwOiJtYXBhIn07cmV0dXJuIGU9Pntzd2l0Y2goZS5jb2RlKXtjYXNlImludmFsaWRfdHlwZSI6e2NvbnN0IGk9b1tlLmV4cGVjdGVkXT8/ZS5leHBlY3RlZCxhPXcoZS5pbnB1dCkscz1vW2FdPz9hO3JldHVybi9eW0EtWl0vLnRlc3QoZS5leHBlY3RlZCk/YE5laXNwcmF2YW4gdW5vczogb8SNZWt1amUgc2UgaW5zdGFuY2VvZiAke2UuZXhwZWN0ZWR9LCBhIHByaW1samVubyBqZSAke3N9YDpgTmVpc3ByYXZhbiB1bm9zOiBvxI1la3VqZSBzZSAke2l9LCBhIHByaW1samVubyBqZSAke3N9YH1jYXNlImludmFsaWRfdmFsdWUiOnJldHVybiBlLnZhbHVlcy5sZW5ndGg9PT0xP2BOZWlzcHJhdm5hIHZyaWplZG5vc3Q6IG/EjWVraXZhbm8gJHtTKGUudmFsdWVzWzBdKX1gOmBOZWlzcHJhdm5hIG9wY2lqYTogb8SNZWtpdmFubyBqZWRubyBvZCAke18oZS52YWx1ZXMsInwiKX1gO2Nhc2UidG9vX2JpZyI6e2NvbnN0IGk9ZS5pbmNsdXNpdmU/Ijw9IjoiPCIsYT1uKGUub3JpZ2luKSxzPW9bZS5vcmlnaW5dPz9lLm9yaWdpbjtyZXR1cm4gYT9gUHJldmVsaWtvOiBvxI1la2l2YW5vIGRhICR7cz8/InZyaWplZG5vc3QifSBpbWEgJHtpfSR7ZS5tYXhpbXVtLnRvU3RyaW5nKCl9ICR7YS51bml0Pz8iZWxlbWVuYXRhIn1gOmBQcmV2ZWxpa286IG/EjWVraXZhbm8gZGEgJHtzPz8idnJpamVkbm9zdCJ9IGJ1ZGUgJHtpfSR7ZS5tYXhpbXVtLnRvU3RyaW5nKCl9YH1jYXNlInRvb19zbWFsbCI6e2NvbnN0IGk9ZS5pbmNsdXNpdmU/Ij49IjoiPiIsYT1uKGUub3JpZ2luKSxzPW9bZS5vcmlnaW5dPz9lLm9yaWdpbjtyZXR1cm4gYT9gUHJlbWFsbzogb8SNZWtpdmFubyBkYSAke3N9IGltYSAke2l9JHtlLm1pbmltdW0udG9TdHJpbmcoKX0gJHthLnVuaXR9YDpgUHJlbWFsbzogb8SNZWtpdmFubyBkYSAke3N9IGJ1ZGUgJHtpfSR7ZS5taW5pbXVtLnRvU3RyaW5nKCl9YH1jYXNlImludmFsaWRfZm9ybWF0Ijp7Y29uc3QgaT1lO3JldHVybiBpLmZvcm1hdD09PSJzdGFydHNfd2l0aCI/YE5laXNwcmF2YW4gdGVrc3Q6IG1vcmEgemFwb8SNaW5qYXRpIHMgIiR7aS5wcmVmaXh9ImA6aS5mb3JtYXQ9PT0iZW5kc193aXRoIj9gTmVpc3ByYXZhbiB0ZWtzdDogbW9yYSB6YXZyxaFhdmF0aSBzICIke2kuc3VmZml4fSJgOmkuZm9ybWF0PT09ImluY2x1ZGVzIj9gTmVpc3ByYXZhbiB0ZWtzdDogbW9yYSBzYWRyxb5hdmF0aSAiJHtpLmluY2x1ZGVzfSJgOmkuZm9ybWF0PT09InJlZ2V4Ij9gTmVpc3ByYXZhbiB0ZWtzdDogbW9yYSBvZGdvdmFyYXRpIHV6b3JrdSAke2kucGF0dGVybn1gOmBOZWlzcHJhdm5hICR7cltpLmZvcm1hdF0/P2UuZm9ybWF0fWB9Y2FzZSJub3RfbXVsdGlwbGVfb2YiOnJldHVybmBOZWlzcHJhdmFuIGJyb2o6IG1vcmEgYml0aSB2acWhZWtyYXRuaWsgb2QgJHtlLmRpdmlzb3J9YDtjYXNlInVucmVjb2duaXplZF9rZXlzIjpyZXR1cm5gTmVwcmVwb3puYXQke2Uua2V5cy5sZW5ndGg+MT8iaSBrbGp1xI1ldmkiOiIga2xqdcSNIn06ICR7XyhlLmtleXMsIiwgIil9YDtjYXNlImludmFsaWRfa2V5IjpyZXR1cm5gTmVpc3ByYXZhbiBrbGp1xI0gdSAke29bZS5vcmlnaW5dPz9lLm9yaWdpbn1gO2Nhc2UiaW52YWxpZF91bmlvbiI6cmV0dXJuIk5laXNwcmF2YW4gdW5vcyI7Y2FzZSJpbnZhbGlkX2VsZW1lbnQiOnJldHVybmBOZWlzcHJhdm5hIHZyaWplZG5vc3QgdSAke29bZS5vcmlnaW5dPz9lLm9yaWdpbn1gO2RlZmF1bHQ6cmV0dXJuIk5laXNwcmF2YW4gdW5vcyJ9fX07ZnVuY3Rpb24gJGYoKXtyZXR1cm57bG9jYWxlRXJyb3I6aGYoKX19Y29uc3QgX2Y9KCk9Pntjb25zdCB0PXtzdHJpbmc6e3VuaXQ6ImthcmFrdGVyIix2ZXJiOiJsZWd5ZW4ifSxmaWxlOnt1bml0OiJieXRlIix2ZXJiOiJsZWd5ZW4ifSxhcnJheTp7dW5pdDoiZWxlbSIsdmVyYjoibGVneWVuIn0sc2V0Ont1bml0OiJlbGVtIix2ZXJiOiJsZWd5ZW4ifX07ZnVuY3Rpb24gbihlKXtyZXR1cm4gdFtlXT8/bnVsbH1jb25zdCByPXtyZWdleDoiYmVtZW5ldCIsZW1haWw6ImVtYWlsIGPDrW0iLHVybDoiVVJMIixlbW9qaToiZW1vamkiLHV1aWQ6IlVVSUQiLHV1aWR2NDoiVVVJRHY0Iix1dWlkdjY6IlVVSUR2NiIsbmFub2lkOiJuYW5vaWQiLGd1aWQ6IkdVSUQiLGN1aWQ6ImN1aWQiLGN1aWQyOiJjdWlkMiIsdWxpZDoiVUxJRCIseGlkOiJYSUQiLGtzdWlkOiJLU1VJRCIsZGF0ZXRpbWU6IklTTyBpZMWRYsOpbHllZyIsZGF0ZToiSVNPIGTDoXR1bSIsdGltZToiSVNPIGlkxZEiLGR1cmF0aW9uOiJJU08gaWTFkWludGVydmFsbHVtIixpcHY0OiJJUHY0IGPDrW0iLGlwdjY6IklQdjYgY8OtbSIsY2lkcnY0OiJJUHY0IHRhcnRvbcOhbnkiLGNpZHJ2NjoiSVB2NiB0YXJ0b23DoW55IixiYXNlNjQ6ImJhc2U2NC1rw7Nkb2x0IHN0cmluZyIsYmFzZTY0dXJsOiJiYXNlNjR1cmwta8OzZG9sdCBzdHJpbmciLGpzb25fc3RyaW5nOiJKU09OIHN0cmluZyIsZTE2NDoiRS4xNjQgc3rDoW0iLGp3dDoiSldUIix0ZW1wbGF0ZV9saXRlcmFsOiJiZW1lbmV0In0sbz17bmFuOiJOYU4iLG51bWJlcjoic3rDoW0iLGFycmF5OiJ0w7ZtYiJ9O3JldHVybiBlPT57c3dpdGNoKGUuY29kZSl7Y2FzZSJpbnZhbGlkX3R5cGUiOntjb25zdCBpPW9bZS5leHBlY3RlZF0/P2UuZXhwZWN0ZWQsYT13KGUuaW5wdXQpLHM9b1thXT8/YTtyZXR1cm4vXltBLVpdLy50ZXN0KGUuZXhwZWN0ZWQpP2DDiXJ2w6lueXRlbGVuIGJlbWVuZXQ6IGEgdsOhcnQgw6lydMOpayBpbnN0YW5jZW9mICR7ZS5leHBlY3RlZH0sIGEga2Fwb3R0IMOpcnTDqWsgJHtzfWA6YMOJcnbDqW55dGVsZW4gYmVtZW5ldDogYSB2w6FydCDDqXJ0w6lrICR7aX0sIGEga2Fwb3R0IMOpcnTDqWsgJHtzfWB9Y2FzZSJpbnZhbGlkX3ZhbHVlIjpyZXR1cm4gZS52YWx1ZXMubGVuZ3RoPT09MT9gw4lydsOpbnl0ZWxlbiBiZW1lbmV0OiBhIHbDoXJ0IMOpcnTDqWsgJHtTKGUudmFsdWVzWzBdKX1gOmDDiXJ2w6lueXRlbGVuIG9wY2nDszogdmFsYW1lbHlpayDDqXJ0w6lrIHbDoXJ0ICR7XyhlLnZhbHVlcywifCIpfWA7Y2FzZSJ0b29fYmlnIjp7Y29uc3QgaT1lLmluY2x1c2l2ZT8iPD0iOiI8IixhPW4oZS5vcmlnaW4pO3JldHVybiBhP2BUw7psIG5hZ3k6ICR7ZS5vcmlnaW4/PyLDqXJ0w6lrIn0gbcOpcmV0ZSB0w7psIG5hZ3kgJHtpfSR7ZS5tYXhpbXVtLnRvU3RyaW5nKCl9ICR7YS51bml0Pz8iZWxlbSJ9YDpgVMO6bCBuYWd5OiBhIGJlbWVuZXRpIMOpcnTDqWsgJHtlLm9yaWdpbj8/IsOpcnTDqWsifSB0w7psIG5hZ3k6ICR7aX0ke2UubWF4aW11bS50b1N0cmluZygpfWB9Y2FzZSJ0b29fc21hbGwiOntjb25zdCBpPWUuaW5jbHVzaXZlPyI+PSI6Ij4iLGE9bihlLm9yaWdpbik7cmV0dXJuIGE/YFTDumwga2ljc2k6IGEgYmVtZW5ldGkgw6lydMOpayAke2Uub3JpZ2lufSBtw6lyZXRlIHTDumwga2ljc2kgJHtpfSR7ZS5taW5pbXVtLnRvU3RyaW5nKCl9ICR7YS51bml0fWA6YFTDumwga2ljc2k6IGEgYmVtZW5ldGkgw6lydMOpayAke2Uub3JpZ2lufSB0w7psIGtpY3NpICR7aX0ke2UubWluaW11bS50b1N0cmluZygpfWB9Y2FzZSJpbnZhbGlkX2Zvcm1hdCI6e2NvbnN0IGk9ZTtyZXR1cm4gaS5mb3JtYXQ9PT0ic3RhcnRzX3dpdGgiP2DDiXJ2w6lueXRlbGVuIHN0cmluZzogIiR7aS5wcmVmaXh9IiDDqXJ0w6lra2VsIGtlbGwga2V6ZMWRZG5pZWA6aS5mb3JtYXQ9PT0iZW5kc193aXRoIj9gw4lydsOpbnl0ZWxlbiBzdHJpbmc6ICIke2kuc3VmZml4fSIgw6lydMOpa2tlbCBrZWxsIHbDqWd6xZFkbmllYDppLmZvcm1hdD09PSJpbmNsdWRlcyI/YMOJcnbDqW55dGVsZW4gc3RyaW5nOiAiJHtpLmluY2x1ZGVzfSIgw6lydMOpa2V0IGtlbGwgdGFydGFsbWF6bmlhYDppLmZvcm1hdD09PSJyZWdleCI/YMOJcnbDqW55dGVsZW4gc3RyaW5nOiAke2kucGF0dGVybn0gbWludMOhbmFrIGtlbGwgbWVnZmVsZWxuaWVgOmDDiXJ2w6lueXRlbGVuICR7cltpLmZvcm1hdF0/P2UuZm9ybWF0fWB9Y2FzZSJub3RfbXVsdGlwbGVfb2YiOnJldHVybmDDiXJ2w6lueXRlbGVuIHN6w6FtOiAke2UuZGl2aXNvcn0gdMO2YmJzesO2csO2c8OpbmVrIGtlbGwgbGVubmllYDtjYXNlInVucmVjb2duaXplZF9rZXlzIjpyZXR1cm5gSXNtZXJldGxlbiBrdWxjcyR7ZS5rZXlzLmxlbmd0aD4xPyJzIjoiIn06ICR7XyhlLmtleXMsIiwgIil9YDtjYXNlImludmFsaWRfa2V5IjpyZXR1cm5gw4lydsOpbnl0ZWxlbiBrdWxjcyAke2Uub3JpZ2lufWA7Y2FzZSJpbnZhbGlkX3VuaW9uIjpyZXR1cm4iw4lydsOpbnl0ZWxlbiBiZW1lbmV0IjtjYXNlImludmFsaWRfZWxlbWVudCI6cmV0dXJuYMOJcnbDqW55dGVsZW4gw6lydMOpazogJHtlLm9yaWdpbn1gO2RlZmF1bHQ6cmV0dXJuIsOJcnbDqW55dGVsZW4gYmVtZW5ldCJ9fX07ZnVuY3Rpb24gYmYoKXtyZXR1cm57bG9jYWxlRXJyb3I6X2YoKX19ZnVuY3Rpb24gVXModCxuLHIpe3JldHVybiBNYXRoLmFicyh0KT09PTE/bjpyfWZ1bmN0aW9uIHFlKHQpe2lmKCF0KXJldHVybiIiO2NvbnN0IG49WyLVoSIsItWlIiwi1agiLCLVqyIsItW4Iiwi1bjWgiIsItaFIl0scj10W3QubGVuZ3RoLTFdO3JldHVybiB0KyhuLmluY2x1ZGVzKHIpPyLVtiI6ItWoIil9Y29uc3QgeWY9KCk9Pntjb25zdCB0PXtzdHJpbmc6e3VuaXQ6e29uZToi1bbVt9Wh1bYiLG1hbnk6ItW21bfVodW21bbVpdaAIn0sdmVyYjoi1bjWgtW21aXVttWh1awifSxmaWxlOnt1bml0OntvbmU6ItWi1aHVtdWpIixtYW55OiLVotWh1bXVqdWl1oAifSx2ZXJiOiLVuNaC1bbVpdW21aHVrCJ9LGFycmF5Ont1bml0OntvbmU6ItW/1aHWgNaAIixtYW55OiLVv9Wh1oDWgNWl1oAifSx2ZXJiOiLVuNaC1bbVpdW21aHVrCJ9LHNldDp7dW5pdDp7b25lOiLVv9Wh1oDWgCIsbWFueToi1b/VodaA1oDVpdaAIn0sdmVyYjoi1bjWgtW21aXVttWh1awifX07ZnVuY3Rpb24gbihlKXtyZXR1cm4gdFtlXT8/bnVsbH1jb25zdCByPXtyZWdleDoi1bTVuNaC1b/WhCIsZW1haWw6ItWn1awuINWw1aHVvdaB1aUiLHVybDoiVVJMIixlbW9qaToi1afVtNW41bvVqyIsdXVpZDoiVVVJRCIsdXVpZHY0OiJVVUlEdjQiLHV1aWR2NjoiVVVJRHY2IixuYW5vaWQ6Im5hbm9pZCIsZ3VpZDoiR1VJRCIsY3VpZDoiY3VpZCIsY3VpZDI6ImN1aWQyIix1bGlkOiJVTElEIix4aWQ6IlhJRCIsa3N1aWQ6IktTVUlEIixkYXRldGltZToiSVNPINWh1bTVvdWh1anVq9W+INaHINWq1aHVtCIsZGF0ZToiSVNPINWh1bTVvdWh1anVq9W+Iix0aW1lOiJJU08g1arVodW0IixkdXJhdGlvbjoiSVNPINW/1ofVuNWy1bjWgtWp1bXVuNaC1bYiLGlwdjQ6IklQdjQg1bDVodW91oHVpSIsaXB2NjoiSVB2NiDVsNWh1b3WgdWlIixjaWRydjQ6IklQdjQg1bTVq9W71aHVr9Wh1bXWhCIsY2lkcnY2OiJJUHY2INW01avVu9Wh1a/VodW11oQiLGJhc2U2NDoiYmFzZTY0INWx1ofVodW51aHWg9W41b4g1b/VuNWyIixiYXNlNjR1cmw6ImJhc2U2NHVybCDVsdaH1aHVudWh1oPVuNW+INW/1bjVsiIsanNvbl9zdHJpbmc6IkpTT04g1b/VuNWyIixlMTY0OiJFLjE2NCDVsNWh1bTVodaAIixqd3Q6IkpXVCIsdGVtcGxhdGVfbGl0ZXJhbDoi1bTVuNaC1b/WhCJ9LG89e25hbjoiTmFOIixudW1iZXI6ItWp1avVviIsYXJyYXk6ItWm1aHVttWj1b7VodWuIn07cmV0dXJuIGU9Pntzd2l0Y2goZS5jb2RlKXtjYXNlImludmFsaWRfdHlwZSI6e2NvbnN0IGk9b1tlLmV4cGVjdGVkXT8/ZS5leHBlY3RlZCxhPXcoZS5pbnB1dCkscz1vW2FdPz9hO3JldHVybi9eW0EtWl0vLnRlc3QoZS5leHBlY3RlZCk/YNWN1a3VodWsINW01bjWgtW/1oTVodWj1oDVuNaC1bTigKQg1b3VutWh1b3VvtW41oLVtCDVp9aAIGluc3RhbmNlb2YgJHtlLmV4cGVjdGVkfSwg1b3Vv9Wh1oHVvtWl1awg1acgJHtzfWA6YNWN1a3VodWsINW01bjWgtW/1oTVodWj1oDVuNaC1bTigKQg1b3VutWh1b3VvtW41oLVtCDVp9aAICR7aX0sINW91b/VodaB1b7VpdWsINWnICR7c31gfWNhc2UiaW52YWxpZF92YWx1ZSI6cmV0dXJuIGUudmFsdWVzLmxlbmd0aD09PTE/YNWN1a3VodWsINW01bjWgtW/1oTVodWj1oDVuNaC1bTigKQg1b3VutWh1b3VvtW41oLVtCDVp9aAICR7UyhlLnZhbHVlc1sxXSl9YDpg1Y3VrdWh1awg1b/VodaA1aLVpdaA1aHVr+KApCDVvdW61aHVvdW+1bjWgtW0INWn1oAg1bDVpdW/1ofVtdWh1azVttWl1oDVq9aBINW01aXVr9Wo1Z0gJHtfKGUudmFsdWVzLCJ8Iil9YDtjYXNlInRvb19iaWciOntjb25zdCBpPWUuaW5jbHVzaXZlPyI8PSI6IjwiLGE9bihlLm9yaWdpbik7aWYoYSl7Y29uc3Qgcz1OdW1iZXIoZS5tYXhpbXVtKSxjPVVzKHMsYS51bml0Lm9uZSxhLnVuaXQubWFueSk7cmV0dXJuYNWJ1aHWg9Wh1abVodW21oEg1bTVpdWuINWh1oDVqtWl1oTigKQg1b3VutWh1b3VvtW41oLVtCDVpywg1bjWgCAke3FlKGUub3JpZ2luPz8i1aHWgNWq1aXWhCIpfSDVr9W41oLVttWl1bbVoSAke2l9JHtlLm1heGltdW0udG9TdHJpbmcoKX0gJHtjfWB9cmV0dXJuYNWJ1aHWg9Wh1abVodW21oEg1bTVpdWuINWh1oDVqtWl1oTigKQg1b3VutWh1b3VvtW41oLVtCDVpywg1bjWgCAke3FlKGUub3JpZ2luPz8i1aHWgNWq1aXWhCIpfSDVrNWr1bbVqyAke2l9JHtlLm1heGltdW0udG9TdHJpbmcoKX1gfWNhc2UidG9vX3NtYWxsIjp7Y29uc3QgaT1lLmluY2x1c2l2ZT8iPj0iOiI+IixhPW4oZS5vcmlnaW4pO2lmKGEpe2NvbnN0IHM9TnVtYmVyKGUubWluaW11bSksYz1VcyhzLGEudW5pdC5vbmUsYS51bml0Lm1hbnkpO3JldHVybmDVidWh1oPVodWm1aHVttaBINaD1bjWhNaAINWh1oDVqtWl1oTigKQg1b3VutWh1b3VvtW41oLVtCDVpywg1bjWgCAke3FlKGUub3JpZ2luKX0g1a/VuNaC1bbVpdW21aEgJHtpfSR7ZS5taW5pbXVtLnRvU3RyaW5nKCl9ICR7Y31gfXJldHVybmDVidWh1oPVodWm1aHVttaBINaD1bjWhNaAINWh1oDVqtWl1oTigKQg1b3VutWh1b3VvtW41oLVtCDVpywg1bjWgCAke3FlKGUub3JpZ2luKX0g1azVq9W21asgJHtpfSR7ZS5taW5pbXVtLnRvU3RyaW5nKCl9YH1jYXNlImludmFsaWRfZm9ybWF0Ijp7Y29uc3QgaT1lO3JldHVybiBpLmZvcm1hdD09PSJzdGFydHNfd2l0aCI/YNWN1a3VodWsINW/1bjVsuKApCDVutWl1b/WhCDVpyDVvdWv1b3VvtWrICIke2kucHJlZml4fSIt1bjVvmA6aS5mb3JtYXQ9PT0iZW5kc193aXRoIj9g1Y3VrdWh1awg1b/VuNWy4oCkINW61aXVv9aEINWnINWh1b7VodaA1b/VvtWrICIke2kuc3VmZml4fSIt1bjVvmA6aS5mb3JtYXQ9PT0iaW5jbHVkZXMiP2DVjdWt1aHVrCDVv9W41bLigKQg1brVpdW/1oQg1acg1brVodaA1bjWgtW21aHVr9WrICIke2kuaW5jbHVkZXN9ImA6aS5mb3JtYXQ9PT0icmVnZXgiP2DVjdWt1aHVrCDVv9W41bLigKQg1brVpdW/1oQg1acg1bDVodW01aHVutWh1b/VodW91a3VodW21asgJHtpLnBhdHRlcm59INWx1ofVodW51aHWg9Wr1bZgOmDVjdWt1aHVrCAke3JbaS5mb3JtYXRdPz9lLmZvcm1hdH1gfWNhc2Uibm90X211bHRpcGxlX29mIjpyZXR1cm5g1Y3VrdWh1awg1anVq9W+4oCkINW61aXVv9aEINWnINWi1aHVptW01aHVutWh1b/Vq9WvINWs1avVttWrICR7ZS5kaXZpc29yfS3Vq2A7Y2FzZSJ1bnJlY29nbml6ZWRfa2V5cyI6cmV0dXJuYNWJ1bPVodW21aHVudW+1aHVriDVotWh1bbVodWs1aske2Uua2V5cy5sZW5ndGg+MT8i1bbVpdaAIjoiIn0uICR7XyhlLmtleXMsIiwgIil9YDtjYXNlImludmFsaWRfa2V5IjpyZXR1cm5g1Y3VrdWh1awg1aLVodW21aHVrNWrICR7cWUoZS5vcmlnaW4pfS3VuNaC1bRgO2Nhc2UiaW52YWxpZF91bmlvbiI6cmV0dXJuItWN1a3VodWsINW01bjWgtW/1oTVodWj1oDVuNaC1bQiO2Nhc2UiaW52YWxpZF9lbGVtZW50IjpyZXR1cm5g1Y3VrdWh1awg1aHWgNWq1aXWhCAke3FlKGUub3JpZ2luKX0t1bjWgtW0YDtkZWZhdWx0OnJldHVybiLVjdWt1aHVrCDVtNW41oLVv9aE1aHVo9aA1bjWgtW0In19fTtmdW5jdGlvbiBrZigpe3JldHVybntsb2NhbGVFcnJvcjp5ZigpfX1jb25zdCBTZj0oKT0+e2NvbnN0IHQ9e3N0cmluZzp7dW5pdDoia2FyYWt0ZXIiLHZlcmI6Im1lbWlsaWtpIn0sZmlsZTp7dW5pdDoiYnl0ZSIsdmVyYjoibWVtaWxpa2kifSxhcnJheTp7dW5pdDoiaXRlbSIsdmVyYjoibWVtaWxpa2kifSxzZXQ6e3VuaXQ6Iml0ZW0iLHZlcmI6Im1lbWlsaWtpIn19O2Z1bmN0aW9uIG4oZSl7cmV0dXJuIHRbZV0/P251bGx9Y29uc3Qgcj17cmVnZXg6ImlucHV0IixlbWFpbDoiYWxhbWF0IGVtYWlsIix1cmw6IlVSTCIsZW1vamk6ImVtb2ppIix1dWlkOiJVVUlEIix1dWlkdjQ6IlVVSUR2NCIsdXVpZHY2OiJVVUlEdjYiLG5hbm9pZDoibmFub2lkIixndWlkOiJHVUlEIixjdWlkOiJjdWlkIixjdWlkMjoiY3VpZDIiLHVsaWQ6IlVMSUQiLHhpZDoiWElEIixrc3VpZDoiS1NVSUQiLGRhdGV0aW1lOiJ0YW5nZ2FsIGRhbiB3YWt0dSBmb3JtYXQgSVNPIixkYXRlOiJ0YW5nZ2FsIGZvcm1hdCBJU08iLHRpbWU6ImphbSBmb3JtYXQgSVNPIixkdXJhdGlvbjoiZHVyYXNpIGZvcm1hdCBJU08iLGlwdjQ6ImFsYW1hdCBJUHY0IixpcHY2OiJhbGFtYXQgSVB2NiIsY2lkcnY0OiJyZW50YW5nIGFsYW1hdCBJUHY0IixjaWRydjY6InJlbnRhbmcgYWxhbWF0IElQdjYiLGJhc2U2NDoic3RyaW5nIGRlbmdhbiBlbmtvZGUgYmFzZTY0IixiYXNlNjR1cmw6InN0cmluZyBkZW5nYW4gZW5rb2RlIGJhc2U2NHVybCIsanNvbl9zdHJpbmc6InN0cmluZyBKU09OIixlMTY0OiJhbmdrYSBFLjE2NCIsand0OiJKV1QiLHRlbXBsYXRlX2xpdGVyYWw6ImlucHV0In0sbz17bmFuOiJOYU4ifTtyZXR1cm4gZT0+e3N3aXRjaChlLmNvZGUpe2Nhc2UiaW52YWxpZF90eXBlIjp7Y29uc3QgaT1vW2UuZXhwZWN0ZWRdPz9lLmV4cGVjdGVkLGE9dyhlLmlucHV0KSxzPW9bYV0/P2E7cmV0dXJuL15bQS1aXS8udGVzdChlLmV4cGVjdGVkKT9gSW5wdXQgdGlkYWsgdmFsaWQ6IGRpaGFyYXBrYW4gaW5zdGFuY2VvZiAke2UuZXhwZWN0ZWR9LCBkaXRlcmltYSAke3N9YDpgSW5wdXQgdGlkYWsgdmFsaWQ6IGRpaGFyYXBrYW4gJHtpfSwgZGl0ZXJpbWEgJHtzfWB9Y2FzZSJpbnZhbGlkX3ZhbHVlIjpyZXR1cm4gZS52YWx1ZXMubGVuZ3RoPT09MT9gSW5wdXQgdGlkYWsgdmFsaWQ6IGRpaGFyYXBrYW4gJHtTKGUudmFsdWVzWzBdKX1gOmBQaWxpaGFuIHRpZGFrIHZhbGlkOiBkaWhhcmFwa2FuIHNhbGFoIHNhdHUgZGFyaSAke18oZS52YWx1ZXMsInwiKX1gO2Nhc2UidG9vX2JpZyI6e2NvbnN0IGk9ZS5pbmNsdXNpdmU/Ijw9IjoiPCIsYT1uKGUub3JpZ2luKTtyZXR1cm4gYT9gVGVybGFsdSBiZXNhcjogZGloYXJhcGthbiAke2Uub3JpZ2luPz8idmFsdWUifSBtZW1pbGlraSAke2l9JHtlLm1heGltdW0udG9TdHJpbmcoKX0gJHthLnVuaXQ/PyJlbGVtZW4ifWA6YFRlcmxhbHUgYmVzYXI6IGRpaGFyYXBrYW4gJHtlLm9yaWdpbj8/InZhbHVlIn0gbWVuamFkaSAke2l9JHtlLm1heGltdW0udG9TdHJpbmcoKX1gfWNhc2UidG9vX3NtYWxsIjp7Y29uc3QgaT1lLmluY2x1c2l2ZT8iPj0iOiI+IixhPW4oZS5vcmlnaW4pO3JldHVybiBhP2BUZXJsYWx1IGtlY2lsOiBkaWhhcmFwa2FuICR7ZS5vcmlnaW59IG1lbWlsaWtpICR7aX0ke2UubWluaW11bS50b1N0cmluZygpfSAke2EudW5pdH1gOmBUZXJsYWx1IGtlY2lsOiBkaWhhcmFwa2FuICR7ZS5vcmlnaW59IG1lbmphZGkgJHtpfSR7ZS5taW5pbXVtLnRvU3RyaW5nKCl9YH1jYXNlImludmFsaWRfZm9ybWF0Ijp7Y29uc3QgaT1lO3JldHVybiBpLmZvcm1hdD09PSJzdGFydHNfd2l0aCI/YFN0cmluZyB0aWRhayB2YWxpZDogaGFydXMgZGltdWxhaSBkZW5nYW4gIiR7aS5wcmVmaXh9ImA6aS5mb3JtYXQ9PT0iZW5kc193aXRoIj9gU3RyaW5nIHRpZGFrIHZhbGlkOiBoYXJ1cyBiZXJha2hpciBkZW5nYW4gIiR7aS5zdWZmaXh9ImA6aS5mb3JtYXQ9PT0iaW5jbHVkZXMiP2BTdHJpbmcgdGlkYWsgdmFsaWQ6IGhhcnVzIG1lbnllcnRha2FuICIke2kuaW5jbHVkZXN9ImA6aS5mb3JtYXQ9PT0icmVnZXgiP2BTdHJpbmcgdGlkYWsgdmFsaWQ6IGhhcnVzIHNlc3VhaSBwb2xhICR7aS5wYXR0ZXJufWA6YCR7cltpLmZvcm1hdF0/P2UuZm9ybWF0fSB0aWRhayB2YWxpZGB9Y2FzZSJub3RfbXVsdGlwbGVfb2YiOnJldHVybmBBbmdrYSB0aWRhayB2YWxpZDogaGFydXMga2VsaXBhdGFuIGRhcmkgJHtlLmRpdmlzb3J9YDtjYXNlInVucmVjb2duaXplZF9rZXlzIjpyZXR1cm5gS3VuY2kgdGlkYWsgZGlrZW5hbGkgJHtlLmtleXMubGVuZ3RoPjE/InMiOiIifTogJHtfKGUua2V5cywiLCAiKX1gO2Nhc2UiaW52YWxpZF9rZXkiOnJldHVybmBLdW5jaSB0aWRhayB2YWxpZCBkaSAke2Uub3JpZ2lufWA7Y2FzZSJpbnZhbGlkX3VuaW9uIjpyZXR1cm4iSW5wdXQgdGlkYWsgdmFsaWQiO2Nhc2UiaW52YWxpZF9lbGVtZW50IjpyZXR1cm5gTmlsYWkgdGlkYWsgdmFsaWQgZGkgJHtlLm9yaWdpbn1gO2RlZmF1bHQ6cmV0dXJuIklucHV0IHRpZGFrIHZhbGlkIn19fTtmdW5jdGlvbiB3Zigpe3JldHVybntsb2NhbGVFcnJvcjpTZigpfX1jb25zdCBJZj0oKT0+e2NvbnN0IHQ9e3N0cmluZzp7dW5pdDoic3RhZmkiLHZlcmI6ImHDsCBoYWZhIn0sZmlsZTp7dW5pdDoiYsOmdGkiLHZlcmI6ImHDsCBoYWZhIn0sYXJyYXk6e3VuaXQ6ImhsdXRpIix2ZXJiOiJhw7AgaGFmYSJ9LHNldDp7dW5pdDoiaGx1dGkiLHZlcmI6ImHDsCBoYWZhIn19O2Z1bmN0aW9uIG4oZSl7cmV0dXJuIHRbZV0/P251bGx9Y29uc3Qgcj17cmVnZXg6ImdpbGRpIixlbWFpbDoibmV0ZmFuZyIsdXJsOiJ2ZWZzbMOzw7AiLGVtb2ppOiJlbW9qaSIsdXVpZDoiVVVJRCIsdXVpZHY0OiJVVUlEdjQiLHV1aWR2NjoiVVVJRHY2IixuYW5vaWQ6Im5hbm9pZCIsZ3VpZDoiR1VJRCIsY3VpZDoiY3VpZCIsY3VpZDI6ImN1aWQyIix1bGlkOiJVTElEIix4aWQ6IlhJRCIsa3N1aWQ6IktTVUlEIixkYXRldGltZToiSVNPIGRhZ3NldG5pbmcgb2cgdMOtbWkiLGRhdGU6IklTTyBkYWdzZXRuaW5nIix0aW1lOiJJU08gdMOtbWkiLGR1cmF0aW9uOiJJU08gdMOtbWFsZW5nZCIsaXB2NDoiSVB2NCBhZGRyZXNzIixpcHY2OiJJUHY2IGFkZHJlc3MiLGNpZHJ2NDoiSVB2NCByYW5nZSIsY2lkcnY2OiJJUHY2IHJhbmdlIixiYXNlNjQ6ImJhc2U2NC1lbmNvZGVkIHN0cmVuZ3VyIixiYXNlNjR1cmw6ImJhc2U2NHVybC1lbmNvZGVkIHN0cmVuZ3VyIixqc29uX3N0cmluZzoiSlNPTiBzdHJlbmd1ciIsZTE2NDoiRS4xNjQgdMO2bHVnaWxkaSIsand0OiJKV1QiLHRlbXBsYXRlX2xpdGVyYWw6ImdpbGRpIn0sbz17bmFuOiJOYU4iLG51bWJlcjoibsO6bWVyIixhcnJheToiZnlsa2kifTtyZXR1cm4gZT0+e3N3aXRjaChlLmNvZGUpe2Nhc2UiaW52YWxpZF90eXBlIjp7Y29uc3QgaT1vW2UuZXhwZWN0ZWRdPz9lLmV4cGVjdGVkLGE9dyhlLmlucHV0KSxzPW9bYV0/P2E7cmV0dXJuL15bQS1aXS8udGVzdChlLmV4cGVjdGVkKT9gUmFuZ3QgZ2lsZGk6IMOew7ogc2zDs3N0IGlubiAke3N9IMO+YXIgc2VtIMOhIGHDsCB2ZXJhIGluc3RhbmNlb2YgJHtlLmV4cGVjdGVkfWA6YFJhbmd0IGdpbGRpOiDDnsO6IHNsw7NzdCBpbm4gJHtzfSDDvmFyIHNlbSDDoSBhw7AgdmVyYSAke2l9YH1jYXNlImludmFsaWRfdmFsdWUiOnJldHVybiBlLnZhbHVlcy5sZW5ndGg9PT0xP2BSYW5ndCBnaWxkaTogZ2VydCByw6HDsCBmeXJpciAke1MoZS52YWx1ZXNbMF0pfWA6YMOTZ2lsdCB2YWw6IG3DoSB2ZXJhIGVpdHQgYWYgZWZ0aXJmYXJhbmRpICR7XyhlLnZhbHVlcywifCIpfWA7Y2FzZSJ0b29fYmlnIjp7Y29uc3QgaT1lLmluY2x1c2l2ZT8iPD0iOiI8IixhPW4oZS5vcmlnaW4pO3JldHVybiBhP2BPZiBzdMOzcnQ6IGdlcnQgZXIgcsOhw7AgZnlyaXIgYcOwICR7ZS5vcmlnaW4/PyJnaWxkaSJ9IGhhZmkgJHtpfSR7ZS5tYXhpbXVtLnRvU3RyaW5nKCl9ICR7YS51bml0Pz8iaGx1dGkifWA6YE9mIHN0w7NydDogZ2VydCBlciByw6HDsCBmeXJpciBhw7AgJHtlLm9yaWdpbj8/ImdpbGRpIn0gc8OpICR7aX0ke2UubWF4aW11bS50b1N0cmluZygpfWB9Y2FzZSJ0b29fc21hbGwiOntjb25zdCBpPWUuaW5jbHVzaXZlPyI+PSI6Ij4iLGE9bihlLm9yaWdpbik7cmV0dXJuIGE/YE9mIGzDrXRpw7A6IGdlcnQgZXIgcsOhw7AgZnlyaXIgYcOwICR7ZS5vcmlnaW59IGhhZmkgJHtpfSR7ZS5taW5pbXVtLnRvU3RyaW5nKCl9ICR7YS51bml0fWA6YE9mIGzDrXRpw7A6IGdlcnQgZXIgcsOhw7AgZnlyaXIgYcOwICR7ZS5vcmlnaW59IHPDqSAke2l9JHtlLm1pbmltdW0udG9TdHJpbmcoKX1gfWNhc2UiaW52YWxpZF9mb3JtYXQiOntjb25zdCBpPWU7cmV0dXJuIGkuZm9ybWF0PT09InN0YXJ0c193aXRoIj9gw5NnaWxkdXIgc3RyZW5ndXI6IHZlcsOwdXIgYcOwIGJ5cmphIMOhICIke2kucHJlZml4fSJgOmkuZm9ybWF0PT09ImVuZHNfd2l0aCI/YMOTZ2lsZHVyIHN0cmVuZ3VyOiB2ZXLDsHVyIGHDsCBlbmRhIMOhICIke2kuc3VmZml4fSJgOmkuZm9ybWF0PT09ImluY2x1ZGVzIj9gw5NnaWxkdXIgc3RyZW5ndXI6IHZlcsOwdXIgYcOwIGlubmloYWxkYSAiJHtpLmluY2x1ZGVzfSJgOmkuZm9ybWF0PT09InJlZ2V4Ij9gw5NnaWxkdXIgc3RyZW5ndXI6IHZlcsOwdXIgYcOwIGZ5bGdqYSBteW5zdHJpICR7aS5wYXR0ZXJufWA6YFJhbmd0ICR7cltpLmZvcm1hdF0/P2UuZm9ybWF0fWB9Y2FzZSJub3RfbXVsdGlwbGVfb2YiOnJldHVybmBSw7ZuZyB0YWxhOiB2ZXLDsHVyIGHDsCB2ZXJhIG1hcmdmZWxkaSBhZiAke2UuZGl2aXNvcn1gO2Nhc2UidW5yZWNvZ25pemVkX2tleXMiOnJldHVybmDDk8O+ZWtrdCAke2Uua2V5cy5sZW5ndGg+MT8iaXIgbHlrbGFyIjoidXIgbHlraWxsIn06ICR7XyhlLmtleXMsIiwgIil9YDtjYXNlImludmFsaWRfa2V5IjpyZXR1cm5gUmFuZ3VyIGx5a2lsbCDDrSAke2Uub3JpZ2lufWA7Y2FzZSJpbnZhbGlkX3VuaW9uIjpyZXR1cm4iUmFuZ3QgZ2lsZGkiO2Nhc2UiaW52YWxpZF9lbGVtZW50IjpyZXR1cm5gUmFuZ3QgZ2lsZGkgw60gJHtlLm9yaWdpbn1gO2RlZmF1bHQ6cmV0dXJuIlJhbmd0IGdpbGRpIn19fTtmdW5jdGlvbiB6Zigpe3JldHVybntsb2NhbGVFcnJvcjpJZigpfX1jb25zdCB4Zj0oKT0+e2NvbnN0IHQ9e3N0cmluZzp7dW5pdDoiY2FyYXR0ZXJpIix2ZXJiOiJhdmVyZSJ9LGZpbGU6e3VuaXQ6ImJ5dGUiLHZlcmI6ImF2ZXJlIn0sYXJyYXk6e3VuaXQ6ImVsZW1lbnRpIix2ZXJiOiJhdmVyZSJ9LHNldDp7dW5pdDoiZWxlbWVudGkiLHZlcmI6ImF2ZXJlIn19O2Z1bmN0aW9uIG4oZSl7cmV0dXJuIHRbZV0/P251bGx9Y29uc3Qgcj17cmVnZXg6ImlucHV0IixlbWFpbDoiaW5kaXJpenpvIGVtYWlsIix1cmw6IlVSTCIsZW1vamk6ImVtb2ppIix1dWlkOiJVVUlEIix1dWlkdjQ6IlVVSUR2NCIsdXVpZHY2OiJVVUlEdjYiLG5hbm9pZDoibmFub2lkIixndWlkOiJHVUlEIixjdWlkOiJjdWlkIixjdWlkMjoiY3VpZDIiLHVsaWQ6IlVMSUQiLHhpZDoiWElEIixrc3VpZDoiS1NVSUQiLGRhdGV0aW1lOiJkYXRhIGUgb3JhIElTTyIsZGF0ZToiZGF0YSBJU08iLHRpbWU6Im9yYSBJU08iLGR1cmF0aW9uOiJkdXJhdGEgSVNPIixpcHY0OiJpbmRpcml6em8gSVB2NCIsaXB2NjoiaW5kaXJpenpvIElQdjYiLGNpZHJ2NDoiaW50ZXJ2YWxsbyBJUHY0IixjaWRydjY6ImludGVydmFsbG8gSVB2NiIsYmFzZTY0OiJzdHJpbmdhIGNvZGlmaWNhdGEgaW4gYmFzZTY0IixiYXNlNjR1cmw6IlVSTCBjb2RpZmljYXRhIGluIGJhc2U2NCIsanNvbl9zdHJpbmc6InN0cmluZ2EgSlNPTiIsZTE2NDoibnVtZXJvIEUuMTY0Iixqd3Q6IkpXVCIsdGVtcGxhdGVfbGl0ZXJhbDoiaW5wdXQifSxvPXtuYW46Ik5hTiIsbnVtYmVyOiJudW1lcm8iLGFycmF5OiJ2ZXR0b3JlIn07cmV0dXJuIGU9Pntzd2l0Y2goZS5jb2RlKXtjYXNlImludmFsaWRfdHlwZSI6e2NvbnN0IGk9b1tlLmV4cGVjdGVkXT8/ZS5leHBlY3RlZCxhPXcoZS5pbnB1dCkscz1vW2FdPz9hO3JldHVybi9eW0EtWl0vLnRlc3QoZS5leHBlY3RlZCk/YElucHV0IG5vbiB2YWxpZG86IGF0dGVzbyBpbnN0YW5jZW9mICR7ZS5leHBlY3RlZH0sIHJpY2V2dXRvICR7c31gOmBJbnB1dCBub24gdmFsaWRvOiBhdHRlc28gJHtpfSwgcmljZXZ1dG8gJHtzfWB9Y2FzZSJpbnZhbGlkX3ZhbHVlIjpyZXR1cm4gZS52YWx1ZXMubGVuZ3RoPT09MT9gSW5wdXQgbm9uIHZhbGlkbzogYXR0ZXNvICR7UyhlLnZhbHVlc1swXSl9YDpgT3B6aW9uZSBub24gdmFsaWRhOiBhdHRlc28gdW5vIHRyYSAke18oZS52YWx1ZXMsInwiKX1gO2Nhc2UidG9vX2JpZyI6e2NvbnN0IGk9ZS5pbmNsdXNpdmU/Ijw9IjoiPCIsYT1uKGUub3JpZ2luKTtyZXR1cm4gYT9gVHJvcHBvIGdyYW5kZTogJHtlLm9yaWdpbj8/InZhbG9yZSJ9IGRldmUgYXZlcmUgJHtpfSR7ZS5tYXhpbXVtLnRvU3RyaW5nKCl9ICR7YS51bml0Pz8iZWxlbWVudGkifWA6YFRyb3BwbyBncmFuZGU6ICR7ZS5vcmlnaW4/PyJ2YWxvcmUifSBkZXZlIGVzc2VyZSAke2l9JHtlLm1heGltdW0udG9TdHJpbmcoKX1gfWNhc2UidG9vX3NtYWxsIjp7Y29uc3QgaT1lLmluY2x1c2l2ZT8iPj0iOiI+IixhPW4oZS5vcmlnaW4pO3JldHVybiBhP2BUcm9wcG8gcGljY29sbzogJHtlLm9yaWdpbn0gZGV2ZSBhdmVyZSAke2l9JHtlLm1pbmltdW0udG9TdHJpbmcoKX0gJHthLnVuaXR9YDpgVHJvcHBvIHBpY2NvbG86ICR7ZS5vcmlnaW59IGRldmUgZXNzZXJlICR7aX0ke2UubWluaW11bS50b1N0cmluZygpfWB9Y2FzZSJpbnZhbGlkX2Zvcm1hdCI6e2NvbnN0IGk9ZTtyZXR1cm4gaS5mb3JtYXQ9PT0ic3RhcnRzX3dpdGgiP2BTdHJpbmdhIG5vbiB2YWxpZGE6IGRldmUgaW5pemlhcmUgY29uICIke2kucHJlZml4fSJgOmkuZm9ybWF0PT09ImVuZHNfd2l0aCI/YFN0cmluZ2Egbm9uIHZhbGlkYTogZGV2ZSB0ZXJtaW5hcmUgY29uICIke2kuc3VmZml4fSJgOmkuZm9ybWF0PT09ImluY2x1ZGVzIj9gU3RyaW5nYSBub24gdmFsaWRhOiBkZXZlIGluY2x1ZGVyZSAiJHtpLmluY2x1ZGVzfSJgOmkuZm9ybWF0PT09InJlZ2V4Ij9gU3RyaW5nYSBub24gdmFsaWRhOiBkZXZlIGNvcnJpc3BvbmRlcmUgYWwgcGF0dGVybiAke2kucGF0dGVybn1gOmBJbnB1dCBub24gdmFsaWRvOiAke3JbaS5mb3JtYXRdPz9lLmZvcm1hdH1gfWNhc2Uibm90X211bHRpcGxlX29mIjpyZXR1cm5gTnVtZXJvIG5vbiB2YWxpZG86IGRldmUgZXNzZXJlIHVuIG11bHRpcGxvIGRpICR7ZS5kaXZpc29yfWA7Y2FzZSJ1bnJlY29nbml6ZWRfa2V5cyI6cmV0dXJuYENoaWF2JHtlLmtleXMubGVuZ3RoPjE/ImkiOiJlIn0gbm9uIHJpY29ub3NjaXV0JHtlLmtleXMubGVuZ3RoPjE/ImUiOiJhIn06ICR7XyhlLmtleXMsIiwgIil9YDtjYXNlImludmFsaWRfa2V5IjpyZXR1cm5gQ2hpYXZlIG5vbiB2YWxpZGEgaW4gJHtlLm9yaWdpbn1gO2Nhc2UiaW52YWxpZF91bmlvbiI6cmV0dXJuIklucHV0IG5vbiB2YWxpZG8iO2Nhc2UiaW52YWxpZF9lbGVtZW50IjpyZXR1cm5gVmFsb3JlIG5vbiB2YWxpZG8gaW4gJHtlLm9yaWdpbn1gO2RlZmF1bHQ6cmV0dXJuIklucHV0IG5vbiB2YWxpZG8ifX19O2Z1bmN0aW9uIFRmKCl7cmV0dXJue2xvY2FsZUVycm9yOnhmKCl9fWNvbnN0IGpmPSgpPT57Y29uc3QgdD17c3RyaW5nOnt1bml0OiLmloflrZciLHZlcmI6IuOBp+OBguOCiyJ9LGZpbGU6e3VuaXQ6IuODkOOCpOODiCIsdmVyYjoi44Gn44GC44KLIn0sYXJyYXk6e3VuaXQ6Iuimgee0oCIsdmVyYjoi44Gn44GC44KLIn0sc2V0Ont1bml0OiLopoHntKAiLHZlcmI6IuOBp+OBguOCiyJ9fTtmdW5jdGlvbiBuKGUpe3JldHVybiB0W2VdPz9udWxsfWNvbnN0IHI9e3JlZ2V4OiLlhaXlipvlgKQiLGVtYWlsOiLjg6Hjg7zjg6vjgqLjg4njg6zjgrkiLHVybDoiVVJMIixlbW9qaToi57W15paH5a2XIix1dWlkOiJVVUlEIix1dWlkdjQ6IlVVSUR2NCIsdXVpZHY2OiJVVUlEdjYiLG5hbm9pZDoibmFub2lkIixndWlkOiJHVUlEIixjdWlkOiJjdWlkIixjdWlkMjoiY3VpZDIiLHVsaWQ6IlVMSUQiLHhpZDoiWElEIixrc3VpZDoiS1NVSUQiLGRhdGV0aW1lOiJJU0/ml6XmmYIiLGRhdGU6IklTT+aXpeS7mCIsdGltZToiSVNP5pmC5Yi7IixkdXJhdGlvbjoiSVNP5pyf6ZaTIixpcHY0OiJJUHY044Ki44OJ44Os44K5IixpcHY2OiJJUHY244Ki44OJ44Os44K5IixjaWRydjQ6IklQdjTnr4Tlm7IiLGNpZHJ2NjoiSVB2NuevhOWbsiIsYmFzZTY0OiJiYXNlNjTjgqjjg7PjgrPjg7zjg4nmloflrZfliJciLGJhc2U2NHVybDoiYmFzZTY0dXJs44Ko44Oz44Kz44O844OJ5paH5a2X5YiXIixqc29uX3N0cmluZzoiSlNPTuaWh+Wtl+WIlyIsZTE2NDoiRS4xNjTnlarlj7ciLGp3dDoiSldUIix0ZW1wbGF0ZV9saXRlcmFsOiLlhaXlipvlgKQifSxvPXtuYW46Ik5hTiIsbnVtYmVyOiLmlbDlgKQiLGFycmF5OiLphY3liJcifTtyZXR1cm4gZT0+e3N3aXRjaChlLmNvZGUpe2Nhc2UiaW52YWxpZF90eXBlIjp7Y29uc3QgaT1vW2UuZXhwZWN0ZWRdPz9lLmV4cGVjdGVkLGE9dyhlLmlucHV0KSxzPW9bYV0/P2E7cmV0dXJuL15bQS1aXS8udGVzdChlLmV4cGVjdGVkKT9g54Sh5Yq544Gq5YWl5YqbOiBpbnN0YW5jZW9mICR7ZS5leHBlY3RlZH3jgYzmnJ/lvoXjgZXjgozjgb7jgZfjgZ/jgYzjgIEke3N944GM5YWl5Yqb44GV44KM44G+44GX44GfYDpg54Sh5Yq544Gq5YWl5YqbOiAke2l944GM5pyf5b6F44GV44KM44G+44GX44Gf44GM44CBJHtzfeOBjOWFpeWKm+OBleOCjOOBvuOBl+OBn2B9Y2FzZSJpbnZhbGlkX3ZhbHVlIjpyZXR1cm4gZS52YWx1ZXMubGVuZ3RoPT09MT9g54Sh5Yq544Gq5YWl5YqbOiAke1MoZS52YWx1ZXNbMF0pfeOBjOacn+W+heOBleOCjOOBvuOBl+OBn2A6YOeEoeWKueOBqumBuOaKnjogJHtfKGUudmFsdWVzLCLjgIEiKX3jga7jgYTjgZrjgozjgYvjgafjgYLjgovlv4XopoHjgYzjgYLjgorjgb7jgZlgO2Nhc2UidG9vX2JpZyI6e2NvbnN0IGk9ZS5pbmNsdXNpdmU/IuS7peS4i+OBp+OBguOCiyI6IuOCiOOCiuWwj+OBleOBhCIsYT1uKGUub3JpZ2luKTtyZXR1cm4gYT9g5aSn44GN44GZ44GO44KL5YCkOiAke2Uub3JpZ2luPz8i5YCkIn3jga8ke2UubWF4aW11bS50b1N0cmluZygpfSR7YS51bml0Pz8i6KaB57SgIn0ke2l95b+F6KaB44GM44GC44KK44G+44GZYDpg5aSn44GN44GZ44GO44KL5YCkOiAke2Uub3JpZ2luPz8i5YCkIn3jga8ke2UubWF4aW11bS50b1N0cmluZygpfSR7aX3lv4XopoHjgYzjgYLjgorjgb7jgZlgfWNhc2UidG9vX3NtYWxsIjp7Y29uc3QgaT1lLmluY2x1c2l2ZT8i5Lul5LiK44Gn44GC44KLIjoi44KI44KK5aSn44GN44GEIixhPW4oZS5vcmlnaW4pO3JldHVybiBhP2DlsI/jgZXjgZnjgY7jgovlgKQ6ICR7ZS5vcmlnaW5944GvJHtlLm1pbmltdW0udG9TdHJpbmcoKX0ke2EudW5pdH0ke2l95b+F6KaB44GM44GC44KK44G+44GZYDpg5bCP44GV44GZ44GO44KL5YCkOiAke2Uub3JpZ2lufeOBryR7ZS5taW5pbXVtLnRvU3RyaW5nKCl9JHtpfeW/heimgeOBjOOBguOCiuOBvuOBmWB9Y2FzZSJpbnZhbGlkX2Zvcm1hdCI6e2NvbnN0IGk9ZTtyZXR1cm4gaS5mb3JtYXQ9PT0ic3RhcnRzX3dpdGgiP2DnhKHlirnjgarmloflrZfliJc6ICIke2kucHJlZml4fSLjgaflp4vjgb7jgovlv4XopoHjgYzjgYLjgorjgb7jgZlgOmkuZm9ybWF0PT09ImVuZHNfd2l0aCI/YOeEoeWKueOBquaWh+Wtl+WIlzogIiR7aS5zdWZmaXh9IuOBp+e1guOCj+OCi+W/heimgeOBjOOBguOCiuOBvuOBmWA6aS5mb3JtYXQ9PT0iaW5jbHVkZXMiP2DnhKHlirnjgarmloflrZfliJc6ICIke2kuaW5jbHVkZXN9IuOCkuWQq+OCgOW/heimgeOBjOOBguOCiuOBvuOBmWA6aS5mb3JtYXQ9PT0icmVnZXgiP2DnhKHlirnjgarmloflrZfliJc6IOODkeOCv+ODvOODsyR7aS5wYXR0ZXJufeOBq+S4gOiHtOOBmeOCi+W/heimgeOBjOOBguOCiuOBvuOBmWA6YOeEoeWKueOBqiR7cltpLmZvcm1hdF0/P2UuZm9ybWF0fWB9Y2FzZSJub3RfbXVsdGlwbGVfb2YiOnJldHVybmDnhKHlirnjgarmlbDlgKQ6ICR7ZS5kaXZpc29yfeOBruWAjeaVsOOBp+OBguOCi+W/heimgeOBjOOBguOCiuOBvuOBmWA7Y2FzZSJ1bnJlY29nbml6ZWRfa2V5cyI6cmV0dXJuYOiqjeitmOOBleOCjOOBpuOBhOOBquOBhOOCreODvCR7ZS5rZXlzLmxlbmd0aD4xPyLnvqQiOiIifTogJHtfKGUua2V5cywi44CBIil9YDtjYXNlImludmFsaWRfa2V5IjpyZXR1cm5gJHtlLm9yaWdpbn3lhoXjga7nhKHlirnjgarjgq3jg7xgO2Nhc2UiaW52YWxpZF91bmlvbiI6cmV0dXJuIueEoeWKueOBquWFpeWKmyI7Y2FzZSJpbnZhbGlkX2VsZW1lbnQiOnJldHVybmAke2Uub3JpZ2lufeWGheOBrueEoeWKueOBquWApGA7ZGVmYXVsdDpyZXR1cm4i54Sh5Yq544Gq5YWl5YqbIn19fTtmdW5jdGlvbiBPZigpe3JldHVybntsb2NhbGVFcnJvcjpqZigpfX1jb25zdCBVZj0oKT0+e2NvbnN0IHQ9e3N0cmluZzp7dW5pdDoi4YOh4YOY4YOb4YOR4YOd4YOa4YOdIix2ZXJiOiLhg6Phg5zhg5Phg5Ag4YOo4YOU4YOY4YOq4YOQ4YOV4YOT4YOU4YOhIn0sZmlsZTp7dW5pdDoi4YOR4YOQ4YOY4YOi4YOYIix2ZXJiOiLhg6Phg5zhg5Phg5Ag4YOo4YOU4YOY4YOq4YOQ4YOV4YOT4YOU4YOhIn0sYXJyYXk6e3VuaXQ6IuGDlOGDmuGDlOGDm+GDlOGDnOGDouGDmCIsdmVyYjoi4YOj4YOc4YOT4YOQIOGDqOGDlOGDmOGDquGDkOGDleGDk+GDlOGDoSJ9LHNldDp7dW5pdDoi4YOU4YOa4YOU4YOb4YOU4YOc4YOi4YOYIix2ZXJiOiLhg6Phg5zhg5Phg5Ag4YOo4YOU4YOY4YOq4YOQ4YOV4YOT4YOU4YOhIn19O2Z1bmN0aW9uIG4oZSl7cmV0dXJuIHRbZV0/P251bGx9Y29uc3Qgcj17cmVnZXg6IuGDqOGDlOGDp+GDleGDkOGDnOGDkCIsZW1haWw6IuGDlOGDmi3hg6Thg53hg6Hhg6Lhg5jhg6Eg4YOb4YOY4YOh4YOQ4YOb4YOQ4YOg4YOX4YOYIix1cmw6IlVSTCIsZW1vamk6IuGDlOGDm+GDneGDr+GDmCIsdXVpZDoiVVVJRCIsdXVpZHY0OiJVVUlEdjQiLHV1aWR2NjoiVVVJRHY2IixuYW5vaWQ6Im5hbm9pZCIsZ3VpZDoiR1VJRCIsY3VpZDoiY3VpZCIsY3VpZDI6ImN1aWQyIix1bGlkOiJVTElEIix4aWQ6IlhJRCIsa3N1aWQ6IktTVUlEIixkYXRldGltZToi4YOX4YOQ4YOg4YOY4YOm4YOYLeGDk+GDoOGDnSIsZGF0ZToi4YOX4YOQ4YOg4YOY4YOm4YOYIix0aW1lOiLhg5Phg6Dhg50iLGR1cmF0aW9uOiLhg67hg5Dhg5zhg5Lhg6Dhg6vhg5rhg5jhg5Xhg53hg5Hhg5AiLGlwdjQ6IklQdjQg4YOb4YOY4YOh4YOQ4YOb4YOQ4YOg4YOX4YOYIixpcHY2OiJJUHY2IOGDm+GDmOGDoeGDkOGDm+GDkOGDoOGDl+GDmCIsY2lkcnY0OiJJUHY0IOGDk+GDmOGDkOGDnuGDkOGDluGDneGDnOGDmCIsY2lkcnY2OiJJUHY2IOGDk+GDmOGDkOGDnuGDkOGDluGDneGDnOGDmCIsYmFzZTY0OiJiYXNlNjQt4YOZ4YOd4YOT4YOY4YOg4YOU4YOR4YOj4YOa4YOYIOGDleGDlOGDmuGDmCIsYmFzZTY0dXJsOiJiYXNlNjR1cmwt4YOZ4YOd4YOT4YOY4YOg4YOU4YOR4YOj4YOa4YOYIOGDleGDlOGDmuGDmCIsanNvbl9zdHJpbmc6IkpTT04g4YOV4YOU4YOa4YOYIixlMTY0OiJFLjE2NCDhg5zhg53hg5vhg5Thg6Dhg5giLGp3dDoiSldUIix0ZW1wbGF0ZV9saXRlcmFsOiLhg6jhg5Thg6fhg5Xhg5Dhg5zhg5AifSxvPXtuYW46Ik5hTiIsbnVtYmVyOiLhg6Dhg5jhg6rhg67hg5Xhg5giLHN0cmluZzoi4YOV4YOU4YOa4YOYIixib29sZWFuOiLhg5Hhg6Phg5rhg5Thg5Dhg5zhg5giLGZ1bmN0aW9uOiLhg6Thg6Phg5zhg6Xhg6rhg5jhg5AiLGFycmF5OiLhg5vhg5Dhg6Hhg5jhg5Xhg5gifTtyZXR1cm4gZT0+e3N3aXRjaChlLmNvZGUpe2Nhc2UiaW52YWxpZF90eXBlIjp7Y29uc3QgaT1vW2UuZXhwZWN0ZWRdPz9lLmV4cGVjdGVkLGE9dyhlLmlucHV0KSxzPW9bYV0/P2E7cmV0dXJuL15bQS1aXS8udGVzdChlLmV4cGVjdGVkKT9g4YOQ4YOg4YOQ4YOh4YOs4YOd4YOg4YOYIOGDqOGDlOGDp+GDleGDkOGDnOGDkDog4YOb4YOd4YOh4YOQ4YOa4YOd4YOT4YOc4YOU4YOa4YOYIGluc3RhbmNlb2YgJHtlLmV4cGVjdGVkfSwg4YOb4YOY4YOm4YOU4YOR4YOj4YOa4YOYICR7c31gOmDhg5Dhg6Dhg5Dhg6Hhg6zhg53hg6Dhg5gg4YOo4YOU4YOn4YOV4YOQ4YOc4YOQOiDhg5vhg53hg6Hhg5Dhg5rhg53hg5Phg5zhg5Thg5rhg5ggJHtpfSwg4YOb4YOY4YOm4YOU4YOR4YOj4YOa4YOYICR7c31gfWNhc2UiaW52YWxpZF92YWx1ZSI6cmV0dXJuIGUudmFsdWVzLmxlbmd0aD09PTE/YOGDkOGDoOGDkOGDoeGDrOGDneGDoOGDmCDhg6jhg5Thg6fhg5Xhg5Dhg5zhg5A6IOGDm+GDneGDoeGDkOGDmuGDneGDk+GDnOGDlOGDmuGDmCAke1MoZS52YWx1ZXNbMF0pfWA6YOGDkOGDoOGDkOGDoeGDrOGDneGDoOGDmCDhg5Xhg5Dhg6Dhg5jhg5Dhg5zhg6Lhg5g6IOGDm+GDneGDoeGDkOGDmuGDneGDk+GDnOGDlOGDmuGDmOGDkCDhg5Thg6Dhg5ct4YOU4YOg4YOX4YOYICR7XyhlLnZhbHVlcywifCIpfS3hg5Phg5Dhg5xgO2Nhc2UidG9vX2JpZyI6e2NvbnN0IGk9ZS5pbmNsdXNpdmU/Ijw9IjoiPCIsYT1uKGUub3JpZ2luKTtyZXR1cm4gYT9g4YOW4YOU4YOT4YOb4YOU4YOi4YOQ4YOTIOGDk+GDmOGDk+GDmDog4YOb4YOd4YOh4YOQ4YOa4YOd4YOT4YOc4YOU4YOa4YOYICR7ZS5vcmlnaW4/PyLhg5vhg5zhg5jhg6jhg5Xhg5zhg5Thg5rhg53hg5Hhg5AifSAke2EudmVyYn0gJHtpfSR7ZS5tYXhpbXVtLnRvU3RyaW5nKCl9ICR7YS51bml0fWA6YOGDluGDlOGDk+GDm+GDlOGDouGDkOGDkyDhg5Phg5jhg5Phg5g6IOGDm+GDneGDoeGDkOGDmuGDneGDk+GDnOGDlOGDmuGDmCAke2Uub3JpZ2luPz8i4YOb4YOc4YOY4YOo4YOV4YOc4YOU4YOa4YOd4YOR4YOQIn0g4YOY4YOn4YOd4YOhICR7aX0ke2UubWF4aW11bS50b1N0cmluZygpfWB9Y2FzZSJ0b29fc21hbGwiOntjb25zdCBpPWUuaW5jbHVzaXZlPyI+PSI6Ij4iLGE9bihlLm9yaWdpbik7cmV0dXJuIGE/YOGDluGDlOGDk+GDm+GDlOGDouGDkOGDkyDhg57hg5Dhg6Lhg5Dhg6Dhg5A6IOGDm+GDneGDoeGDkOGDmuGDneGDk+GDnOGDlOGDmuGDmCAke2Uub3JpZ2lufSAke2EudmVyYn0gJHtpfSR7ZS5taW5pbXVtLnRvU3RyaW5nKCl9ICR7YS51bml0fWA6YOGDluGDlOGDk+GDm+GDlOGDouGDkOGDkyDhg57hg5Dhg6Lhg5Dhg6Dhg5A6IOGDm+GDneGDoeGDkOGDmuGDneGDk+GDnOGDlOGDmuGDmCAke2Uub3JpZ2lufSDhg5jhg6fhg53hg6EgJHtpfSR7ZS5taW5pbXVtLnRvU3RyaW5nKCl9YH1jYXNlImludmFsaWRfZm9ybWF0Ijp7Y29uc3QgaT1lO3JldHVybiBpLmZvcm1hdD09PSJzdGFydHNfd2l0aCI/YOGDkOGDoOGDkOGDoeGDrOGDneGDoOGDmCDhg5Xhg5Thg5rhg5g6IOGDo+GDnOGDk+GDkCDhg5jhg6zhg6fhg5Thg5Hhg53hg5Phg5Thg6EgIiR7aS5wcmVmaXh9Ii3hg5jhg5dgOmkuZm9ybWF0PT09ImVuZHNfd2l0aCI/YOGDkOGDoOGDkOGDoeGDrOGDneGDoOGDmCDhg5Xhg5Thg5rhg5g6IOGDo+GDnOGDk+GDkCDhg5vhg5fhg5Dhg5Xhg6Dhg5Phg5Thg5Hhg53hg5Phg5Thg6EgIiR7aS5zdWZmaXh9Ii3hg5jhg5dgOmkuZm9ybWF0PT09ImluY2x1ZGVzIj9g4YOQ4YOg4YOQ4YOh4YOs4YOd4YOg4YOYIOGDleGDlOGDmuGDmDog4YOj4YOc4YOT4YOQIOGDqOGDlOGDmOGDquGDkOGDleGDk+GDlOGDoSAiJHtpLmluY2x1ZGVzfSIt4YOhYDppLmZvcm1hdD09PSJyZWdleCI/YOGDkOGDoOGDkOGDoeGDrOGDneGDoOGDmCDhg5Xhg5Thg5rhg5g6IOGDo+GDnOGDk+GDkCDhg6jhg5Thg5Thg6Hhg5Dhg5Hhg5Dhg5vhg5Thg5Hhg53hg5Phg5Thg6Eg4YOo4YOQ4YOR4YOa4YOd4YOc4YOhICR7aS5wYXR0ZXJufWA6YOGDkOGDoOGDkOGDoeGDrOGDneGDoOGDmCAke3JbaS5mb3JtYXRdPz9lLmZvcm1hdH1gfWNhc2Uibm90X211bHRpcGxlX29mIjpyZXR1cm5g4YOQ4YOg4YOQ4YOh4YOs4YOd4YOg4YOYIOGDoOGDmOGDquGDruGDleGDmDog4YOj4YOc4YOT4YOQIOGDmOGDp+GDneGDoSAke2UuZGl2aXNvcn0t4YOY4YOhIOGDr+GDlOGDoOGDkOGDk+GDmGA7Y2FzZSJ1bnJlY29nbml6ZWRfa2V5cyI6cmV0dXJuYOGDo+GDquGDnOGDneGDkeGDmCDhg5Lhg5Dhg6Hhg5Dhg6bhg5Thg5Eke2Uua2V5cy5sZW5ndGg+MT8i4YOU4YOR4YOYIjoi4YOYIn06ICR7XyhlLmtleXMsIiwgIil9YDtjYXNlImludmFsaWRfa2V5IjpyZXR1cm5g4YOQ4YOg4YOQ4YOh4YOs4YOd4YOg4YOYIOGDkuGDkOGDoeGDkOGDpuGDlOGDkeGDmCAke2Uub3JpZ2lufS3hg6jhg5hgO2Nhc2UiaW52YWxpZF91bmlvbiI6cmV0dXJuIuGDkOGDoOGDkOGDoeGDrOGDneGDoOGDmCDhg6jhg5Thg6fhg5Xhg5Dhg5zhg5AiO2Nhc2UiaW52YWxpZF9lbGVtZW50IjpyZXR1cm5g4YOQ4YOg4YOQ4YOh4YOs4YOd4YOg4YOYIOGDm+GDnOGDmOGDqOGDleGDnOGDlOGDmuGDneGDkeGDkCAke2Uub3JpZ2lufS3hg6jhg5hgO2RlZmF1bHQ6cmV0dXJuIuGDkOGDoOGDkOGDoeGDrOGDneGDoOGDmCDhg6jhg5Thg6fhg5Xhg5Dhg5zhg5AifX19O2Z1bmN0aW9uIFBmKCl7cmV0dXJue2xvY2FsZUVycm9yOlVmKCl9fWNvbnN0IE5mPSgpPT57Y29uc3QgdD17c3RyaW5nOnt1bml0OiLhno/hnr3hnqLhnoDhn5Lhnp/hnpoiLHZlcmI6IuGeguGeveGemuGemOGetuGekyJ9LGZpbGU6e3VuaXQ6IuGelOGfgyIsdmVyYjoi4Z6C4Z694Z6a4Z6Y4Z624Z6TIn0sYXJyYXk6e3VuaXQ6IuGekuGetuGej+GeuyIsdmVyYjoi4Z6C4Z694Z6a4Z6Y4Z624Z6TIn0sc2V0Ont1bml0OiLhnpLhnrbhno/hnrsiLHZlcmI6IuGeguGeveGemuGemOGetuGekyJ9fTtmdW5jdGlvbiBuKGUpe3JldHVybiB0W2VdPz9udWxsfWNvbnN0IHI9e3JlZ2V4OiLhnpHhnrfhnpPhn5LhnpPhnpPhn5DhnpnhnpThnonhn5LhnoXhnrzhnpsiLGVtYWlsOiLhnqLhnrbhnp/hnpnhnorhn5LhnovhnrbhnpPhnqLhn4rhnrjhnpjhn4LhnpsiLHVybDoiVVJMIixlbW9qaToi4Z6f4Z6J4Z+S4Z6J4Z624Z6i4Z624Z6a4Z6Y4Z+S4Z6Y4Z6O4Z+NIix1dWlkOiJVVUlEIix1dWlkdjQ6IlVVSUR2NCIsdXVpZHY2OiJVVUlEdjYiLG5hbm9pZDoibmFub2lkIixndWlkOiJHVUlEIixjdWlkOiJjdWlkIixjdWlkMjoiY3VpZDIiLHVsaWQ6IlVMSUQiLHhpZDoiWElEIixrc3VpZDoiS1NVSUQiLGRhdGV0aW1lOiLhnoDhnrbhnpvhnpThnprhnrfhnoXhn5Lhnobhn4HhnpEg4Z6T4Z634Z6E4Z6Y4Z+J4Z+E4Z6EIElTTyIsZGF0ZToi4Z6A4Z624Z6b4Z6U4Z6a4Z634Z6F4Z+S4Z6G4Z+B4Z6RIElTTyIsdGltZToi4Z6Y4Z+J4Z+E4Z6EIElTTyIsZHVyYXRpb246IuGemuGemeGfiOGeluGfgeGemyBJU08iLGlwdjQ6IuGeouGetuGen+GemeGeiuGfkuGei+GetuGekyBJUHY0IixpcHY2OiLhnqLhnrbhnp/hnpnhnorhn5LhnovhnrbhnpMgSVB2NiIsY2lkcnY0OiLhnorhn4LhnpPhnqLhnrbhnp/hnpnhnorhn5LhnovhnrbhnpMgSVB2NCIsY2lkcnY2OiLhnorhn4LhnpPhnqLhnrbhnp/hnpnhnorhn5LhnovhnrbhnpMgSVB2NiIsYmFzZTY0OiLhnoHhn5Lhnp/hn4LhnqLhnoDhn5Lhnp/hnprhnqLhn4rhnrfhnoDhnrzhnoogYmFzZTY0IixiYXNlNjR1cmw6IuGegeGfkuGen+GfguGeouGegOGfkuGen+GemuGeouGfiuGet+GegOGevOGeiiBiYXNlNjR1cmwiLGpzb25fc3RyaW5nOiLhnoHhn5Lhnp/hn4LhnqLhnoDhn5Lhnp/hnpogSlNPTiIsZTE2NDoi4Z6b4Z+B4Z6BIEUuMTY0Iixqd3Q6IkpXVCIsdGVtcGxhdGVfbGl0ZXJhbDoi4Z6R4Z634Z6T4Z+S4Z6T4Z6T4Z+Q4Z6Z4Z6U4Z6J4Z+S4Z6F4Z684Z6bIn0sbz17bmFuOiJOYU4iLG51bWJlcjoi4Z6b4Z+B4Z6BIixhcnJheToi4Z6i4Z624Z6a4Z+BIChBcnJheSkiLG51bGw6IuGeguGfkuGemOGetuGek+Gej+GemOGfkuGem+GfgyAobnVsbCkifTtyZXR1cm4gZT0+e3N3aXRjaChlLmNvZGUpe2Nhc2UiaW52YWxpZF90eXBlIjp7Y29uc3QgaT1vW2UuZXhwZWN0ZWRdPz9lLmV4cGVjdGVkLGE9dyhlLmlucHV0KSxzPW9bYV0/P2E7cmV0dXJuL15bQS1aXS8udGVzdChlLmV4cGVjdGVkKT9g4Z6R4Z634Z6T4Z+S4Z6T4Z6T4Z+Q4Z6Z4Z6U4Z6J4Z+S4Z6F4Z684Z6b4Z6Y4Z634Z6T4Z6P4Z+S4Z6a4Z654Z6Y4Z6P4Z+S4Z6a4Z684Z6c4Z+WIOGej+GfkuGemuGevOGenOGegOGetuGemiBpbnN0YW5jZW9mICR7ZS5leHBlY3RlZH0g4Z6U4Z+J4Z674Z6T4Z+S4Z6P4Z+C4Z6R4Z6R4Z694Z6b4Z6U4Z624Z6TICR7c31gOmDhnpHhnrfhnpPhn5LhnpPhnpPhn5DhnpnhnpThnonhn5LhnoXhnrzhnpvhnpjhnrfhnpPhno/hn5Lhnprhnrnhnpjhno/hn5Lhnprhnrzhnpzhn5Yg4Z6P4Z+S4Z6a4Z684Z6c4Z6A4Z624Z6aICR7aX0g4Z6U4Z+J4Z674Z6T4Z+S4Z6P4Z+C4Z6R4Z6R4Z694Z6b4Z6U4Z624Z6TICR7c31gfWNhc2UiaW52YWxpZF92YWx1ZSI6cmV0dXJuIGUudmFsdWVzLmxlbmd0aD09PTE/YOGekeGet+Gek+GfkuGek+Gek+GfkOGemeGelOGeieGfkuGeheGevOGem+GemOGet+Gek+Gej+GfkuGemuGeueGemOGej+GfkuGemuGevOGenOGfliDhno/hn5LhnprhnrzhnpzhnoDhnrbhnpogJHtTKGUudmFsdWVzWzBdKX1gOmDhnofhnpjhn5Lhnprhnr7hnp/hnpjhnrfhnpPhno/hn5Lhnprhnrnhnpjhno/hn5Lhnprhnrzhnpzhn5Yg4Z6P4Z+S4Z6a4Z684Z6c4Z6H4Z624Z6Y4Z694Z6Z4Z6A4Z+S4Z6T4Z674Z6E4Z6F4Z+G4Z6O4Z+E4Z6YICR7XyhlLnZhbHVlcywifCIpfWA7Y2FzZSJ0b29fYmlnIjp7Y29uc3QgaT1lLmluY2x1c2l2ZT8iPD0iOiI8IixhPW4oZS5vcmlnaW4pO3JldHVybiBhP2DhnpLhn4bhnpbhn4HhnoDhn5Yg4Z6P4Z+S4Z6a4Z684Z6c4Z6A4Z624Z6aICR7ZS5vcmlnaW4/PyLhno/hnpjhn5Lhnpvhn4MifSAke2l9ICR7ZS5tYXhpbXVtLnRvU3RyaW5nKCl9ICR7YS51bml0Pz8i4Z6S4Z624Z6P4Z67In1gOmDhnpLhn4bhnpbhn4HhnoDhn5Yg4Z6P4Z+S4Z6a4Z684Z6c4Z6A4Z624Z6aICR7ZS5vcmlnaW4/PyLhno/hnpjhn5Lhnpvhn4MifSAke2l9ICR7ZS5tYXhpbXVtLnRvU3RyaW5nKCl9YH1jYXNlInRvb19zbWFsbCI6e2NvbnN0IGk9ZS5pbmNsdXNpdmU/Ij49IjoiPiIsYT1uKGUub3JpZ2luKTtyZXR1cm4gYT9g4Z6P4Z684Z6F4Z6W4Z+B4Z6A4Z+WIOGej+GfkuGemuGevOGenOGegOGetuGemiAke2Uub3JpZ2lufSAke2l9ICR7ZS5taW5pbXVtLnRvU3RyaW5nKCl9ICR7YS51bml0fWA6YOGej+GevOGeheGeluGfgeGegOGfliDhno/hn5LhnprhnrzhnpzhnoDhnrbhnpogJHtlLm9yaWdpbn0gJHtpfSAke2UubWluaW11bS50b1N0cmluZygpfWB9Y2FzZSJpbnZhbGlkX2Zvcm1hdCI6e2NvbnN0IGk9ZTtyZXR1cm4gaS5mb3JtYXQ9PT0ic3RhcnRzX3dpdGgiP2DhnoHhn5Lhnp/hn4LhnqLhnoDhn5Lhnp/hnprhnpjhnrfhnpPhno/hn5Lhnprhnrnhnpjhno/hn5Lhnprhnrzhnpzhn5Yg4Z6P4Z+S4Z6a4Z684Z6c4Z6F4Z624Z6U4Z+L4Z6V4Z+S4Z6P4Z6+4Z6Y4Z6K4Z+E4Z6ZICIke2kucHJlZml4fSJgOmkuZm9ybWF0PT09ImVuZHNfd2l0aCI/YOGegeGfkuGen+GfguGeouGegOGfkuGen+GemuGemOGet+Gek+Gej+GfkuGemuGeueGemOGej+GfkuGemuGevOGenOGfliDhno/hn5LhnprhnrzhnpzhnpThnonhn5LhnoXhnpThn4vhnorhn4ThnpkgIiR7aS5zdWZmaXh9ImA6aS5mb3JtYXQ9PT0iaW5jbHVkZXMiP2DhnoHhn5Lhnp/hn4LhnqLhnoDhn5Lhnp/hnprhnpjhnrfhnpPhno/hn5Lhnprhnrnhnpjhno/hn5Lhnprhnrzhnpzhn5Yg4Z6P4Z+S4Z6a4Z684Z6c4Z6Y4Z624Z6TICIke2kuaW5jbHVkZXN9ImA6aS5mb3JtYXQ9PT0icmVnZXgiP2DhnoHhn5Lhnp/hn4LhnqLhnoDhn5Lhnp/hnprhnpjhnrfhnpPhno/hn5Lhnprhnrnhnpjhno/hn5Lhnprhnrzhnpzhn5Yg4Z6P4Z+S4Z6a4Z684Z6c4Z6P4Z+C4Z6V4Z+S4Z6C4Z684Z6V4Z+S4Z6C4Z6E4Z6T4Z654Z6E4Z6R4Z6Y4Z+S4Z6a4Z6E4Z+L4Z6K4Z+C4Z6b4Z6U4Z624Z6T4Z6A4Z+G4Z6O4Z6P4Z+LICR7aS5wYXR0ZXJufWA6YOGemOGet+Gek+Gej+GfkuGemuGeueGemOGej+GfkuGemuGevOGenOGfliAke3JbaS5mb3JtYXRdPz9lLmZvcm1hdH1gfWNhc2Uibm90X211bHRpcGxlX29mIjpyZXR1cm5g4Z6b4Z+B4Z6B4Z6Y4Z634Z6T4Z6P4Z+S4Z6a4Z654Z6Y4Z6P4Z+S4Z6a4Z684Z6c4Z+WIOGej+GfkuGemuGevOGenOGej+GfguGeh+GetuGeluGeoOGeu+GeguGeu+GejuGek+GfgyAke2UuZGl2aXNvcn1gO2Nhc2UidW5yZWNvZ25pemVkX2tleXMiOnJldHVybmDhnprhnoDhnoPhnr7hnonhnp/hn4ThnpjhnrfhnpPhnp/hn5LhnoLhnrbhnpvhn4vhn5YgJHtfKGUua2V5cywiLCAiKX1gO2Nhc2UiaW52YWxpZF9rZXkiOnJldHVybmDhnp/hn4ThnpjhnrfhnpPhno/hn5Lhnprhnrnhnpjhno/hn5LhnprhnrzhnpzhnpPhn4XhnoDhn5LhnpPhnrvhnoQgJHtlLm9yaWdpbn1gO2Nhc2UiaW52YWxpZF91bmlvbiI6cmV0dXJuIuGekeGet+Gek+GfkuGek+Gek+GfkOGemeGemOGet+Gek+Gej+GfkuGemuGeueGemOGej+GfkuGemuGevOGenCI7Y2FzZSJpbnZhbGlkX2VsZW1lbnQiOnJldHVybmDhnpHhnrfhnpPhn5LhnpPhnpPhn5DhnpnhnpjhnrfhnpPhno/hn5Lhnprhnrnhnpjhno/hn5LhnprhnrzhnpzhnpPhn4XhnoDhn5LhnpPhnrvhnoQgJHtlLm9yaWdpbn1gO2RlZmF1bHQ6cmV0dXJuIuGekeGet+Gek+GfkuGek+Gek+GfkOGemeGemOGet+Gek+Gej+GfkuGemuGeueGemOGej+GfkuGemuGevOGenCJ9fX07ZnVuY3Rpb24gemwoKXtyZXR1cm57bG9jYWxlRXJyb3I6TmYoKX19ZnVuY3Rpb24gRGYoKXtyZXR1cm4gemwoKX1jb25zdCBFZj0oKT0+e2NvbnN0IHQ9e3N0cmluZzp7dW5pdDoi66y47J6QIix2ZXJiOiJ0byBoYXZlIn0sZmlsZTp7dW5pdDoi67CU7J207Yq4Iix2ZXJiOiJ0byBoYXZlIn0sYXJyYXk6e3VuaXQ6IuqwnCIsdmVyYjoidG8gaGF2ZSJ9LHNldDp7dW5pdDoi6rCcIix2ZXJiOiJ0byBoYXZlIn19O2Z1bmN0aW9uIG4oZSl7cmV0dXJuIHRbZV0/P251bGx9Y29uc3Qgcj17cmVnZXg6IuyeheugpSIsZW1haWw6IuydtOuplOydvCDso7zshowiLHVybDoiVVJMIixlbW9qaToi7J2066qo7KeAIix1dWlkOiJVVUlEIix1dWlkdjQ6IlVVSUR2NCIsdXVpZHY2OiJVVUlEdjYiLG5hbm9pZDoibmFub2lkIixndWlkOiJHVUlEIixjdWlkOiJjdWlkIixjdWlkMjoiY3VpZDIiLHVsaWQ6IlVMSUQiLHhpZDoiWElEIixrc3VpZDoiS1NVSUQiLGRhdGV0aW1lOiJJU08g64Kg7Kec7Iuc6rCEIixkYXRlOiJJU08g64Kg7KecIix0aW1lOiJJU08g7Iuc6rCEIixkdXJhdGlvbjoiSVNPIOq4sOqwhCIsaXB2NDoiSVB2NCDso7zshowiLGlwdjY6IklQdjYg7KO87IaMIixjaWRydjQ6IklQdjQg67KU7JyEIixjaWRydjY6IklQdjYg67KU7JyEIixiYXNlNjQ6ImJhc2U2NCDsnbjsvZTrlKkg66y47J6Q7Je0IixiYXNlNjR1cmw6ImJhc2U2NHVybCDsnbjsvZTrlKkg66y47J6Q7Je0Iixqc29uX3N0cmluZzoiSlNPTiDrrLjsnpDsl7QiLGUxNjQ6IkUuMTY0IOuyiO2YuCIsand0OiJKV1QiLHRlbXBsYXRlX2xpdGVyYWw6IuyeheugpSJ9LG89e25hbjoiTmFOIn07cmV0dXJuIGU9Pntzd2l0Y2goZS5jb2RlKXtjYXNlImludmFsaWRfdHlwZSI6e2NvbnN0IGk9b1tlLmV4cGVjdGVkXT8/ZS5leHBlY3RlZCxhPXcoZS5pbnB1dCkscz1vW2FdPz9hO3JldHVybi9eW0EtWl0vLnRlc3QoZS5leHBlY3RlZCk/YOyemOuqu+uQnCDsnoXroKU6IOyYiOyDgSDtg4DsnoXsnYAgaW5zdGFuY2VvZiAke2UuZXhwZWN0ZWR9LCDrsJvsnYAg7YOA7J6F7J2AICR7c33snoXri4jri6RgOmDsnpjrqrvrkJwg7J6F66ClOiDsmIjsg4Eg7YOA7J6F7J2AICR7aX0sIOuwm+ydgCDtg4DsnoXsnYAgJHtzfeyeheuLiOuLpGB9Y2FzZSJpbnZhbGlkX3ZhbHVlIjpyZXR1cm4gZS52YWx1ZXMubGVuZ3RoPT09MT9g7J6Y66q765CcIOyeheugpTog6rCS7J2AICR7UyhlLnZhbHVlc1swXSl9IOydtOyWtOyVvCDtlanri4jri6RgOmDsnpjrqrvrkJwg7Ji17IWYOiAke18oZS52YWx1ZXMsIuuYkOuKlCAiKX0g7KSRIO2VmOuCmOyXrOyVvCDtlanri4jri6RgO2Nhc2UidG9vX2JpZyI6e2NvbnN0IGk9ZS5pbmNsdXNpdmU/IuydtO2VmCI6IuuvuOunjCIsYT1pPT09IuuvuOunjCI/IuydtOyWtOyVvCDtlanri4jri6QiOiLsl6zslbwg7ZWp64uI64ukIixzPW4oZS5vcmlnaW4pLGM9cz8udW5pdD8/IuyalOyGjCI7cmV0dXJuIHM/YCR7ZS5vcmlnaW4/PyLqsJIifeydtCDrhIjrrLQg7YG964uI64ukOiAke2UubWF4aW11bS50b1N0cmluZygpfSR7Y30gJHtpfSR7YX1gOmAke2Uub3JpZ2luPz8i6rCSIn3snbQg64SI66y0IO2BveuLiOuLpDogJHtlLm1heGltdW0udG9TdHJpbmcoKX0gJHtpfSR7YX1gfWNhc2UidG9vX3NtYWxsIjp7Y29uc3QgaT1lLmluY2x1c2l2ZT8i7J207IOBIjoi7LSI6rO8IixhPWk9PT0i7J207IOBIj8i7J207Ja07JW8IO2VqeuLiOuLpCI6IuyXrOyVvCDtlanri4jri6QiLHM9bihlLm9yaWdpbiksYz1zPy51bml0Pz8i7JqU7IaMIjtyZXR1cm4gcz9gJHtlLm9yaWdpbj8/IuqwkiJ97J20IOuEiOustCDsnpHsirXri4jri6Q6ICR7ZS5taW5pbXVtLnRvU3RyaW5nKCl9JHtjfSAke2l9JHthfWA6YCR7ZS5vcmlnaW4/PyLqsJIifeydtCDrhIjrrLQg7J6R7Iq164uI64ukOiAke2UubWluaW11bS50b1N0cmluZygpfSAke2l9JHthfWB9Y2FzZSJpbnZhbGlkX2Zvcm1hdCI6e2NvbnN0IGk9ZTtyZXR1cm4gaS5mb3JtYXQ9PT0ic3RhcnRzX3dpdGgiP2DsnpjrqrvrkJwg66y47J6Q7Je0OiAiJHtpLnByZWZpeH0iKOycvCnroZwg7Iuc7J6R7ZW07JW8IO2VqeuLiOuLpGA6aS5mb3JtYXQ9PT0iZW5kc193aXRoIj9g7J6Y66q765CcIOusuOyekOyXtDogIiR7aS5zdWZmaXh9IijsnLwp66GcIOuBneuCmOyVvCDtlanri4jri6RgOmkuZm9ybWF0PT09ImluY2x1ZGVzIj9g7J6Y66q765CcIOusuOyekOyXtDogIiR7aS5pbmNsdWRlc30i7J2EKOulvCkg7Y+s7ZWo7ZW07JW8IO2VqeuLiOuLpGA6aS5mb3JtYXQ9PT0icmVnZXgiP2DsnpjrqrvrkJwg66y47J6Q7Je0OiDsoJXqt5zsi50gJHtpLnBhdHRlcm59IO2MqO2EtOqzvCDsnbzsuZjtlbTslbwg7ZWp64uI64ukYDpg7J6Y66q765CcICR7cltpLmZvcm1hdF0/P2UuZm9ybWF0fWB9Y2FzZSJub3RfbXVsdGlwbGVfb2YiOnJldHVybmDsnpjrqrvrkJwg7Iir7J6QOiAke2UuZGl2aXNvcn3snZgg67Cw7IiY7Jes7JW8IO2VqeuLiOuLpGA7Y2FzZSJ1bnJlY29nbml6ZWRfa2V5cyI6cmV0dXJuYOyduOyLne2VoCDsiJgg7JeG64qUIO2CpDogJHtfKGUua2V5cywiLCAiKX1gO2Nhc2UiaW52YWxpZF9rZXkiOnJldHVybmDsnpjrqrvrkJwg7YKkOiAke2Uub3JpZ2lufWA7Y2FzZSJpbnZhbGlkX3VuaW9uIjpyZXR1cm4i7J6Y66q765CcIOyeheugpSI7Y2FzZSJpbnZhbGlkX2VsZW1lbnQiOnJldHVybmDsnpjrqrvrkJwg6rCSOiAke2Uub3JpZ2lufWA7ZGVmYXVsdDpyZXR1cm4i7J6Y66q765CcIOyeheugpSJ9fX07ZnVuY3Rpb24gWmYoKXtyZXR1cm57bG9jYWxlRXJyb3I6RWYoKX19Y29uc3QgdnQ9dD0+dC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSt0LnNsaWNlKDEpO2Z1bmN0aW9uIFBzKHQpe2NvbnN0IG49TWF0aC5hYnModCkscj1uJTEwLG89biUxMDA7cmV0dXJuIG8+PTExJiZvPD0xOXx8cj09PTA/Im1hbnkiOnI9PT0xPyJvbmUiOiJmZXcifWNvbnN0IFJmPSgpPT57Y29uc3QgdD17c3RyaW5nOnt1bml0OntvbmU6InNpbWJvbGlzIixmZXc6InNpbWJvbGlhaSIsbWFueToic2ltYm9sacWzIn0sdmVyYjp7c21hbGxlcjp7aW5jbHVzaXZlOiJ0dXJpIGLFq3RpIG5lIGlsZ2VzbsSXIGthaXAiLG5vdEluY2x1c2l2ZToidHVyaSBixat0aSB0cnVtcGVzbsSXIGthaXAifSxiaWdnZXI6e2luY2x1c2l2ZToidHVyaSBixat0aSBuZSB0cnVtcGVzbsSXIGthaXAiLG5vdEluY2x1c2l2ZToidHVyaSBixat0aSBpbGdlc27ElyBrYWlwIn19fSxmaWxlOnt1bml0OntvbmU6ImJhaXRhcyIsZmV3OiJiYWl0YWkiLG1hbnk6ImJhaXTFsyJ9LHZlcmI6e3NtYWxsZXI6e2luY2x1c2l2ZToidHVyaSBixat0aSBuZSBkaWRlc25pcyBrYWlwIixub3RJbmNsdXNpdmU6InR1cmkgYsWrdGkgbWHFvmVzbmlzIGthaXAifSxiaWdnZXI6e2luY2x1c2l2ZToidHVyaSBixat0aSBuZSBtYcW+ZXNuaXMga2FpcCIsbm90SW5jbHVzaXZlOiJ0dXJpIGLFq3RpIGRpZGVzbmlzIGthaXAifX19LGFycmF5Ont1bml0OntvbmU6ImVsZW1lbnTEhSIsZmV3OiJlbGVtZW50dXMiLG1hbnk6ImVsZW1lbnTFsyJ9LHZlcmI6e3NtYWxsZXI6e2luY2x1c2l2ZToidHVyaSB0dXLEl3RpIG5lIGRhdWdpYXUga2FpcCIsbm90SW5jbHVzaXZlOiJ0dXJpIHR1csSXdGkgbWHFvmlhdSBrYWlwIn0sYmlnZ2VyOntpbmNsdXNpdmU6InR1cmkgdHVyxJd0aSBuZSBtYcW+aWF1IGthaXAiLG5vdEluY2x1c2l2ZToidHVyaSB0dXLEl3RpIGRhdWdpYXUga2FpcCJ9fX0sc2V0Ont1bml0OntvbmU6ImVsZW1lbnTEhSIsZmV3OiJlbGVtZW50dXMiLG1hbnk6ImVsZW1lbnTFsyJ9LHZlcmI6e3NtYWxsZXI6e2luY2x1c2l2ZToidHVyaSB0dXLEl3RpIG5lIGRhdWdpYXUga2FpcCIsbm90SW5jbHVzaXZlOiJ0dXJpIHR1csSXdGkgbWHFvmlhdSBrYWlwIn0sYmlnZ2VyOntpbmNsdXNpdmU6InR1cmkgdHVyxJd0aSBuZSBtYcW+aWF1IGthaXAiLG5vdEluY2x1c2l2ZToidHVyaSB0dXLEl3RpIGRhdWdpYXUga2FpcCJ9fX19O2Z1bmN0aW9uIG4oZSxpLGEscyl7Y29uc3QgYz10W2VdPz9udWxsO3JldHVybiBjPT09bnVsbD9jOnt1bml0OmMudW5pdFtpXSx2ZXJiOmMudmVyYltzXVthPyJpbmNsdXNpdmUiOiJub3RJbmNsdXNpdmUiXX19Y29uc3Qgcj17cmVnZXg6IsSvdmVzdGlzIixlbWFpbDoiZWwuIHBhxaF0byBhZHJlc2FzIix1cmw6IlVSTCIsZW1vamk6ImphdXN0dWthcyIsdXVpZDoiVVVJRCIsdXVpZHY0OiJVVUlEdjQiLHV1aWR2NjoiVVVJRHY2IixuYW5vaWQ6Im5hbm9pZCIsZ3VpZDoiR1VJRCIsY3VpZDoiY3VpZCIsY3VpZDI6ImN1aWQyIix1bGlkOiJVTElEIix4aWQ6IlhJRCIsa3N1aWQ6IktTVUlEIixkYXRldGltZToiSVNPIGRhdGEgaXIgbGFpa2FzIixkYXRlOiJJU08gZGF0YSIsdGltZToiSVNPIGxhaWthcyIsZHVyYXRpb246IklTTyB0cnVrbcSXIixpcHY0OiJJUHY0IGFkcmVzYXMiLGlwdjY6IklQdjYgYWRyZXNhcyIsY2lkcnY0OiJJUHY0IHRpbmtsbyBwcmVmaWtzYXMgKENJRFIpIixjaWRydjY6IklQdjYgdGlua2xvIHByZWZpa3NhcyAoQ0lEUikiLGJhc2U2NDoiYmFzZTY0IHXFvmtvZHVvdGEgZWlsdXTElyIsYmFzZTY0dXJsOiJiYXNlNjR1cmwgdcW+a29kdW90YSBlaWx1dMSXIixqc29uX3N0cmluZzoiSlNPTiBlaWx1dMSXIixlMTY0OiJFLjE2NCBudW1lcmlzIixqd3Q6IkpXVCIsdGVtcGxhdGVfbGl0ZXJhbDoixK92ZXN0aXMifSxvPXtuYW46Ik5hTiIsbnVtYmVyOiJza2FpxI1pdXMiLGJpZ2ludDoic3ZlaWthc2lzIHNrYWnEjWl1cyIsc3RyaW5nOiJlaWx1dMSXIixib29sZWFuOiJsb2dpbsSXIHJlaWvFoW3ElyIsdW5kZWZpbmVkOiJuZWFwaWJyxJfFvnRhIHJlaWvFoW3ElyIsZnVuY3Rpb246ImZ1bmtjaWphIixzeW1ib2w6InNpbWJvbGlzIixhcnJheToibWFzeXZhcyIsb2JqZWN0OiJvYmpla3RhcyIsbnVsbDoibnVsaW7ElyByZWlrxaFtxJcifTtyZXR1cm4gZT0+e3N3aXRjaChlLmNvZGUpe2Nhc2UiaW52YWxpZF90eXBlIjp7Y29uc3QgaT1vW2UuZXhwZWN0ZWRdPz9lLmV4cGVjdGVkLGE9dyhlLmlucHV0KSxzPW9bYV0/P2E7cmV0dXJuL15bQS1aXS8udGVzdChlLmV4cGVjdGVkKT9gR2F1dGFzIHRpcGFzICR7c30sIG8gdGlrxJd0YXNpIC0gaW5zdGFuY2VvZiAke2UuZXhwZWN0ZWR9YDpgR2F1dGFzIHRpcGFzICR7c30sIG8gdGlrxJd0YXNpIC0gJHtpfWB9Y2FzZSJpbnZhbGlkX3ZhbHVlIjpyZXR1cm4gZS52YWx1ZXMubGVuZ3RoPT09MT9gUHJpdmFsbyBixat0aSAke1MoZS52YWx1ZXNbMF0pfWA6YFByaXZhbG8gYsWrdGkgdmllbmFzIGnFoSAke18oZS52YWx1ZXMsInwiKX0gcGFzaXJpbmtpbcWzYDtjYXNlInRvb19iaWciOntjb25zdCBpPW9bZS5vcmlnaW5dPz9lLm9yaWdpbixhPW4oZS5vcmlnaW4sUHMoTnVtYmVyKGUubWF4aW11bSkpLGUuaW5jbHVzaXZlPz8hMSwic21hbGxlciIpO2lmKGE/LnZlcmIpcmV0dXJuYCR7dnQoaT8/ZS5vcmlnaW4/PyJyZWlrxaFtxJciKX0gJHthLnZlcmJ9ICR7ZS5tYXhpbXVtLnRvU3RyaW5nKCl9ICR7YS51bml0Pz8iZWxlbWVudMWzIn1gO2NvbnN0IHM9ZS5pbmNsdXNpdmU/Im5lIGRpZGVzbmlzIGthaXAiOiJtYcW+ZXNuaXMga2FpcCI7cmV0dXJuYCR7dnQoaT8/ZS5vcmlnaW4/PyJyZWlrxaFtxJciKX0gdHVyaSBixat0aSAke3N9ICR7ZS5tYXhpbXVtLnRvU3RyaW5nKCl9ICR7YT8udW5pdH1gfWNhc2UidG9vX3NtYWxsIjp7Y29uc3QgaT1vW2Uub3JpZ2luXT8/ZS5vcmlnaW4sYT1uKGUub3JpZ2luLFBzKE51bWJlcihlLm1pbmltdW0pKSxlLmluY2x1c2l2ZT8/ITEsImJpZ2dlciIpO2lmKGE/LnZlcmIpcmV0dXJuYCR7dnQoaT8/ZS5vcmlnaW4/PyJyZWlrxaFtxJciKX0gJHthLnZlcmJ9ICR7ZS5taW5pbXVtLnRvU3RyaW5nKCl9ICR7YS51bml0Pz8iZWxlbWVudMWzIn1gO2NvbnN0IHM9ZS5pbmNsdXNpdmU/Im5lIG1hxb5lc25pcyBrYWlwIjoiZGlkZXNuaXMga2FpcCI7cmV0dXJuYCR7dnQoaT8/ZS5vcmlnaW4/PyJyZWlrxaFtxJciKX0gdHVyaSBixat0aSAke3N9ICR7ZS5taW5pbXVtLnRvU3RyaW5nKCl9ICR7YT8udW5pdH1gfWNhc2UiaW52YWxpZF9mb3JtYXQiOntjb25zdCBpPWU7cmV0dXJuIGkuZm9ybWF0PT09InN0YXJ0c193aXRoIj9gRWlsdXTElyBwcml2YWxvIHByYXNpZMSXdGkgIiR7aS5wcmVmaXh9ImA6aS5mb3JtYXQ9PT0iZW5kc193aXRoIj9gRWlsdXTElyBwcml2YWxvIHBhc2liYWlndGkgIiR7aS5zdWZmaXh9ImA6aS5mb3JtYXQ9PT0iaW5jbHVkZXMiP2BFaWx1dMSXIHByaXZhbG8gxK90cmF1a3RpICIke2kuaW5jbHVkZXN9ImA6aS5mb3JtYXQ9PT0icmVnZXgiP2BFaWx1dMSXIHByaXZhbG8gYXRpdGlrdGkgJHtpLnBhdHRlcm59YDpgTmV0ZWlzaW5nYXMgJHtyW2kuZm9ybWF0XT8/ZS5mb3JtYXR9YH1jYXNlIm5vdF9tdWx0aXBsZV9vZiI6cmV0dXJuYFNrYWnEjWl1cyBwcml2YWxvIGLFq3RpICR7ZS5kaXZpc29yfSBrYXJ0b3RpbmlzLmA7Y2FzZSJ1bnJlY29nbml6ZWRfa2V5cyI6cmV0dXJuYE5lYXRwYcW+aW50JHtlLmtleXMubGVuZ3RoPjE/ImkiOiJhcyJ9IHJha3Qke2Uua2V5cy5sZW5ndGg+MT8iYWkiOiJhcyJ9OiAke18oZS5rZXlzLCIsICIpfWA7Y2FzZSJpbnZhbGlkX2tleSI6cmV0dXJuIlJhc3RhcyBrbGFpZGluZ2FzIHJha3RhcyI7Y2FzZSJpbnZhbGlkX3VuaW9uIjpyZXR1cm4iS2xhaWRpbmdhIMSvdmVzdGlzIjtjYXNlImludmFsaWRfZWxlbWVudCI6e2NvbnN0IGk9b1tlLm9yaWdpbl0/P2Uub3JpZ2luO3JldHVybmAke3Z0KGk/P2Uub3JpZ2luPz8icmVpa8WhbcSXIil9IHR1cmkga2xhaWRpbmfEhSDEr3Zlc3TEr2B9ZGVmYXVsdDpyZXR1cm4iS2xhaWRpbmdhIMSvdmVzdGlzIn19fTtmdW5jdGlvbiBDZigpe3JldHVybntsb2NhbGVFcnJvcjpSZigpfX1jb25zdCBBZj0oKT0+e2NvbnN0IHQ9e3N0cmluZzp7dW5pdDoi0LfQvdCw0YbQuCIsdmVyYjoi0LTQsCDQuNC80LDQsNGCIn0sZmlsZTp7dW5pdDoi0LHQsNGY0YLQuCIsdmVyYjoi0LTQsCDQuNC80LDQsNGCIn0sYXJyYXk6e3VuaXQ6ItGB0YLQsNCy0LrQuCIsdmVyYjoi0LTQsCDQuNC80LDQsNGCIn0sc2V0Ont1bml0OiLRgdGC0LDQstC60LgiLHZlcmI6ItC00LAg0LjQvNCw0LDRgiJ9fTtmdW5jdGlvbiBuKGUpe3JldHVybiB0W2VdPz9udWxsfWNvbnN0IHI9e3JlZ2V4OiLQstC90LXRgSIsZW1haWw6ItCw0LTRgNC10YHQsCDQvdCwINC1LdC/0L7RiNGC0LAiLHVybDoiVVJMIixlbW9qaToi0LXQvNC+0Z/QuCIsdXVpZDoiVVVJRCIsdXVpZHY0OiJVVUlEdjQiLHV1aWR2NjoiVVVJRHY2IixuYW5vaWQ6Im5hbm9pZCIsZ3VpZDoiR1VJRCIsY3VpZDoiY3VpZCIsY3VpZDI6ImN1aWQyIix1bGlkOiJVTElEIix4aWQ6IlhJRCIsa3N1aWQ6IktTVUlEIixkYXRldGltZToiSVNPINC00LDRgtGD0Lwg0Lgg0LLRgNC10LzQtSIsZGF0ZToiSVNPINC00LDRgtGD0LwiLHRpbWU6IklTTyDQstGA0LXQvNC1IixkdXJhdGlvbjoiSVNPINCy0YDQtdC80LXRgtGA0LDQtdGa0LUiLGlwdjQ6IklQdjQg0LDQtNGA0LXRgdCwIixpcHY2OiJJUHY2INCw0LTRgNC10YHQsCIsY2lkcnY0OiJJUHY0INC+0L/RgdC10LMiLGNpZHJ2NjoiSVB2NiDQvtC/0YHQtdCzIixiYXNlNjQ6ImJhc2U2NC3QtdC90LrQvtC00LjRgNCw0L3QsCDQvdC40LfQsCIsYmFzZTY0dXJsOiJiYXNlNjR1cmwt0LXQvdC60L7QtNC40YDQsNC90LAg0L3QuNC30LAiLGpzb25fc3RyaW5nOiJKU09OINC90LjQt9CwIixlMTY0OiJFLjE2NCDQsdGA0L7RmCIsand0OiJKV1QiLHRlbXBsYXRlX2xpdGVyYWw6ItCy0L3QtdGBIn0sbz17bmFuOiJOYU4iLG51bWJlcjoi0LHRgNC+0ZgiLGFycmF5OiLQvdC40LfQsCJ9O3JldHVybiBlPT57c3dpdGNoKGUuY29kZSl7Y2FzZSJpbnZhbGlkX3R5cGUiOntjb25zdCBpPW9bZS5leHBlY3RlZF0/P2UuZXhwZWN0ZWQsYT13KGUuaW5wdXQpLHM9b1thXT8/YTtyZXR1cm4vXltBLVpdLy50ZXN0KGUuZXhwZWN0ZWQpP2DQk9GA0LXRiNC10L0g0LLQvdC10YE6INGB0LUg0L7Rh9C10LrRg9Cy0LAgaW5zdGFuY2VvZiAke2UuZXhwZWN0ZWR9LCDQv9GA0LjQvNC10L3QviAke3N9YDpg0JPRgNC10YjQtdC9INCy0L3QtdGBOiDRgdC1INC+0YfQtdC60YPQstCwICR7aX0sINC/0YDQuNC80LXQvdC+ICR7c31gfWNhc2UiaW52YWxpZF92YWx1ZSI6cmV0dXJuIGUudmFsdWVzLmxlbmd0aD09PTE/YEludmFsaWQgaW5wdXQ6IGV4cGVjdGVkICR7UyhlLnZhbHVlc1swXSl9YDpg0JPRgNC10YjQsNC90LAg0L7Qv9GG0LjRmNCwOiDRgdC1INC+0YfQtdC60YPQstCwINC10LTQvdCwICR7XyhlLnZhbHVlcywifCIpfWA7Y2FzZSJ0b29fYmlnIjp7Y29uc3QgaT1lLmluY2x1c2l2ZT8iPD0iOiI8IixhPW4oZS5vcmlnaW4pO3JldHVybiBhP2DQn9GA0LXQvNC90L7Qs9GDINCz0L7Qu9C10Lw6INGB0LUg0L7Rh9C10LrRg9Cy0LAgJHtlLm9yaWdpbj8/ItCy0YDQtdC00L3QvtGB0YLQsCJ9INC00LAg0LjQvNCwICR7aX0ke2UubWF4aW11bS50b1N0cmluZygpfSAke2EudW5pdD8/ItC10LvQtdC80LXQvdGC0LgifWA6YNCf0YDQtdC80L3QvtCz0YMg0LPQvtC70LXQvDog0YHQtSDQvtGH0LXQutGD0LLQsCAke2Uub3JpZ2luPz8i0LLRgNC10LTQvdC+0YHRgtCwIn0g0LTQsCDQsdC40LTQtSAke2l9JHtlLm1heGltdW0udG9TdHJpbmcoKX1gfWNhc2UidG9vX3NtYWxsIjp7Y29uc3QgaT1lLmluY2x1c2l2ZT8iPj0iOiI+IixhPW4oZS5vcmlnaW4pO3JldHVybiBhP2DQn9GA0LXQvNC90L7Qs9GDINC80LDQuzog0YHQtSDQvtGH0LXQutGD0LLQsCAke2Uub3JpZ2lufSDQtNCwINC40LzQsCAke2l9JHtlLm1pbmltdW0udG9TdHJpbmcoKX0gJHthLnVuaXR9YDpg0J/RgNC10LzQvdC+0LPRgyDQvNCw0Ls6INGB0LUg0L7Rh9C10LrRg9Cy0LAgJHtlLm9yaWdpbn0g0LTQsCDQsdC40LTQtSAke2l9JHtlLm1pbmltdW0udG9TdHJpbmcoKX1gfWNhc2UiaW52YWxpZF9mb3JtYXQiOntjb25zdCBpPWU7cmV0dXJuIGkuZm9ybWF0PT09InN0YXJ0c193aXRoIj9g0J3QtdCy0LDQttC10YfQutCwINC90LjQt9CwOiDQvNC+0YDQsCDQtNCwINC30LDQv9C+0YfQvdGD0LLQsCDRgdC+ICIke2kucHJlZml4fSJgOmkuZm9ybWF0PT09ImVuZHNfd2l0aCI/YNCd0LXQstCw0LbQtdGH0LrQsCDQvdC40LfQsDog0LzQvtGA0LAg0LTQsCDQt9Cw0LLRgNGI0YPQstCwINGB0L4gIiR7aS5zdWZmaXh9ImA6aS5mb3JtYXQ9PT0iaW5jbHVkZXMiP2DQndC10LLQsNC20LXRh9C60LAg0L3QuNC30LA6INC80L7RgNCwINC00LAg0LLQutC70YPRh9GD0LLQsCAiJHtpLmluY2x1ZGVzfSJgOmkuZm9ybWF0PT09InJlZ2V4Ij9g0J3QtdCy0LDQttC10YfQutCwINC90LjQt9CwOiDQvNC+0YDQsCDQtNCwINC+0LTQs9C+0LDRgNCwINC90LAg0L/QsNGC0LXRgNC90L7RgiAke2kucGF0dGVybn1gOmBJbnZhbGlkICR7cltpLmZvcm1hdF0/P2UuZm9ybWF0fWB9Y2FzZSJub3RfbXVsdGlwbGVfb2YiOnJldHVybmDQk9GA0LXRiNC10L0g0LHRgNC+0Zg6INC80L7RgNCwINC00LAg0LHQuNC00LUg0LTQtdC70LjQsiDRgdC+ICR7ZS5kaXZpc29yfWA7Y2FzZSJ1bnJlY29nbml6ZWRfa2V5cyI6cmV0dXJuYCR7ZS5rZXlzLmxlbmd0aD4xPyLQndC10L/RgNC10L/QvtC30L3QsNC10L3QuCDQutC70YPRh9C10LLQuCI6ItCd0LXQv9GA0LXQv9C+0LfQvdCw0LXQvSDQutC70YPRhyJ9OiAke18oZS5rZXlzLCIsICIpfWA7Y2FzZSJpbnZhbGlkX2tleSI6cmV0dXJuYNCT0YDQtdGI0LXQvSDQutC70YPRhyDQstC+ICR7ZS5vcmlnaW59YDtjYXNlImludmFsaWRfdW5pb24iOnJldHVybiLQk9GA0LXRiNC10L0g0LLQvdC10YEiO2Nhc2UiaW52YWxpZF9lbGVtZW50IjpyZXR1cm5g0JPRgNC10YjQvdCwINCy0YDQtdC00L3QvtGB0YIg0LLQviAke2Uub3JpZ2lufWA7ZGVmYXVsdDpyZXR1cm4i0JPRgNC10YjQtdC9INCy0L3QtdGBIn19fTtmdW5jdGlvbiBMZigpe3JldHVybntsb2NhbGVFcnJvcjpBZigpfX1jb25zdCBNZj0oKT0+e2NvbnN0IHQ9e3N0cmluZzp7dW5pdDoiYWtzYXJhIix2ZXJiOiJtZW1wdW55YWkifSxmaWxlOnt1bml0OiJiYWl0Iix2ZXJiOiJtZW1wdW55YWkifSxhcnJheTp7dW5pdDoiZWxlbWVuIix2ZXJiOiJtZW1wdW55YWkifSxzZXQ6e3VuaXQ6ImVsZW1lbiIsdmVyYjoibWVtcHVueWFpIn19O2Z1bmN0aW9uIG4oZSl7cmV0dXJuIHRbZV0/P251bGx9Y29uc3Qgcj17cmVnZXg6ImlucHV0IixlbWFpbDoiYWxhbWF0IGUtbWVsIix1cmw6IlVSTCIsZW1vamk6ImVtb2ppIix1dWlkOiJVVUlEIix1dWlkdjQ6IlVVSUR2NCIsdXVpZHY2OiJVVUlEdjYiLG5hbm9pZDoibmFub2lkIixndWlkOiJHVUlEIixjdWlkOiJjdWlkIixjdWlkMjoiY3VpZDIiLHVsaWQ6IlVMSUQiLHhpZDoiWElEIixrc3VpZDoiS1NVSUQiLGRhdGV0aW1lOiJ0YXJpa2ggbWFzYSBJU08iLGRhdGU6InRhcmlraCBJU08iLHRpbWU6Im1hc2EgSVNPIixkdXJhdGlvbjoidGVtcG9oIElTTyIsaXB2NDoiYWxhbWF0IElQdjQiLGlwdjY6ImFsYW1hdCBJUHY2IixjaWRydjQ6Imp1bGF0IElQdjQiLGNpZHJ2NjoianVsYXQgSVB2NiIsYmFzZTY0OiJzdHJpbmcgZGlrb2RrYW4gYmFzZTY0IixiYXNlNjR1cmw6InN0cmluZyBkaWtvZGthbiBiYXNlNjR1cmwiLGpzb25fc3RyaW5nOiJzdHJpbmcgSlNPTiIsZTE2NDoibm9tYm9yIEUuMTY0Iixqd3Q6IkpXVCIsdGVtcGxhdGVfbGl0ZXJhbDoiaW5wdXQifSxvPXtuYW46Ik5hTiIsbnVtYmVyOiJub21ib3IifTtyZXR1cm4gZT0+e3N3aXRjaChlLmNvZGUpe2Nhc2UiaW52YWxpZF90eXBlIjp7Y29uc3QgaT1vW2UuZXhwZWN0ZWRdPz9lLmV4cGVjdGVkLGE9dyhlLmlucHV0KSxzPW9bYV0/P2E7cmV0dXJuL15bQS1aXS8udGVzdChlLmV4cGVjdGVkKT9gSW5wdXQgdGlkYWsgc2FoOiBkaWphbmdrYSBpbnN0YW5jZW9mICR7ZS5leHBlY3RlZH0sIGRpdGVyaW1hICR7c31gOmBJbnB1dCB0aWRhayBzYWg6IGRpamFuZ2thICR7aX0sIGRpdGVyaW1hICR7c31gfWNhc2UiaW52YWxpZF92YWx1ZSI6cmV0dXJuIGUudmFsdWVzLmxlbmd0aD09PTE/YElucHV0IHRpZGFrIHNhaDogZGlqYW5na2EgJHtTKGUudmFsdWVzWzBdKX1gOmBQaWxpaGFuIHRpZGFrIHNhaDogZGlqYW5na2Egc2FsYWggc2F0dSBkYXJpcGFkYSAke18oZS52YWx1ZXMsInwiKX1gO2Nhc2UidG9vX2JpZyI6e2NvbnN0IGk9ZS5pbmNsdXNpdmU/Ijw9IjoiPCIsYT1uKGUub3JpZ2luKTtyZXR1cm4gYT9gVGVybGFsdSBiZXNhcjogZGlqYW5na2EgJHtlLm9yaWdpbj8/Im5pbGFpIn0gJHthLnZlcmJ9ICR7aX0ke2UubWF4aW11bS50b1N0cmluZygpfSAke2EudW5pdD8/ImVsZW1lbiJ9YDpgVGVybGFsdSBiZXNhcjogZGlqYW5na2EgJHtlLm9yaWdpbj8/Im5pbGFpIn0gYWRhbGFoICR7aX0ke2UubWF4aW11bS50b1N0cmluZygpfWB9Y2FzZSJ0b29fc21hbGwiOntjb25zdCBpPWUuaW5jbHVzaXZlPyI+PSI6Ij4iLGE9bihlLm9yaWdpbik7cmV0dXJuIGE/YFRlcmxhbHUga2VjaWw6IGRpamFuZ2thICR7ZS5vcmlnaW59ICR7YS52ZXJifSAke2l9JHtlLm1pbmltdW0udG9TdHJpbmcoKX0gJHthLnVuaXR9YDpgVGVybGFsdSBrZWNpbDogZGlqYW5na2EgJHtlLm9yaWdpbn0gYWRhbGFoICR7aX0ke2UubWluaW11bS50b1N0cmluZygpfWB9Y2FzZSJpbnZhbGlkX2Zvcm1hdCI6e2NvbnN0IGk9ZTtyZXR1cm4gaS5mb3JtYXQ9PT0ic3RhcnRzX3dpdGgiP2BTdHJpbmcgdGlkYWsgc2FoOiBtZXN0aSBiZXJtdWxhIGRlbmdhbiAiJHtpLnByZWZpeH0iYDppLmZvcm1hdD09PSJlbmRzX3dpdGgiP2BTdHJpbmcgdGlkYWsgc2FoOiBtZXN0aSBiZXJha2hpciBkZW5nYW4gIiR7aS5zdWZmaXh9ImA6aS5mb3JtYXQ9PT0iaW5jbHVkZXMiP2BTdHJpbmcgdGlkYWsgc2FoOiBtZXN0aSBtZW5nYW5kdW5naSAiJHtpLmluY2x1ZGVzfSJgOmkuZm9ybWF0PT09InJlZ2V4Ij9gU3RyaW5nIHRpZGFrIHNhaDogbWVzdGkgc2VwYWRhbiBkZW5nYW4gY29yYWsgJHtpLnBhdHRlcm59YDpgJHtyW2kuZm9ybWF0XT8/ZS5mb3JtYXR9IHRpZGFrIHNhaGB9Y2FzZSJub3RfbXVsdGlwbGVfb2YiOnJldHVybmBOb21ib3IgdGlkYWsgc2FoOiBwZXJsdSBnYW5kYWFuICR7ZS5kaXZpc29yfWA7Y2FzZSJ1bnJlY29nbml6ZWRfa2V5cyI6cmV0dXJuYEt1bmNpIHRpZGFrIGRpa2VuYWxpOiAke18oZS5rZXlzLCIsICIpfWA7Y2FzZSJpbnZhbGlkX2tleSI6cmV0dXJuYEt1bmNpIHRpZGFrIHNhaCBkYWxhbSAke2Uub3JpZ2lufWA7Y2FzZSJpbnZhbGlkX3VuaW9uIjpyZXR1cm4iSW5wdXQgdGlkYWsgc2FoIjtjYXNlImludmFsaWRfZWxlbWVudCI6cmV0dXJuYE5pbGFpIHRpZGFrIHNhaCBkYWxhbSAke2Uub3JpZ2lufWA7ZGVmYXVsdDpyZXR1cm4iSW5wdXQgdGlkYWsgc2FoIn19fTtmdW5jdGlvbiBxZigpe3JldHVybntsb2NhbGVFcnJvcjpNZigpfX1jb25zdCBGZj0oKT0+e2NvbnN0IHQ9e3N0cmluZzp7dW5pdDoidGVrZW5zIix2ZXJiOiJoZWVmdCJ9LGZpbGU6e3VuaXQ6ImJ5dGVzIix2ZXJiOiJoZWVmdCJ9LGFycmF5Ont1bml0OiJlbGVtZW50ZW4iLHZlcmI6ImhlZWZ0In0sc2V0Ont1bml0OiJlbGVtZW50ZW4iLHZlcmI6ImhlZWZ0In19O2Z1bmN0aW9uIG4oZSl7cmV0dXJuIHRbZV0/P251bGx9Y29uc3Qgcj17cmVnZXg6Imludm9lciIsZW1haWw6ImVtYWlsYWRyZXMiLHVybDoiVVJMIixlbW9qaToiZW1vamkiLHV1aWQ6IlVVSUQiLHV1aWR2NDoiVVVJRHY0Iix1dWlkdjY6IlVVSUR2NiIsbmFub2lkOiJuYW5vaWQiLGd1aWQ6IkdVSUQiLGN1aWQ6ImN1aWQiLGN1aWQyOiJjdWlkMiIsdWxpZDoiVUxJRCIseGlkOiJYSUQiLGtzdWlkOiJLU1VJRCIsZGF0ZXRpbWU6IklTTyBkYXR1bSBlbiB0aWpkIixkYXRlOiJJU08gZGF0dW0iLHRpbWU6IklTTyB0aWpkIixkdXJhdGlvbjoiSVNPIGR1dXIiLGlwdjQ6IklQdjQtYWRyZXMiLGlwdjY6IklQdjYtYWRyZXMiLGNpZHJ2NDoiSVB2NC1iZXJlaWsiLGNpZHJ2NjoiSVB2Ni1iZXJlaWsiLGJhc2U2NDoiYmFzZTY0LWdlY29kZWVyZGUgdGVrc3QiLGJhc2U2NHVybDoiYmFzZTY0IFVSTC1nZWNvZGVlcmRlIHRla3N0Iixqc29uX3N0cmluZzoiSlNPTiBzdHJpbmciLGUxNjQ6IkUuMTY0LW51bW1lciIsand0OiJKV1QiLHRlbXBsYXRlX2xpdGVyYWw6Imludm9lciJ9LG89e25hbjoiTmFOIixudW1iZXI6ImdldGFsIn07cmV0dXJuIGU9Pntzd2l0Y2goZS5jb2RlKXtjYXNlImludmFsaWRfdHlwZSI6e2NvbnN0IGk9b1tlLmV4cGVjdGVkXT8/ZS5leHBlY3RlZCxhPXcoZS5pbnB1dCkscz1vW2FdPz9hO3JldHVybi9eW0EtWl0vLnRlc3QoZS5leHBlY3RlZCk/YE9uZ2VsZGlnZSBpbnZvZXI6IHZlcndhY2h0IGluc3RhbmNlb2YgJHtlLmV4cGVjdGVkfSwgb250dmluZyAke3N9YDpgT25nZWxkaWdlIGludm9lcjogdmVyd2FjaHQgJHtpfSwgb250dmluZyAke3N9YH1jYXNlImludmFsaWRfdmFsdWUiOnJldHVybiBlLnZhbHVlcy5sZW5ndGg9PT0xP2BPbmdlbGRpZ2UgaW52b2VyOiB2ZXJ3YWNodCAke1MoZS52YWx1ZXNbMF0pfWA6YE9uZ2VsZGlnZSBvcHRpZTogdmVyd2FjaHQgw6nDqW4gdmFuICR7XyhlLnZhbHVlcywifCIpfWA7Y2FzZSJ0b29fYmlnIjp7Y29uc3QgaT1lLmluY2x1c2l2ZT8iPD0iOiI8IixhPW4oZS5vcmlnaW4pLHM9ZS5vcmlnaW49PT0iZGF0ZSI/ImxhYXQiOmUub3JpZ2luPT09InN0cmluZyI/ImxhbmciOiJncm9vdCI7cmV0dXJuIGE/YFRlICR7c306IHZlcndhY2h0IGRhdCAke2Uub3JpZ2luPz8id2FhcmRlIn0gJHtpfSR7ZS5tYXhpbXVtLnRvU3RyaW5nKCl9ICR7YS51bml0Pz8iZWxlbWVudGVuIn0gJHthLnZlcmJ9YDpgVGUgJHtzfTogdmVyd2FjaHQgZGF0ICR7ZS5vcmlnaW4/PyJ3YWFyZGUifSAke2l9JHtlLm1heGltdW0udG9TdHJpbmcoKX0gaXNgfWNhc2UidG9vX3NtYWxsIjp7Y29uc3QgaT1lLmluY2x1c2l2ZT8iPj0iOiI+IixhPW4oZS5vcmlnaW4pLHM9ZS5vcmlnaW49PT0iZGF0ZSI/InZyb2VnIjplLm9yaWdpbj09PSJzdHJpbmciPyJrb3J0Ijoia2xlaW4iO3JldHVybiBhP2BUZSAke3N9OiB2ZXJ3YWNodCBkYXQgJHtlLm9yaWdpbn0gJHtpfSR7ZS5taW5pbXVtLnRvU3RyaW5nKCl9ICR7YS51bml0fSAke2EudmVyYn1gOmBUZSAke3N9OiB2ZXJ3YWNodCBkYXQgJHtlLm9yaWdpbn0gJHtpfSR7ZS5taW5pbXVtLnRvU3RyaW5nKCl9IGlzYH1jYXNlImludmFsaWRfZm9ybWF0Ijp7Y29uc3QgaT1lO3JldHVybiBpLmZvcm1hdD09PSJzdGFydHNfd2l0aCI/YE9uZ2VsZGlnZSB0ZWtzdDogbW9ldCBtZXQgIiR7aS5wcmVmaXh9IiBiZWdpbm5lbmA6aS5mb3JtYXQ9PT0iZW5kc193aXRoIj9gT25nZWxkaWdlIHRla3N0OiBtb2V0IG9wICIke2kuc3VmZml4fSIgZWluZGlnZW5gOmkuZm9ybWF0PT09ImluY2x1ZGVzIj9gT25nZWxkaWdlIHRla3N0OiBtb2V0ICIke2kuaW5jbHVkZXN9IiBiZXZhdHRlbmA6aS5mb3JtYXQ9PT0icmVnZXgiP2BPbmdlbGRpZ2UgdGVrc3Q6IG1vZXQgb3ZlcmVlbmtvbWVuIG1ldCBwYXRyb29uICR7aS5wYXR0ZXJufWA6YE9uZ2VsZGlnOiAke3JbaS5mb3JtYXRdPz9lLmZvcm1hdH1gfWNhc2Uibm90X211bHRpcGxlX29mIjpyZXR1cm5gT25nZWxkaWcgZ2V0YWw6IG1vZXQgZWVuIHZlZWx2b3VkIHZhbiAke2UuZGl2aXNvcn0gemlqbmA7Y2FzZSJ1bnJlY29nbml6ZWRfa2V5cyI6cmV0dXJuYE9uYmVrZW5kZSBrZXkke2Uua2V5cy5sZW5ndGg+MT8icyI6IiJ9OiAke18oZS5rZXlzLCIsICIpfWA7Y2FzZSJpbnZhbGlkX2tleSI6cmV0dXJuYE9uZ2VsZGlnZSBrZXkgaW4gJHtlLm9yaWdpbn1gO2Nhc2UiaW52YWxpZF91bmlvbiI6cmV0dXJuIk9uZ2VsZGlnZSBpbnZvZXIiO2Nhc2UiaW52YWxpZF9lbGVtZW50IjpyZXR1cm5gT25nZWxkaWdlIHdhYXJkZSBpbiAke2Uub3JpZ2lufWA7ZGVmYXVsdDpyZXR1cm4iT25nZWxkaWdlIGludm9lciJ9fX07ZnVuY3Rpb24gSmYoKXtyZXR1cm57bG9jYWxlRXJyb3I6RmYoKX19Y29uc3QgSGY9KCk9Pntjb25zdCB0PXtzdHJpbmc6e3VuaXQ6InRlZ24iLHZlcmI6IsOlIGhhIn0sZmlsZTp7dW5pdDoiYnl0ZXMiLHZlcmI6IsOlIGhhIn0sYXJyYXk6e3VuaXQ6ImVsZW1lbnRlciIsdmVyYjoiw6UgaW5uZWhvbGRlIn0sc2V0Ont1bml0OiJlbGVtZW50ZXIiLHZlcmI6IsOlIGlubmVob2xkZSJ9fTtmdW5jdGlvbiBuKGUpe3JldHVybiB0W2VdPz9udWxsfWNvbnN0IHI9e3JlZ2V4OiJpbnB1dCIsZW1haWw6ImUtcG9zdGFkcmVzc2UiLHVybDoiVVJMIixlbW9qaToiZW1vamkiLHV1aWQ6IlVVSUQiLHV1aWR2NDoiVVVJRHY0Iix1dWlkdjY6IlVVSUR2NiIsbmFub2lkOiJuYW5vaWQiLGd1aWQ6IkdVSUQiLGN1aWQ6ImN1aWQiLGN1aWQyOiJjdWlkMiIsdWxpZDoiVUxJRCIseGlkOiJYSUQiLGtzdWlkOiJLU1VJRCIsZGF0ZXRpbWU6IklTTyBkYXRvLSBvZyBrbG9ra2VzbGV0dCIsZGF0ZToiSVNPLWRhdG8iLHRpbWU6IklTTy1rbG9ra2VzbGV0dCIsZHVyYXRpb246IklTTy12YXJpZ2hldCIsaXB2NDoiSVB2NC1vbXLDpWRlIixpcHY2OiJJUHY2LW9tcsOlZGUiLGNpZHJ2NDoiSVB2NC1zcGVrdGVyIixjaWRydjY6IklQdjYtc3Bla3RlciIsYmFzZTY0OiJiYXNlNjQtZW5rb2RldCBzdHJlbmciLGJhc2U2NHVybDoiYmFzZTY0dXJsLWVua29kZXQgc3RyZW5nIixqc29uX3N0cmluZzoiSlNPTi1zdHJlbmciLGUxNjQ6IkUuMTY0LW51bW1lciIsand0OiJKV1QiLHRlbXBsYXRlX2xpdGVyYWw6ImlucHV0In0sbz17bmFuOiJOYU4iLG51bWJlcjoidGFsbCIsYXJyYXk6Imxpc3RlIn07cmV0dXJuIGU9Pntzd2l0Y2goZS5jb2RlKXtjYXNlImludmFsaWRfdHlwZSI6e2NvbnN0IGk9b1tlLmV4cGVjdGVkXT8/ZS5leHBlY3RlZCxhPXcoZS5pbnB1dCkscz1vW2FdPz9hO3JldHVybi9eW0EtWl0vLnRlc3QoZS5leHBlY3RlZCk/YFVneWxkaWcgaW5wdXQ6IGZvcnZlbnRldCBpbnN0YW5jZW9mICR7ZS5leHBlY3RlZH0sIGZpa2sgJHtzfWA6YFVneWxkaWcgaW5wdXQ6IGZvcnZlbnRldCAke2l9LCBmaWtrICR7c31gfWNhc2UiaW52YWxpZF92YWx1ZSI6cmV0dXJuIGUudmFsdWVzLmxlbmd0aD09PTE/YFVneWxkaWcgdmVyZGk6IGZvcnZlbnRldCAke1MoZS52YWx1ZXNbMF0pfWA6YFVneWxkaWcgdmFsZzogZm9ydmVudGV0IGVuIGF2ICR7XyhlLnZhbHVlcywifCIpfWA7Y2FzZSJ0b29fYmlnIjp7Y29uc3QgaT1lLmluY2x1c2l2ZT8iPD0iOiI8IixhPW4oZS5vcmlnaW4pO3JldHVybiBhP2BGb3Igc3Rvcih0KTogZm9ydmVudGV0ICR7ZS5vcmlnaW4/PyJ2YWx1ZSJ9IHRpbCDDpSBoYSAke2l9JHtlLm1heGltdW0udG9TdHJpbmcoKX0gJHthLnVuaXQ/PyJlbGVtZW50ZXIifWA6YEZvciBzdG9yKHQpOiBmb3J2ZW50ZXQgJHtlLm9yaWdpbj8/InZhbHVlIn0gdGlsIMOlIGhhICR7aX0ke2UubWF4aW11bS50b1N0cmluZygpfWB9Y2FzZSJ0b29fc21hbGwiOntjb25zdCBpPWUuaW5jbHVzaXZlPyI+PSI6Ij4iLGE9bihlLm9yaWdpbik7cmV0dXJuIGE/YEZvciBsaXRlKG4pOiBmb3J2ZW50ZXQgJHtlLm9yaWdpbn0gdGlsIMOlIGhhICR7aX0ke2UubWluaW11bS50b1N0cmluZygpfSAke2EudW5pdH1gOmBGb3IgbGl0ZShuKTogZm9ydmVudGV0ICR7ZS5vcmlnaW59IHRpbCDDpSBoYSAke2l9JHtlLm1pbmltdW0udG9TdHJpbmcoKX1gfWNhc2UiaW52YWxpZF9mb3JtYXQiOntjb25zdCBpPWU7cmV0dXJuIGkuZm9ybWF0PT09InN0YXJ0c193aXRoIj9gVWd5bGRpZyBzdHJlbmc6IG3DpSBzdGFydGUgbWVkICIke2kucHJlZml4fSJgOmkuZm9ybWF0PT09ImVuZHNfd2l0aCI/YFVneWxkaWcgc3RyZW5nOiBtw6UgZW5kZSBtZWQgIiR7aS5zdWZmaXh9ImA6aS5mb3JtYXQ9PT0iaW5jbHVkZXMiP2BVZ3lsZGlnIHN0cmVuZzogbcOlIGlubmVob2xkZSAiJHtpLmluY2x1ZGVzfSJgOmkuZm9ybWF0PT09InJlZ2V4Ij9gVWd5bGRpZyBzdHJlbmc6IG3DpSBtYXRjaGUgbcO4bnN0ZXJldCAke2kucGF0dGVybn1gOmBVZ3lsZGlnICR7cltpLmZvcm1hdF0/P2UuZm9ybWF0fWB9Y2FzZSJub3RfbXVsdGlwbGVfb2YiOnJldHVybmBVZ3lsZGlnIHRhbGw6IG3DpSB2w6ZyZSBldCBtdWx0aXBsdW0gYXYgJHtlLmRpdmlzb3J9YDtjYXNlInVucmVjb2duaXplZF9rZXlzIjpyZXR1cm5gJHtlLmtleXMubGVuZ3RoPjE/IlVramVudGUgbsO4a2xlciI6IlVramVudCBuw7hra2VsIn06ICR7XyhlLmtleXMsIiwgIil9YDtjYXNlImludmFsaWRfa2V5IjpyZXR1cm5gVWd5bGRpZyBuw7hra2VsIGkgJHtlLm9yaWdpbn1gO2Nhc2UiaW52YWxpZF91bmlvbiI6cmV0dXJuIlVneWxkaWcgaW5wdXQiO2Nhc2UiaW52YWxpZF9lbGVtZW50IjpyZXR1cm5gVWd5bGRpZyB2ZXJkaSBpICR7ZS5vcmlnaW59YDtkZWZhdWx0OnJldHVybiJVZ3lsZGlnIGlucHV0In19fTtmdW5jdGlvbiBXZigpe3JldHVybntsb2NhbGVFcnJvcjpIZigpfX1jb25zdCBCZj0oKT0+e2NvbnN0IHQ9e3N0cmluZzp7dW5pdDoiaGFyZiIsdmVyYjoib2xtYWzEsWTEsXIifSxmaWxlOnt1bml0OiJiYXl0Iix2ZXJiOiJvbG1hbMSxZMSxciJ9LGFycmF5Ont1bml0OiJ1bnN1ciIsdmVyYjoib2xtYWzEsWTEsXIifSxzZXQ6e3VuaXQ6InVuc3VyIix2ZXJiOiJvbG1hbMSxZMSxciJ9fTtmdW5jdGlvbiBuKGUpe3JldHVybiB0W2VdPz9udWxsfWNvbnN0IHI9e3JlZ2V4OiJnaXJlbiIsZW1haWw6ImVwb3N0YWfDomgiLHVybDoiVVJMIixlbW9qaToiZW1vamkiLHV1aWQ6IlVVSUQiLHV1aWR2NDoiVVVJRHY0Iix1dWlkdjY6IlVVSUR2NiIsbmFub2lkOiJuYW5vaWQiLGd1aWQ6IkdVSUQiLGN1aWQ6ImN1aWQiLGN1aWQyOiJjdWlkMiIsdWxpZDoiVUxJRCIseGlkOiJYSUQiLGtzdWlkOiJLU1VJRCIsZGF0ZXRpbWU6IklTTyBoZW5nw6JtxLEiLGRhdGU6IklTTyB0YXJpaGkiLHRpbWU6IklTTyB6YW1hbsSxIixkdXJhdGlvbjoiSVNPIG3DvGRkZXRpIixpcHY0OiJJUHY0IG5pxZ/Dom7EsSIsaXB2NjoiSVB2NiBuacWfw6JuxLEiLGNpZHJ2NDoiSVB2NCBtZW56aWxpIixjaWRydjY6IklQdjYgbWVuemlsaSIsYmFzZTY0OiJiYXNlNjQtxZ9pZnJlbGkgbWV0aW4iLGJhc2U2NHVybDoiYmFzZTY0dXJsLcWfaWZyZWxpIG1ldGluIixqc29uX3N0cmluZzoiSlNPTiBtZXRpbiIsZTE2NDoiRS4xNjQgc2F5xLFzxLEiLGp3dDoiSldUIix0ZW1wbGF0ZV9saXRlcmFsOiJnaXJlbiJ9LG89e25hbjoiTmFOIixudW1iZXI6Im51bWFyYSIsYXJyYXk6InNhZiIsbnVsbDoiZ2F5YiJ9O3JldHVybiBlPT57c3dpdGNoKGUuY29kZSl7Y2FzZSJpbnZhbGlkX3R5cGUiOntjb25zdCBpPW9bZS5leHBlY3RlZF0/P2UuZXhwZWN0ZWQsYT13KGUuaW5wdXQpLHM9b1thXT8/YTtyZXR1cm4vXltBLVpdLy50ZXN0KGUuZXhwZWN0ZWQpP2BGw6JzaXQgZ2lyZW46IHVtdWxhbiBpbnN0YW5jZW9mICR7ZS5leHBlY3RlZH0sIGFsxLFuYW4gJHtzfWA6YEbDonNpdCBnaXJlbjogdW11bGFuICR7aX0sIGFsxLFuYW4gJHtzfWB9Y2FzZSJpbnZhbGlkX3ZhbHVlIjpyZXR1cm4gZS52YWx1ZXMubGVuZ3RoPT09MT9gRsOic2l0IGdpcmVuOiB1bXVsYW4gJHtTKGUudmFsdWVzWzBdKX1gOmBGw6JzaXQgdGVyY2loOiBtw7t0ZWJlcmxlciAke18oZS52YWx1ZXMsInwiKX1gO2Nhc2UidG9vX2JpZyI6e2NvbnN0IGk9ZS5pbmNsdXNpdmU/Ijw9IjoiPCIsYT1uKGUub3JpZ2luKTtyZXR1cm4gYT9gRmF6bGEgYsO8ecO8azogJHtlLm9yaWdpbj8/InZhbHVlIn0sICR7aX0ke2UubWF4aW11bS50b1N0cmluZygpfSAke2EudW5pdD8/ImVsZW1lbnRzIn0gc2FoaXAgb2xtYWzEsXlkxLEuYDpgRmF6bGEgYsO8ecO8azogJHtlLm9yaWdpbj8/InZhbHVlIn0sICR7aX0ke2UubWF4aW11bS50b1N0cmluZygpfSBvbG1hbMSxeWTEsS5gfWNhc2UidG9vX3NtYWxsIjp7Y29uc3QgaT1lLmluY2x1c2l2ZT8iPj0iOiI+IixhPW4oZS5vcmlnaW4pO3JldHVybiBhP2BGYXpsYSBrw7zDp8O8azogJHtlLm9yaWdpbn0sICR7aX0ke2UubWluaW11bS50b1N0cmluZygpfSAke2EudW5pdH0gc2FoaXAgb2xtYWzEsXlkxLEuYDpgRmF6bGEga8O8w6fDvGs6ICR7ZS5vcmlnaW59LCAke2l9JHtlLm1pbmltdW0udG9TdHJpbmcoKX0gb2xtYWzEsXlkxLEuYH1jYXNlImludmFsaWRfZm9ybWF0Ijp7Y29uc3QgaT1lO3JldHVybiBpLmZvcm1hdD09PSJzdGFydHNfd2l0aCI/YEbDonNpdCBtZXRpbjogIiR7aS5wcmVmaXh9IiBpbGUgYmHFn2xhbWFsxLEuYDppLmZvcm1hdD09PSJlbmRzX3dpdGgiP2BGw6JzaXQgbWV0aW46ICIke2kuc3VmZml4fSIgaWxlIGJpdG1lbGkuYDppLmZvcm1hdD09PSJpbmNsdWRlcyI/YEbDonNpdCBtZXRpbjogIiR7aS5pbmNsdWRlc30iIGlodGl2w6IgZXRtZWxpLmA6aS5mb3JtYXQ9PT0icmVnZXgiP2BGw6JzaXQgbWV0aW46ICR7aS5wYXR0ZXJufSBuYWvFn8SxbmEgdXltYWzEsS5gOmBGw6JzaXQgJHtyW2kuZm9ybWF0XT8/ZS5mb3JtYXR9YH1jYXNlIm5vdF9tdWx0aXBsZV9vZiI6cmV0dXJuYEbDonNpdCBzYXnEsTogJHtlLmRpdmlzb3J9IGthdMSxIG9sbWFsxLF5ZMSxLmA7Y2FzZSJ1bnJlY29nbml6ZWRfa2V5cyI6cmV0dXJuYFRhbsSxbm1heWFuIGFuYWh0YXIgJHtlLmtleXMubGVuZ3RoPjE/InMiOiIifTogJHtfKGUua2V5cywiLCAiKX1gO2Nhc2UiaW52YWxpZF9rZXkiOnJldHVybmAke2Uub3JpZ2lufSBpw6dpbiB0YW7EsW5tYXlhbiBhbmFodGFyIHZhci5gO2Nhc2UiaW52YWxpZF91bmlvbiI6cmV0dXJuIkdpcmVuIHRhbsSxbmFtYWTEsS4iO2Nhc2UiaW52YWxpZF9lbGVtZW50IjpyZXR1cm5gJHtlLm9yaWdpbn0gacOnaW4gdGFuxLFubWF5YW4ga8SxeW1ldCB2YXIuYDtkZWZhdWx0OnJldHVybiJLxLF5bWV0IHRhbsSxbmFtYWTEsS4ifX19O2Z1bmN0aW9uIFZmKCl7cmV0dXJue2xvY2FsZUVycm9yOkJmKCl9fWNvbnN0IEtmPSgpPT57Y29uc3QgdD17c3RyaW5nOnt1bml0OiLYqtmI2qnZiiIsdmVyYjoi2YjZhNix2YoifSxmaWxlOnt1bml0OiLYqNin24zZvNizIix2ZXJiOiLZiNmE2LHZiiJ9LGFycmF5Ont1bml0OiLYqtmI2qnZiiIsdmVyYjoi2YjZhNix2YoifSxzZXQ6e3VuaXQ6Itiq2YjaqdmKIix2ZXJiOiLZiNmE2LHZiiJ9fTtmdW5jdGlvbiBuKGUpe3JldHVybiB0W2VdPz9udWxsfWNvbnN0IHI9e3JlZ2V4OiLZiNix2YjYr9mKIixlbWFpbDoi2KjYsduM2prZhtin2YTbjNqpIix1cmw6ItuM2Ygg2KLYsSDYp9mEIixlbW9qaToi2KfbjNmF2YjYrNmKIix1dWlkOiJVVUlEIix1dWlkdjQ6IlVVSUR2NCIsdXVpZHY2OiJVVUlEdjYiLG5hbm9pZDoibmFub2lkIixndWlkOiJHVUlEIixjdWlkOiJjdWlkIixjdWlkMjoiY3VpZDIiLHVsaWQ6IlVMSUQiLHhpZDoiWElEIixrc3VpZDoiS1NVSUQiLGRhdGV0aW1lOiLZhtuM2bzZhyDYp9mIINmI2K7YqiIsZGF0ZToi2YbbkNm82YciLHRpbWU6ItmI2K7YqiIsZHVyYXRpb246ItmF2YjYr9mHIixpcHY0OiLYryBJUHY0INm+2KrZhyIsaXB2Njoi2K8gSVB2NiDZvtiq2YciLGNpZHJ2NDoi2K8gSVB2NCDYs9in2K3ZhyIsY2lkcnY2OiLYryBJUHY2INiz2KfYrdmHIixiYXNlNjQ6ImJhc2U2NC1lbmNvZGVkINmF2KrZhiIsYmFzZTY0dXJsOiJiYXNlNjR1cmwtZW5jb2RlZCDZhdiq2YYiLGpzb25fc3RyaW5nOiJKU09OINmF2KrZhiIsZTE2NDoi2K8gRS4xNjQg2LTZhduQ2LHZhyIsand0OiJKV1QiLHRlbXBsYXRlX2xpdGVyYWw6ItmI2LHZiNiv2YoifSxvPXtuYW46Ik5hTiIsbnVtYmVyOiLYudiv2K8iLGFycmF5OiLYp9ix25AifTtyZXR1cm4gZT0+e3N3aXRjaChlLmNvZGUpe2Nhc2UiaW52YWxpZF90eXBlIjp7Y29uc3QgaT1vW2UuZXhwZWN0ZWRdPz9lLmV4cGVjdGVkLGE9dyhlLmlucHV0KSxzPW9bYV0/P2E7cmV0dXJuL15bQS1aXS8udGVzdChlLmV4cGVjdGVkKT9g2YbYp9iz2YUg2YjYsdmI2K/Zijog2KjYp9uM2K8gaW5zdGFuY2VvZiAke2UuZXhwZWN0ZWR9INmI2KfbjCwg2YXaq9ixICR7c30g2KrYsdmE2KfYs9mHINi02YhgOmDZhtin2LPZhSDZiNix2YjYr9mKOiDYqNin24zYryAke2l9INmI2KfbjCwg2YXaq9ixICR7c30g2KrYsdmE2KfYs9mHINi02YhgfWNhc2UiaW52YWxpZF92YWx1ZSI6cmV0dXJuIGUudmFsdWVzLmxlbmd0aD09PTE/YNmG2KfYs9mFINmI2LHZiNiv2Yo6INio2KfbjNivICR7UyhlLnZhbHVlc1swXSl9INmI2KfbjGA6YNmG2KfYs9mFINin2YbYqtiu2KfYqDog2KjYp9uM2K8g24zZiCDZhNmHICR7XyhlLnZhbHVlcywifCIpfSDahdiu2Ycg2YjYp9uMYDtjYXNlInRvb19iaWciOntjb25zdCBpPWUuaW5jbHVzaXZlPyI8PSI6IjwiLGE9bihlLm9yaWdpbik7cmV0dXJuIGE/YNqJ24zYsSDZhNmI24w6ICR7ZS5vcmlnaW4/PyLYp9ix2LLamtiqIn0g2KjYp9uM2K8gJHtpfSR7ZS5tYXhpbXVtLnRvU3RyaW5nKCl9ICR7YS51bml0Pz8i2LnZhti12LHZiNmG2YcifSDZiNmE2LHZimA6YNqJ24zYsSDZhNmI24w6ICR7ZS5vcmlnaW4/PyLYp9ix2LLamtiqIn0g2KjYp9uM2K8gJHtpfSR7ZS5tYXhpbXVtLnRvU3RyaW5nKCl9INmI2YpgfWNhc2UidG9vX3NtYWxsIjp7Y29uc3QgaT1lLmluY2x1c2l2ZT8iPj0iOiI+IixhPW4oZS5vcmlnaW4pO3JldHVybiBhP2DaiduM2LEg2qnZiNqG2YbbjDogJHtlLm9yaWdpbn0g2KjYp9uM2K8gJHtpfSR7ZS5taW5pbXVtLnRvU3RyaW5nKCl9ICR7YS51bml0fSDZiNmE2LHZimA6YNqJ24zYsSDaqdmI2obZhtuMOiAke2Uub3JpZ2lufSDYqNin24zYryAke2l9JHtlLm1pbmltdW0udG9TdHJpbmcoKX0g2YjZimB9Y2FzZSJpbnZhbGlkX2Zvcm1hdCI6e2NvbnN0IGk9ZTtyZXR1cm4gaS5mb3JtYXQ9PT0ic3RhcnRzX3dpdGgiP2DZhtin2LPZhSDZhdiq2YY6INio2KfbjNivINivICIke2kucHJlZml4fSIg2LPYsdmHINm+24zZhCDYtNmKYDppLmZvcm1hdD09PSJlbmRzX3dpdGgiP2DZhtin2LPZhSDZhdiq2YY6INio2KfbjNivINivICIke2kuc3VmZml4fSIg2LPYsdmHINm+2KfbjCDYqtmHINmI2LHYs9mK2pbZimA6aS5mb3JtYXQ9PT0iaW5jbHVkZXMiP2DZhtin2LPZhSDZhdiq2YY6INio2KfbjNivICIke2kuaW5jbHVkZXN9IiDZiNmE2LHZimA6aS5mb3JtYXQ9PT0icmVnZXgiP2DZhtin2LPZhSDZhdiq2YY6INio2KfbjNivINivICR7aS5wYXR0ZXJufSDYs9ix2Ycg2YXYt9in2KjZgtiqINmI2YTYsdmKYDpgJHtyW2kuZm9ybWF0XT8/ZS5mb3JtYXR9INmG2KfYs9mFINiv24xgfWNhc2Uibm90X211bHRpcGxlX29mIjpyZXR1cm5g2YbYp9iz2YUg2LnYr9ivOiDYqNin24zYryDYryAke2UuZGl2aXNvcn0g2YXYttix2Kgg2YjZimA7Y2FzZSJ1bnJlY29nbml6ZWRfa2V5cyI6cmV0dXJuYNmG2KfYs9mFICR7ZS5rZXlzLmxlbmd0aD4xPyLaqdmE24zaidmI2YbZhyI6Itqp2YTbjNqJIn06ICR7XyhlLmtleXMsIiwgIil9YDtjYXNlImludmFsaWRfa2V5IjpyZXR1cm5g2YbYp9iz2YUg2qnZhNuM2okg2b7ZhyAke2Uub3JpZ2lufSDaqduQYDtjYXNlImludmFsaWRfdW5pb24iOnJldHVybiLZhtin2LPZhdmHINmI2LHZiNiv2YoiO2Nhc2UiaW52YWxpZF9lbGVtZW50IjpyZXR1cm5g2YbYp9iz2YUg2LnZhti12LEg2b7ZhyAke2Uub3JpZ2lufSDaqduQYDtkZWZhdWx0OnJldHVybiLZhtin2LPZhdmHINmI2LHZiNiv2YoifX19O2Z1bmN0aW9uIEdmKCl7cmV0dXJue2xvY2FsZUVycm9yOktmKCl9fWNvbnN0IFhmPSgpPT57Y29uc3QgdD17c3RyaW5nOnt1bml0OiJ6bmFrw7N3Iix2ZXJiOiJtaWXEhyJ9LGZpbGU6e3VuaXQ6ImJhanTDs3ciLHZlcmI6Im1pZcSHIn0sYXJyYXk6e3VuaXQ6ImVsZW1lbnTDs3ciLHZlcmI6Im1pZcSHIn0sc2V0Ont1bml0OiJlbGVtZW50w7N3Iix2ZXJiOiJtaWXEhyJ9fTtmdW5jdGlvbiBuKGUpe3JldHVybiB0W2VdPz9udWxsfWNvbnN0IHI9e3JlZ2V4OiJ3eXJhxbxlbmllIixlbWFpbDoiYWRyZXMgZW1haWwiLHVybDoiVVJMIixlbW9qaToiZW1vamkiLHV1aWQ6IlVVSUQiLHV1aWR2NDoiVVVJRHY0Iix1dWlkdjY6IlVVSUR2NiIsbmFub2lkOiJuYW5vaWQiLGd1aWQ6IkdVSUQiLGN1aWQ6ImN1aWQiLGN1aWQyOiJjdWlkMiIsdWxpZDoiVUxJRCIseGlkOiJYSUQiLGtzdWlkOiJLU1VJRCIsZGF0ZXRpbWU6ImRhdGEgaSBnb2R6aW5hIHcgZm9ybWFjaWUgSVNPIixkYXRlOiJkYXRhIHcgZm9ybWFjaWUgSVNPIix0aW1lOiJnb2R6aW5hIHcgZm9ybWFjaWUgSVNPIixkdXJhdGlvbjoiY3phcyB0cndhbmlhIElTTyIsaXB2NDoiYWRyZXMgSVB2NCIsaXB2NjoiYWRyZXMgSVB2NiIsY2lkcnY0OiJ6YWtyZXMgSVB2NCIsY2lkcnY2OiJ6YWtyZXMgSVB2NiIsYmFzZTY0OiJjacSFZyB6bmFrw7N3IHpha29kb3dhbnkgdyBmb3JtYWNpZSBiYXNlNjQiLGJhc2U2NHVybDoiY2nEhWcgem5ha8OzdyB6YWtvZG93YW55IHcgZm9ybWFjaWUgYmFzZTY0dXJsIixqc29uX3N0cmluZzoiY2nEhWcgem5ha8OzdyB3IGZvcm1hY2llIEpTT04iLGUxNjQ6ImxpY3piYSBFLjE2NCIsand0OiJKV1QiLHRlbXBsYXRlX2xpdGVyYWw6IndlasWbY2llIn0sbz17bmFuOiJOYU4iLG51bWJlcjoibGljemJhIixhcnJheToidGFibGljYSJ9O3JldHVybiBlPT57c3dpdGNoKGUuY29kZSl7Y2FzZSJpbnZhbGlkX3R5cGUiOntjb25zdCBpPW9bZS5leHBlY3RlZF0/P2UuZXhwZWN0ZWQsYT13KGUuaW5wdXQpLHM9b1thXT8/YTtyZXR1cm4vXltBLVpdLy50ZXN0KGUuZXhwZWN0ZWQpP2BOaWVwcmF3aWTFgm93ZSBkYW5lIHdlasWbY2lvd2U6IG9jemVraXdhbm8gaW5zdGFuY2VvZiAke2UuZXhwZWN0ZWR9LCBvdHJ6eW1hbm8gJHtzfWA6YE5pZXByYXdpZMWCb3dlIGRhbmUgd2VqxZtjaW93ZTogb2N6ZWtpd2FubyAke2l9LCBvdHJ6eW1hbm8gJHtzfWB9Y2FzZSJpbnZhbGlkX3ZhbHVlIjpyZXR1cm4gZS52YWx1ZXMubGVuZ3RoPT09MT9gTmllcHJhd2lkxYJvd2UgZGFuZSB3ZWrFm2Npb3dlOiBvY3pla2l3YW5vICR7UyhlLnZhbHVlc1swXSl9YDpgTmllcHJhd2lkxYJvd2Egb3BjamE6IG9jemVraXdhbm8gamVkbmVqIHogd2FydG/Fm2NpICR7XyhlLnZhbHVlcywifCIpfWA7Y2FzZSJ0b29fYmlnIjp7Y29uc3QgaT1lLmluY2x1c2l2ZT8iPD0iOiI8IixhPW4oZS5vcmlnaW4pO3JldHVybiBhP2BaYSBkdcW8YSB3YXJ0b8WbxIc6IG9jemVraXdhbm8sIMW8ZSAke2Uub3JpZ2luPz8id2FydG/Fm8SHIn0gYsSZZHppZSBtaWXEhyAke2l9JHtlLm1heGltdW0udG9TdHJpbmcoKX0gJHthLnVuaXQ/PyJlbGVtZW50w7N3In1gOmBaYnl0IGR1xbwoeS9hL2UpOiBvY3pla2l3YW5vLCDFvGUgJHtlLm9yaWdpbj8/IndhcnRvxZvEhyJ9IGLEmWR6aWUgd3lub3NpxIcgJHtpfSR7ZS5tYXhpbXVtLnRvU3RyaW5nKCl9YH1jYXNlInRvb19zbWFsbCI6e2NvbnN0IGk9ZS5pbmNsdXNpdmU/Ij49IjoiPiIsYT1uKGUub3JpZ2luKTtyZXR1cm4gYT9gWmEgbWHFgmEgd2FydG/Fm8SHOiBvY3pla2l3YW5vLCDFvGUgJHtlLm9yaWdpbj8/IndhcnRvxZvEhyJ9IGLEmWR6aWUgbWllxIcgJHtpfSR7ZS5taW5pbXVtLnRvU3RyaW5nKCl9ICR7YS51bml0Pz8iZWxlbWVudMOzdyJ9YDpgWmJ5dCBtYcWCKHkvYS9lKTogb2N6ZWtpd2FubywgxbxlICR7ZS5vcmlnaW4/PyJ3YXJ0b8WbxIcifSBixJlkemllIHd5bm9zacSHICR7aX0ke2UubWluaW11bS50b1N0cmluZygpfWB9Y2FzZSJpbnZhbGlkX2Zvcm1hdCI6e2NvbnN0IGk9ZTtyZXR1cm4gaS5mb3JtYXQ9PT0ic3RhcnRzX3dpdGgiP2BOaWVwcmF3aWTFgm93eSBjacSFZyB6bmFrw7N3OiBtdXNpIHphY3p5bmHEhyBzacSZIG9kICIke2kucHJlZml4fSJgOmkuZm9ybWF0PT09ImVuZHNfd2l0aCI/YE5pZXByYXdpZMWCb3d5IGNpxIVnIHpuYWvDs3c6IG11c2kga2/FhGN6ecSHIHNpxJkgbmEgIiR7aS5zdWZmaXh9ImA6aS5mb3JtYXQ9PT0iaW5jbHVkZXMiP2BOaWVwcmF3aWTFgm93eSBjacSFZyB6bmFrw7N3OiBtdXNpIHphd2llcmHEhyAiJHtpLmluY2x1ZGVzfSJgOmkuZm9ybWF0PT09InJlZ2V4Ij9gTmllcHJhd2lkxYJvd3kgY2nEhWcgem5ha8OzdzogbXVzaSBvZHBvd2lhZGHEhyB3em9yY293aSAke2kucGF0dGVybn1gOmBOaWVwcmF3aWTFgm93KHkvYS9lKSAke3JbaS5mb3JtYXRdPz9lLmZvcm1hdH1gfWNhc2Uibm90X211bHRpcGxlX29mIjpyZXR1cm5gTmllcHJhd2lkxYJvd2EgbGljemJhOiBtdXNpIGJ5xIcgd2llbG9rcm90bm/Fm2NpxIUgJHtlLmRpdmlzb3J9YDtjYXNlInVucmVjb2duaXplZF9rZXlzIjpyZXR1cm5gTmllcm96cG96bmFuZSBrbHVjemUke2Uua2V5cy5sZW5ndGg+MT8icyI6IiJ9OiAke18oZS5rZXlzLCIsICIpfWA7Y2FzZSJpbnZhbGlkX2tleSI6cmV0dXJuYE5pZXByYXdpZMWCb3d5IGtsdWN6IHcgJHtlLm9yaWdpbn1gO2Nhc2UiaW52YWxpZF91bmlvbiI6cmV0dXJuIk5pZXByYXdpZMWCb3dlIGRhbmUgd2VqxZtjaW93ZSI7Y2FzZSJpbnZhbGlkX2VsZW1lbnQiOnJldHVybmBOaWVwcmF3aWTFgm93YSB3YXJ0b8WbxIcgdyAke2Uub3JpZ2lufWA7ZGVmYXVsdDpyZXR1cm4iTmllcHJhd2lkxYJvd2UgZGFuZSB3ZWrFm2Npb3dlIn19fTtmdW5jdGlvbiBZZigpe3JldHVybntsb2NhbGVFcnJvcjpYZigpfX1jb25zdCBRZj0oKT0+e2NvbnN0IHQ9e3N0cmluZzp7dW5pdDoiY2FyYWN0ZXJlcyIsdmVyYjoidGVyIn0sZmlsZTp7dW5pdDoiYnl0ZXMiLHZlcmI6InRlciJ9LGFycmF5Ont1bml0OiJpdGVucyIsdmVyYjoidGVyIn0sc2V0Ont1bml0OiJpdGVucyIsdmVyYjoidGVyIn19O2Z1bmN0aW9uIG4oZSl7cmV0dXJuIHRbZV0/P251bGx9Y29uc3Qgcj17cmVnZXg6InBhZHLDo28iLGVtYWlsOiJlbmRlcmXDp28gZGUgZS1tYWlsIix1cmw6IlVSTCIsZW1vamk6ImVtb2ppIix1dWlkOiJVVUlEIix1dWlkdjQ6IlVVSUR2NCIsdXVpZHY2OiJVVUlEdjYiLG5hbm9pZDoibmFub2lkIixndWlkOiJHVUlEIixjdWlkOiJjdWlkIixjdWlkMjoiY3VpZDIiLHVsaWQ6IlVMSUQiLHhpZDoiWElEIixrc3VpZDoiS1NVSUQiLGRhdGV0aW1lOiJkYXRhIGUgaG9yYSBJU08iLGRhdGU6ImRhdGEgSVNPIix0aW1lOiJob3JhIElTTyIsZHVyYXRpb246ImR1cmHDp8OjbyBJU08iLGlwdjQ6ImVuZGVyZcOnbyBJUHY0IixpcHY2OiJlbmRlcmXDp28gSVB2NiIsY2lkcnY0OiJmYWl4YSBkZSBJUHY0IixjaWRydjY6ImZhaXhhIGRlIElQdjYiLGJhc2U2NDoidGV4dG8gY29kaWZpY2FkbyBlbSBiYXNlNjQiLGJhc2U2NHVybDoiVVJMIGNvZGlmaWNhZGEgZW0gYmFzZTY0Iixqc29uX3N0cmluZzoidGV4dG8gSlNPTiIsZTE2NDoibsO6bWVybyBFLjE2NCIsand0OiJKV1QiLHRlbXBsYXRlX2xpdGVyYWw6ImVudHJhZGEifSxvPXtuYW46Ik5hTiIsbnVtYmVyOiJuw7ptZXJvIixudWxsOiJudWxvIn07cmV0dXJuIGU9Pntzd2l0Y2goZS5jb2RlKXtjYXNlImludmFsaWRfdHlwZSI6e2NvbnN0IGk9b1tlLmV4cGVjdGVkXT8/ZS5leHBlY3RlZCxhPXcoZS5pbnB1dCkscz1vW2FdPz9hO3JldHVybi9eW0EtWl0vLnRlc3QoZS5leHBlY3RlZCk/YFRpcG8gaW52w6FsaWRvOiBlc3BlcmFkbyBpbnN0YW5jZW9mICR7ZS5leHBlY3RlZH0sIHJlY2ViaWRvICR7c31gOmBUaXBvIGludsOhbGlkbzogZXNwZXJhZG8gJHtpfSwgcmVjZWJpZG8gJHtzfWB9Y2FzZSJpbnZhbGlkX3ZhbHVlIjpyZXR1cm4gZS52YWx1ZXMubGVuZ3RoPT09MT9gRW50cmFkYSBpbnbDoWxpZGE6IGVzcGVyYWRvICR7UyhlLnZhbHVlc1swXSl9YDpgT3DDp8OjbyBpbnbDoWxpZGE6IGVzcGVyYWRhIHVtYSBkYXMgJHtfKGUudmFsdWVzLCJ8Iil9YDtjYXNlInRvb19iaWciOntjb25zdCBpPWUuaW5jbHVzaXZlPyI8PSI6IjwiLGE9bihlLm9yaWdpbik7cmV0dXJuIGE/YE11aXRvIGdyYW5kZTogZXNwZXJhZG8gcXVlICR7ZS5vcmlnaW4/PyJ2YWxvciJ9IHRpdmVzc2UgJHtpfSR7ZS5tYXhpbXVtLnRvU3RyaW5nKCl9ICR7YS51bml0Pz8iZWxlbWVudG9zIn1gOmBNdWl0byBncmFuZGU6IGVzcGVyYWRvIHF1ZSAke2Uub3JpZ2luPz8idmFsb3IifSBmb3NzZSAke2l9JHtlLm1heGltdW0udG9TdHJpbmcoKX1gfWNhc2UidG9vX3NtYWxsIjp7Y29uc3QgaT1lLmluY2x1c2l2ZT8iPj0iOiI+IixhPW4oZS5vcmlnaW4pO3JldHVybiBhP2BNdWl0byBwZXF1ZW5vOiBlc3BlcmFkbyBxdWUgJHtlLm9yaWdpbn0gdGl2ZXNzZSAke2l9JHtlLm1pbmltdW0udG9TdHJpbmcoKX0gJHthLnVuaXR9YDpgTXVpdG8gcGVxdWVubzogZXNwZXJhZG8gcXVlICR7ZS5vcmlnaW59IGZvc3NlICR7aX0ke2UubWluaW11bS50b1N0cmluZygpfWB9Y2FzZSJpbnZhbGlkX2Zvcm1hdCI6e2NvbnN0IGk9ZTtyZXR1cm4gaS5mb3JtYXQ9PT0ic3RhcnRzX3dpdGgiP2BUZXh0byBpbnbDoWxpZG86IGRldmUgY29tZcOnYXIgY29tICIke2kucHJlZml4fSJgOmkuZm9ybWF0PT09ImVuZHNfd2l0aCI/YFRleHRvIGludsOhbGlkbzogZGV2ZSB0ZXJtaW5hciBjb20gIiR7aS5zdWZmaXh9ImA6aS5mb3JtYXQ9PT0iaW5jbHVkZXMiP2BUZXh0byBpbnbDoWxpZG86IGRldmUgaW5jbHVpciAiJHtpLmluY2x1ZGVzfSJgOmkuZm9ybWF0PT09InJlZ2V4Ij9gVGV4dG8gaW52w6FsaWRvOiBkZXZlIGNvcnJlc3BvbmRlciBhbyBwYWRyw6NvICR7aS5wYXR0ZXJufWA6YCR7cltpLmZvcm1hdF0/P2UuZm9ybWF0fSBpbnbDoWxpZG9gfWNhc2Uibm90X211bHRpcGxlX29mIjpyZXR1cm5gTsO6bWVybyBpbnbDoWxpZG86IGRldmUgc2VyIG3Dumx0aXBsbyBkZSAke2UuZGl2aXNvcn1gO2Nhc2UidW5yZWNvZ25pemVkX2tleXMiOnJldHVybmBDaGF2ZSR7ZS5rZXlzLmxlbmd0aD4xPyJzIjoiIn0gZGVzY29uaGVjaWRhJHtlLmtleXMubGVuZ3RoPjE/InMiOiIifTogJHtfKGUua2V5cywiLCAiKX1gO2Nhc2UiaW52YWxpZF9rZXkiOnJldHVybmBDaGF2ZSBpbnbDoWxpZGEgZW0gJHtlLm9yaWdpbn1gO2Nhc2UiaW52YWxpZF91bmlvbiI6cmV0dXJuIkVudHJhZGEgaW52w6FsaWRhIjtjYXNlImludmFsaWRfZWxlbWVudCI6cmV0dXJuYFZhbG9yIGludsOhbGlkbyBlbSAke2Uub3JpZ2lufWA7ZGVmYXVsdDpyZXR1cm4iQ2FtcG8gaW52w6FsaWRvIn19fTtmdW5jdGlvbiBlZygpe3JldHVybntsb2NhbGVFcnJvcjpRZigpfX1jb25zdCB0Zz0oKT0+e2NvbnN0IHQ9e3N0cmluZzp7dW5pdDoiY2FyYWN0ZXJlIix2ZXJiOiJzxIMgYWlixIMifSxmaWxlOnt1bml0OiJvY3RlyJtpIix2ZXJiOiJzxIMgYWlixIMifSxhcnJheTp7dW5pdDoiZWxlbWVudGUiLHZlcmI6InPEgyBhaWLEgyJ9LHNldDp7dW5pdDoiZWxlbWVudGUiLHZlcmI6InPEgyBhaWLEgyJ9LG1hcDp7dW5pdDoiaW50csSDcmkiLHZlcmI6InPEgyBhaWLEgyJ9fTtmdW5jdGlvbiBuKGUpe3JldHVybiB0W2VdPz9udWxsfWNvbnN0IHI9e3JlZ2V4OiJpbnRyYXJlIixlbWFpbDoiYWRyZXPEgyBkZSBlbWFpbCIsdXJsOiJVUkwiLGVtb2ppOiJlbW9qaSIsdXVpZDoiVVVJRCIsdXVpZHY0OiJVVUlEdjQiLHV1aWR2NjoiVVVJRHY2IixuYW5vaWQ6Im5hbm9pZCIsZ3VpZDoiR1VJRCIsY3VpZDoiY3VpZCIsY3VpZDI6ImN1aWQyIix1bGlkOiJVTElEIix4aWQ6IlhJRCIsa3N1aWQ6IktTVUlEIixkYXRldGltZToiZGF0xIMgyJlpIG9yxIMgSVNPIixkYXRlOiJkYXTEgyBJU08iLHRpbWU6Im9yxIMgSVNPIixkdXJhdGlvbjoiZHVyYXTEgyBJU08iLGlwdjQ6ImFkcmVzxIMgSVB2NCIsaXB2NjoiYWRyZXPEgyBJUHY2IixtYWM6ImFkcmVzxIMgTUFDIixjaWRydjQ6ImludGVydmFsIElQdjQiLGNpZHJ2NjoiaW50ZXJ2YWwgSVB2NiIsYmFzZTY0OiLImWlyIGNvZGF0IGJhc2U2NCIsYmFzZTY0dXJsOiLImWlyIGNvZGF0IGJhc2U2NHVybCIsanNvbl9zdHJpbmc6IsiZaXIgSlNPTiIsZTE2NDoibnVtxINyIEUuMTY0Iixqd3Q6IkpXVCIsdGVtcGxhdGVfbGl0ZXJhbDoiaW50cmFyZSJ9LG89e25hbjoiTmFOIixzdHJpbmc6IsiZaXIiLG51bWJlcjoibnVtxINyIixib29sZWFuOiJib29sZWFuIixmdW5jdGlvbjoiZnVuY8ibaWUiLGFycmF5OiJtYXRyaWNlIixvYmplY3Q6Im9iaWVjdCIsdW5kZWZpbmVkOiJuZWRlZmluaXQiLHN5bWJvbDoic2ltYm9sIixiaWdpbnQ6Im51bcSDciBtYXJlIix2b2lkOiJ2b2lkIixuZXZlcjoibmV2ZXIiLG1hcDoiaGFydMSDIixzZXQ6InNldCJ9O3JldHVybiBlPT57c3dpdGNoKGUuY29kZSl7Y2FzZSJpbnZhbGlkX3R5cGUiOntjb25zdCBpPW9bZS5leHBlY3RlZF0/P2UuZXhwZWN0ZWQsYT13KGUuaW5wdXQpLHM9b1thXT8/YTtyZXR1cm5gSW50cmFyZSBpbnZhbGlkxIM6IGHImXRlcHRhdCAke2l9LCBwcmltaXQgJHtzfWB9Y2FzZSJpbnZhbGlkX3ZhbHVlIjpyZXR1cm4gZS52YWx1ZXMubGVuZ3RoPT09MT9gSW50cmFyZSBpbnZhbGlkxIM6IGHImXRlcHRhdCAke1MoZS52YWx1ZXNbMF0pfWA6YE9wyJtpdW5lIGludmFsaWTEgzogYciZdGVwdGF0IHVuYSBkaW50cmUgJHtfKGUudmFsdWVzLCJ8Iil9YDtjYXNlInRvb19iaWciOntjb25zdCBpPWUuaW5jbHVzaXZlPyI8PSI6IjwiLGE9bihlLm9yaWdpbik7cmV0dXJuIGE/YFByZWEgbWFyZTogYciZdGVwdGF0IGNhICR7ZS5vcmlnaW4/PyJ2YWxvYXJlYSJ9ICR7YS52ZXJifSAke2l9JHtlLm1heGltdW0udG9TdHJpbmcoKX0gJHthLnVuaXQ/PyJlbGVtZW50ZSJ9YDpgUHJlYSBtYXJlOiBhyJl0ZXB0YXQgY2EgJHtlLm9yaWdpbj8/InZhbG9hcmVhIn0gc8SDIGZpZSAke2l9JHtlLm1heGltdW0udG9TdHJpbmcoKX1gfWNhc2UidG9vX3NtYWxsIjp7Y29uc3QgaT1lLmluY2x1c2l2ZT8iPj0iOiI+IixhPW4oZS5vcmlnaW4pO3JldHVybiBhP2BQcmVhIG1pYzogYciZdGVwdGF0IGNhICR7ZS5vcmlnaW59ICR7YS52ZXJifSAke2l9JHtlLm1pbmltdW0udG9TdHJpbmcoKX0gJHthLnVuaXR9YDpgUHJlYSBtaWM6IGHImXRlcHRhdCBjYSAke2Uub3JpZ2lufSBzxIMgZmllICR7aX0ke2UubWluaW11bS50b1N0cmluZygpfWB9Y2FzZSJpbnZhbGlkX2Zvcm1hdCI6e2NvbnN0IGk9ZTtyZXR1cm4gaS5mb3JtYXQ9PT0ic3RhcnRzX3dpdGgiP2DImGlyIGludmFsaWQ6IHRyZWJ1aWUgc8SDIMOubmNlYXDEgyBjdSAiJHtpLnByZWZpeH0iYDppLmZvcm1hdD09PSJlbmRzX3dpdGgiP2DImGlyIGludmFsaWQ6IHRyZWJ1aWUgc8SDIHNlIHRlcm1pbmUgY3UgIiR7aS5zdWZmaXh9ImA6aS5mb3JtYXQ9PT0iaW5jbHVkZXMiP2DImGlyIGludmFsaWQ6IHRyZWJ1aWUgc8SDIGluY2x1ZMSDICIke2kuaW5jbHVkZXN9ImA6aS5mb3JtYXQ9PT0icmVnZXgiP2DImGlyIGludmFsaWQ6IHRyZWJ1aWUgc8SDIHNlIHBvdHJpdmVhc2PEgyBjdSBtb2RlbHVsICR7aS5wYXR0ZXJufWA6YEZvcm1hdCBpbnZhbGlkOiAke3JbaS5mb3JtYXRdPz9lLmZvcm1hdH1gfWNhc2Uibm90X211bHRpcGxlX29mIjpyZXR1cm5gTnVtxINyIGludmFsaWQ6IHRyZWJ1aWUgc8SDIGZpZSBtdWx0aXBsdSBkZSAke2UuZGl2aXNvcn1gO2Nhc2UidW5yZWNvZ25pemVkX2tleXMiOnJldHVybmBDaGVpIG5lcmVjdW5vc2N1dGU6ICR7XyhlLmtleXMsIiwgIil9YDtjYXNlImludmFsaWRfa2V5IjpyZXR1cm5gQ2hlaWUgaW52YWxpZMSDIMOubiAke2Uub3JpZ2lufWA7Y2FzZSJpbnZhbGlkX3VuaW9uIjpyZXR1cm4iSW50cmFyZSBpbnZhbGlkxIMiO2Nhc2UiaW52YWxpZF9lbGVtZW50IjpyZXR1cm5gVmFsb2FyZSBpbnZhbGlkxIMgw65uICR7ZS5vcmlnaW59YDtkZWZhdWx0OnJldHVybiJJbnRyYXJlIGludmFsaWTEgyJ9fX07ZnVuY3Rpb24gbmcoKXtyZXR1cm57bG9jYWxlRXJyb3I6dGcoKX19ZnVuY3Rpb24gTnModCxuLHIsbyl7Y29uc3QgZT1NYXRoLmFicyh0KSxpPWUlMTAsYT1lJTEwMDtyZXR1cm4gYT49MTEmJmE8PTE5P286aT09PTE/bjppPj0yJiZpPD00P3I6b31jb25zdCByZz0oKT0+e2NvbnN0IHQ9e3N0cmluZzp7dW5pdDp7b25lOiLRgdC40LzQstC+0LsiLGZldzoi0YHQuNC80LLQvtC70LAiLG1hbnk6ItGB0LjQvNCy0L7Qu9C+0LIifSx2ZXJiOiLQuNC80LXRgtGMIn0sZmlsZTp7dW5pdDp7b25lOiLQsdCw0LnRgiIsZmV3OiLQsdCw0LnRgtCwIixtYW55OiLQsdCw0LnRgiJ9LHZlcmI6ItC40LzQtdGC0YwifSxhcnJheTp7dW5pdDp7b25lOiLRjdC70LXQvNC10L3RgiIsZmV3OiLRjdC70LXQvNC10L3RgtCwIixtYW55OiLRjdC70LXQvNC10L3RgtC+0LIifSx2ZXJiOiLQuNC80LXRgtGMIn0sc2V0Ont1bml0OntvbmU6ItGN0LvQtdC80LXQvdGCIixmZXc6ItGN0LvQtdC80LXQvdGC0LAiLG1hbnk6ItGN0LvQtdC80LXQvdGC0L7QsiJ9LHZlcmI6ItC40LzQtdGC0YwifX07ZnVuY3Rpb24gbihlKXtyZXR1cm4gdFtlXT8/bnVsbH1jb25zdCByPXtyZWdleDoi0LLQstC+0LQiLGVtYWlsOiJlbWFpbCDQsNC00YDQtdGBIix1cmw6IlVSTCIsZW1vamk6ItGN0LzQvtC00LfQuCIsdXVpZDoiVVVJRCIsdXVpZHY0OiJVVUlEdjQiLHV1aWR2NjoiVVVJRHY2IixuYW5vaWQ6Im5hbm9pZCIsZ3VpZDoiR1VJRCIsY3VpZDoiY3VpZCIsY3VpZDI6ImN1aWQyIix1bGlkOiJVTElEIix4aWQ6IlhJRCIsa3N1aWQ6IktTVUlEIixkYXRldGltZToiSVNPINC00LDRgtCwINC4INCy0YDQtdC80Y8iLGRhdGU6IklTTyDQtNCw0YLQsCIsdGltZToiSVNPINCy0YDQtdC80Y8iLGR1cmF0aW9uOiJJU08g0LTQu9C40YLQtdC70YzQvdC+0YHRgtGMIixpcHY0OiJJUHY0INCw0LTRgNC10YEiLGlwdjY6IklQdjYg0LDQtNGA0LXRgSIsY2lkcnY0OiJJUHY0INC00LjQsNC/0LDQt9C+0L0iLGNpZHJ2NjoiSVB2NiDQtNC40LDQv9Cw0LfQvtC9IixiYXNlNjQ6ItGB0YLRgNC+0LrQsCDQsiDRhNC+0YDQvNCw0YLQtSBiYXNlNjQiLGJhc2U2NHVybDoi0YHRgtGA0L7QutCwINCyINGE0L7RgNC80LDRgtC1IGJhc2U2NHVybCIsanNvbl9zdHJpbmc6IkpTT04g0YHRgtGA0L7QutCwIixlMTY0OiLQvdC+0LzQtdGAIEUuMTY0Iixqd3Q6IkpXVCIsdGVtcGxhdGVfbGl0ZXJhbDoi0LLQstC+0LQifSxvPXtuYW46Ik5hTiIsbnVtYmVyOiLRh9C40YHQu9C+IixhcnJheToi0LzQsNGB0YHQuNCyIn07cmV0dXJuIGU9Pntzd2l0Y2goZS5jb2RlKXtjYXNlImludmFsaWRfdHlwZSI6e2NvbnN0IGk9b1tlLmV4cGVjdGVkXT8/ZS5leHBlY3RlZCxhPXcoZS5pbnB1dCkscz1vW2FdPz9hO3JldHVybi9eW0EtWl0vLnRlc3QoZS5leHBlY3RlZCk/YNCd0LXQstC10YDQvdGL0Lkg0LLQstC+0LQ6INC+0LbQuNC00LDQu9C+0YHRjCBpbnN0YW5jZW9mICR7ZS5leHBlY3RlZH0sINC/0L7Qu9GD0YfQtdC90L4gJHtzfWA6YNCd0LXQstC10YDQvdGL0Lkg0LLQstC+0LQ6INC+0LbQuNC00LDQu9C+0YHRjCAke2l9LCDQv9C+0LvRg9GH0LXQvdC+ICR7c31gfWNhc2UiaW52YWxpZF92YWx1ZSI6cmV0dXJuIGUudmFsdWVzLmxlbmd0aD09PTE/YNCd0LXQstC10YDQvdGL0Lkg0LLQstC+0LQ6INC+0LbQuNC00LDQu9C+0YHRjCAke1MoZS52YWx1ZXNbMF0pfWA6YNCd0LXQstC10YDQvdGL0Lkg0LLQsNGA0LjQsNC90YI6INC+0LbQuNC00LDQu9C+0YHRjCDQvtC00L3QviDQuNC3ICR7XyhlLnZhbHVlcywifCIpfWA7Y2FzZSJ0b29fYmlnIjp7Y29uc3QgaT1lLmluY2x1c2l2ZT8iPD0iOiI8IixhPW4oZS5vcmlnaW4pO2lmKGEpe2NvbnN0IHM9TnVtYmVyKGUubWF4aW11bSksYz1OcyhzLGEudW5pdC5vbmUsYS51bml0LmZldyxhLnVuaXQubWFueSk7cmV0dXJuYNCh0LvQuNGI0LrQvtC8INCx0L7Qu9GM0YjQvtC1INC30L3QsNGH0LXQvdC40LU6INC+0LbQuNC00LDQu9C+0YHRjCwg0YfRgtC+ICR7ZS5vcmlnaW4/PyLQt9C90LDRh9C10L3QuNC1In0g0LHRg9C00LXRgiDQuNC80LXRgtGMICR7aX0ke2UubWF4aW11bS50b1N0cmluZygpfSAke2N9YH1yZXR1cm5g0KHQu9C40YjQutC+0Lwg0LHQvtC70YzRiNC+0LUg0LfQvdCw0YfQtdC90LjQtTog0L7QttC40LTQsNC70L7RgdGMLCDRh9GC0L4gJHtlLm9yaWdpbj8/ItC30L3QsNGH0LXQvdC40LUifSDQsdGD0LTQtdGCICR7aX0ke2UubWF4aW11bS50b1N0cmluZygpfWB9Y2FzZSJ0b29fc21hbGwiOntjb25zdCBpPWUuaW5jbHVzaXZlPyI+PSI6Ij4iLGE9bihlLm9yaWdpbik7aWYoYSl7Y29uc3Qgcz1OdW1iZXIoZS5taW5pbXVtKSxjPU5zKHMsYS51bml0Lm9uZSxhLnVuaXQuZmV3LGEudW5pdC5tYW55KTtyZXR1cm5g0KHQu9C40YjQutC+0Lwg0LzQsNC70LXQvdGM0LrQvtC1INC30L3QsNGH0LXQvdC40LU6INC+0LbQuNC00LDQu9C+0YHRjCwg0YfRgtC+ICR7ZS5vcmlnaW59INCx0YPQtNC10YIg0LjQvNC10YLRjCAke2l9JHtlLm1pbmltdW0udG9TdHJpbmcoKX0gJHtjfWB9cmV0dXJuYNCh0LvQuNGI0LrQvtC8INC80LDQu9C10L3RjNC60L7QtSDQt9C90LDRh9C10L3QuNC1OiDQvtC20LjQtNCw0LvQvtGB0YwsINGH0YLQviAke2Uub3JpZ2lufSDQsdGD0LTQtdGCICR7aX0ke2UubWluaW11bS50b1N0cmluZygpfWB9Y2FzZSJpbnZhbGlkX2Zvcm1hdCI6e2NvbnN0IGk9ZTtyZXR1cm4gaS5mb3JtYXQ9PT0ic3RhcnRzX3dpdGgiP2DQndC10LLQtdGA0L3QsNGPINGB0YLRgNC+0LrQsDog0LTQvtC70LbQvdCwINC90LDRh9C40L3QsNGC0YzRgdGPINGBICIke2kucHJlZml4fSJgOmkuZm9ybWF0PT09ImVuZHNfd2l0aCI/YNCd0LXQstC10YDQvdCw0Y8g0YHRgtGA0L7QutCwOiDQtNC+0LvQttC90LAg0LfQsNC60LDQvdGH0LjQstCw0YLRjNGB0Y8g0L3QsCAiJHtpLnN1ZmZpeH0iYDppLmZvcm1hdD09PSJpbmNsdWRlcyI/YNCd0LXQstC10YDQvdCw0Y8g0YHRgtGA0L7QutCwOiDQtNC+0LvQttC90LAg0YHQvtC00LXRgNC20LDRgtGMICIke2kuaW5jbHVkZXN9ImA6aS5mb3JtYXQ9PT0icmVnZXgiP2DQndC10LLQtdGA0L3QsNGPINGB0YLRgNC+0LrQsDog0LTQvtC70LbQvdCwINGB0L7QvtGC0LLQtdGC0YHRgtCy0L7QstCw0YLRjCDRiNCw0LHQu9C+0L3RgyAke2kucGF0dGVybn1gOmDQndC10LLQtdGA0L3Ri9C5ICR7cltpLmZvcm1hdF0/P2UuZm9ybWF0fWB9Y2FzZSJub3RfbXVsdGlwbGVfb2YiOnJldHVybmDQndC10LLQtdGA0L3QvtC1INGH0LjRgdC70L46INC00L7Qu9C20L3QviDQsdGL0YLRjCDQutGA0LDRgtC90YvQvCAke2UuZGl2aXNvcn1gO2Nhc2UidW5yZWNvZ25pemVkX2tleXMiOnJldHVybmDQndC10YDQsNGB0L/QvtC30L3QsNC90L0ke2Uua2V5cy5sZW5ndGg+MT8i0YvQtSI6ItGL0LkifSDQutC70Y7RhyR7ZS5rZXlzLmxlbmd0aD4xPyLQuCI6IiJ9OiAke18oZS5rZXlzLCIsICIpfWA7Y2FzZSJpbnZhbGlkX2tleSI6cmV0dXJuYNCd0LXQstC10YDQvdGL0Lkg0LrQu9GO0Ycg0LIgJHtlLm9yaWdpbn1gO2Nhc2UiaW52YWxpZF91bmlvbiI6cmV0dXJuItCd0LXQstC10YDQvdGL0LUg0LLRhdC+0LTQvdGL0LUg0LTQsNC90L3Ri9C1IjtjYXNlImludmFsaWRfZWxlbWVudCI6cmV0dXJuYNCd0LXQstC10YDQvdC+0LUg0LfQvdCw0YfQtdC90LjQtSDQsiAke2Uub3JpZ2lufWA7ZGVmYXVsdDpyZXR1cm4i0J3QtdCy0LXRgNC90YvQtSDQstGF0L7QtNC90YvQtSDQtNCw0L3QvdGL0LUifX19O2Z1bmN0aW9uIGlnKCl7cmV0dXJue2xvY2FsZUVycm9yOnJnKCl9fWNvbnN0IG9nPSgpPT57Y29uc3QgdD17c3RyaW5nOnt1bml0OiJ6bmFrb3YiLHZlcmI6ImltZXRpIn0sZmlsZTp7dW5pdDoiYmFqdG92Iix2ZXJiOiJpbWV0aSJ9LGFycmF5Ont1bml0OiJlbGVtZW50b3YiLHZlcmI6ImltZXRpIn0sc2V0Ont1bml0OiJlbGVtZW50b3YiLHZlcmI6ImltZXRpIn19O2Z1bmN0aW9uIG4oZSl7cmV0dXJuIHRbZV0/P251bGx9Y29uc3Qgcj17cmVnZXg6InZub3MiLGVtYWlsOiJlLXBvxaF0bmkgbmFzbG92Iix1cmw6IlVSTCIsZW1vamk6ImVtb2ppIix1dWlkOiJVVUlEIix1dWlkdjQ6IlVVSUR2NCIsdXVpZHY2OiJVVUlEdjYiLG5hbm9pZDoibmFub2lkIixndWlkOiJHVUlEIixjdWlkOiJjdWlkIixjdWlkMjoiY3VpZDIiLHVsaWQ6IlVMSUQiLHhpZDoiWElEIixrc3VpZDoiS1NVSUQiLGRhdGV0aW1lOiJJU08gZGF0dW0gaW4gxI1hcyIsZGF0ZToiSVNPIGRhdHVtIix0aW1lOiJJU08gxI1hcyIsZHVyYXRpb246IklTTyB0cmFqYW5qZSIsaXB2NDoiSVB2NCBuYXNsb3YiLGlwdjY6IklQdjYgbmFzbG92IixjaWRydjQ6Im9ic2VnIElQdjQiLGNpZHJ2Njoib2JzZWcgSVB2NiIsYmFzZTY0OiJiYXNlNjQga29kaXJhbiBuaXoiLGJhc2U2NHVybDoiYmFzZTY0dXJsIGtvZGlyYW4gbml6Iixqc29uX3N0cmluZzoiSlNPTiBuaXoiLGUxNjQ6IkUuMTY0IMWhdGV2aWxrYSIsand0OiJKV1QiLHRlbXBsYXRlX2xpdGVyYWw6InZub3MifSxvPXtuYW46Ik5hTiIsbnVtYmVyOiLFoXRldmlsbyIsYXJyYXk6InRhYmVsYSJ9O3JldHVybiBlPT57c3dpdGNoKGUuY29kZSl7Y2FzZSJpbnZhbGlkX3R5cGUiOntjb25zdCBpPW9bZS5leHBlY3RlZF0/P2UuZXhwZWN0ZWQsYT13KGUuaW5wdXQpLHM9b1thXT8/YTtyZXR1cm4vXltBLVpdLy50ZXN0KGUuZXhwZWN0ZWQpP2BOZXZlbGphdmVuIHZub3M6IHByacSNYWtvdmFubyBpbnN0YW5jZW9mICR7ZS5leHBlY3RlZH0sIHByZWpldG8gJHtzfWA6YE5ldmVsamF2ZW4gdm5vczogcHJpxI1ha292YW5vICR7aX0sIHByZWpldG8gJHtzfWB9Y2FzZSJpbnZhbGlkX3ZhbHVlIjpyZXR1cm4gZS52YWx1ZXMubGVuZ3RoPT09MT9gTmV2ZWxqYXZlbiB2bm9zOiBwcmnEjWFrb3Zhbm8gJHtTKGUudmFsdWVzWzBdKX1gOmBOZXZlbGphdm5hIG1vxb5ub3N0OiBwcmnEjWFrb3Zhbm8gZW5vIGl6bWVkICR7XyhlLnZhbHVlcywifCIpfWA7Y2FzZSJ0b29fYmlnIjp7Y29uc3QgaT1lLmluY2x1c2l2ZT8iPD0iOiI8IixhPW4oZS5vcmlnaW4pO3JldHVybiBhP2BQcmV2ZWxpa286IHByacSNYWtvdmFubywgZGEgYm8gJHtlLm9yaWdpbj8/InZyZWRub3N0In0gaW1lbG8gJHtpfSR7ZS5tYXhpbXVtLnRvU3RyaW5nKCl9ICR7YS51bml0Pz8iZWxlbWVudG92In1gOmBQcmV2ZWxpa286IHByacSNYWtvdmFubywgZGEgYm8gJHtlLm9yaWdpbj8/InZyZWRub3N0In0gJHtpfSR7ZS5tYXhpbXVtLnRvU3RyaW5nKCl9YH1jYXNlInRvb19zbWFsbCI6e2NvbnN0IGk9ZS5pbmNsdXNpdmU/Ij49IjoiPiIsYT1uKGUub3JpZ2luKTtyZXR1cm4gYT9gUHJlbWFqaG5vOiBwcmnEjWFrb3Zhbm8sIGRhIGJvICR7ZS5vcmlnaW59IGltZWxvICR7aX0ke2UubWluaW11bS50b1N0cmluZygpfSAke2EudW5pdH1gOmBQcmVtYWpobm86IHByacSNYWtvdmFubywgZGEgYm8gJHtlLm9yaWdpbn0gJHtpfSR7ZS5taW5pbXVtLnRvU3RyaW5nKCl9YH1jYXNlImludmFsaWRfZm9ybWF0Ijp7Y29uc3QgaT1lO3JldHVybiBpLmZvcm1hdD09PSJzdGFydHNfd2l0aCI/YE5ldmVsamF2ZW4gbml6OiBtb3JhIHNlIHphxI1ldGkgeiAiJHtpLnByZWZpeH0iYDppLmZvcm1hdD09PSJlbmRzX3dpdGgiP2BOZXZlbGphdmVuIG5pejogbW9yYSBzZSBrb27EjWF0aSB6ICIke2kuc3VmZml4fSJgOmkuZm9ybWF0PT09ImluY2x1ZGVzIj9gTmV2ZWxqYXZlbiBuaXo6IG1vcmEgdnNlYm92YXRpICIke2kuaW5jbHVkZXN9ImA6aS5mb3JtYXQ9PT0icmVnZXgiP2BOZXZlbGphdmVuIG5pejogbW9yYSB1c3RyZXphdGkgdnpvcmN1ICR7aS5wYXR0ZXJufWA6YE5ldmVsamF2ZW4gJHtyW2kuZm9ybWF0XT8/ZS5mb3JtYXR9YH1jYXNlIm5vdF9tdWx0aXBsZV9vZiI6cmV0dXJuYE5ldmVsamF2bm8gxaF0ZXZpbG86IG1vcmEgYml0aSB2ZcSNa3JhdG5payAke2UuZGl2aXNvcn1gO2Nhc2UidW5yZWNvZ25pemVkX2tleXMiOnJldHVybmBOZXByZXBvem5hbiR7ZS5rZXlzLmxlbmd0aD4xPyJpIGtsanXEjWkiOiIga2xqdcSNIn06ICR7XyhlLmtleXMsIiwgIil9YDtjYXNlImludmFsaWRfa2V5IjpyZXR1cm5gTmV2ZWxqYXZlbiBrbGp1xI0gdiAke2Uub3JpZ2lufWA7Y2FzZSJpbnZhbGlkX3VuaW9uIjpyZXR1cm4iTmV2ZWxqYXZlbiB2bm9zIjtjYXNlImludmFsaWRfZWxlbWVudCI6cmV0dXJuYE5ldmVsamF2bmEgdnJlZG5vc3QgdiAke2Uub3JpZ2lufWA7ZGVmYXVsdDpyZXR1cm4iTmV2ZWxqYXZlbiB2bm9zIn19fTtmdW5jdGlvbiBhZygpe3JldHVybntsb2NhbGVFcnJvcjpvZygpfX1jb25zdCBzZz0oKT0+e2NvbnN0IHQ9e3N0cmluZzp7dW5pdDoidGVja2VuIix2ZXJiOiJhdHQgaGEifSxmaWxlOnt1bml0OiJieXRlcyIsdmVyYjoiYXR0IGhhIn0sYXJyYXk6e3VuaXQ6Im9iamVrdCIsdmVyYjoiYXR0IGlubmVow6VsbGEifSxzZXQ6e3VuaXQ6Im9iamVrdCIsdmVyYjoiYXR0IGlubmVow6VsbGEifX07ZnVuY3Rpb24gbihlKXtyZXR1cm4gdFtlXT8/bnVsbH1jb25zdCByPXtyZWdleDoicmVndWxqw6RydCB1dHRyeWNrIixlbWFpbDoiZS1wb3N0YWRyZXNzIix1cmw6IlVSTCIsZW1vamk6ImVtb2ppIix1dWlkOiJVVUlEIix1dWlkdjQ6IlVVSUR2NCIsdXVpZHY2OiJVVUlEdjYiLG5hbm9pZDoibmFub2lkIixndWlkOiJHVUlEIixjdWlkOiJjdWlkIixjdWlkMjoiY3VpZDIiLHVsaWQ6IlVMSUQiLHhpZDoiWElEIixrc3VpZDoiS1NVSUQiLGRhdGV0aW1lOiJJU08tZGF0dW0gb2NoIHRpZCIsZGF0ZToiSVNPLWRhdHVtIix0aW1lOiJJU08tdGlkIixkdXJhdGlvbjoiSVNPLXZhcmFrdGlnaGV0IixpcHY0OiJJUHY0LWludGVydmFsbCIsaXB2NjoiSVB2Ni1pbnRlcnZhbGwiLGNpZHJ2NDoiSVB2NC1zcGVrdHJ1bSIsY2lkcnY2OiJJUHY2LXNwZWt0cnVtIixiYXNlNjQ6ImJhc2U2NC1rb2RhZCBzdHLDpG5nIixiYXNlNjR1cmw6ImJhc2U2NHVybC1rb2RhZCBzdHLDpG5nIixqc29uX3N0cmluZzoiSlNPTi1zdHLDpG5nIixlMTY0OiJFLjE2NC1udW1tZXIiLGp3dDoiSldUIix0ZW1wbGF0ZV9saXRlcmFsOiJtYWxsLWxpdGVyYWwifSxvPXtuYW46Ik5hTiIsbnVtYmVyOiJhbnRhbCIsYXJyYXk6Imxpc3RhIn07cmV0dXJuIGU9Pntzd2l0Y2goZS5jb2RlKXtjYXNlImludmFsaWRfdHlwZSI6e2NvbnN0IGk9b1tlLmV4cGVjdGVkXT8/ZS5leHBlY3RlZCxhPXcoZS5pbnB1dCkscz1vW2FdPz9hO3JldHVybi9eW0EtWl0vLnRlc3QoZS5leHBlY3RlZCk/YE9naWx0aWcgaW5tYXRuaW5nOiBmw7ZydsOkbnRhdCBpbnN0YW5jZW9mICR7ZS5leHBlY3RlZH0sIGZpY2sgJHtzfWA6YE9naWx0aWcgaW5tYXRuaW5nOiBmw7ZydsOkbnRhdCAke2l9LCBmaWNrICR7c31gfWNhc2UiaW52YWxpZF92YWx1ZSI6cmV0dXJuIGUudmFsdWVzLmxlbmd0aD09PTE/YE9naWx0aWcgaW5tYXRuaW5nOiBmw7ZydsOkbnRhdCAke1MoZS52YWx1ZXNbMF0pfWA6YE9naWx0aWd0IHZhbDogZsO2cnbDpG50YWRlIGVuIGF2ICR7XyhlLnZhbHVlcywifCIpfWA7Y2FzZSJ0b29fYmlnIjp7Y29uc3QgaT1lLmluY2x1c2l2ZT8iPD0iOiI8IixhPW4oZS5vcmlnaW4pO3JldHVybiBhP2BGw7ZyIHN0b3IodCk6IGbDtnJ2w6RudGFkZSAke2Uub3JpZ2luPz8idsOkcmRldCJ9IGF0dCBoYSAke2l9JHtlLm1heGltdW0udG9TdHJpbmcoKX0gJHthLnVuaXQ/PyJlbGVtZW50In1gOmBGw7ZyIHN0b3IodCk6IGbDtnJ2w6RudGF0ICR7ZS5vcmlnaW4/PyJ2w6RyZGV0In0gYXR0IGhhICR7aX0ke2UubWF4aW11bS50b1N0cmluZygpfWB9Y2FzZSJ0b29fc21hbGwiOntjb25zdCBpPWUuaW5jbHVzaXZlPyI+PSI6Ij4iLGE9bihlLm9yaWdpbik7cmV0dXJuIGE/YEbDtnIgbGl0ZSh0KTogZsO2cnbDpG50YWRlICR7ZS5vcmlnaW4/PyJ2w6RyZGV0In0gYXR0IGhhICR7aX0ke2UubWluaW11bS50b1N0cmluZygpfSAke2EudW5pdH1gOmBGw7ZyIGxpdGUodCk6IGbDtnJ2w6RudGFkZSAke2Uub3JpZ2luPz8idsOkcmRldCJ9IGF0dCBoYSAke2l9JHtlLm1pbmltdW0udG9TdHJpbmcoKX1gfWNhc2UiaW52YWxpZF9mb3JtYXQiOntjb25zdCBpPWU7cmV0dXJuIGkuZm9ybWF0PT09InN0YXJ0c193aXRoIj9gT2dpbHRpZyBzdHLDpG5nOiBtw6VzdGUgYsO2cmphIG1lZCAiJHtpLnByZWZpeH0iYDppLmZvcm1hdD09PSJlbmRzX3dpdGgiP2BPZ2lsdGlnIHN0csOkbmc6IG3DpXN0ZSBzbHV0YSBtZWQgIiR7aS5zdWZmaXh9ImA6aS5mb3JtYXQ9PT0iaW5jbHVkZXMiP2BPZ2lsdGlnIHN0csOkbmc6IG3DpXN0ZSBpbm5laMOlbGxhICIke2kuaW5jbHVkZXN9ImA6aS5mb3JtYXQ9PT0icmVnZXgiP2BPZ2lsdGlnIHN0csOkbmc6IG3DpXN0ZSBtYXRjaGEgbcO2bnN0cmV0ICIke2kucGF0dGVybn0iYDpgT2dpbHRpZyh0KSAke3JbaS5mb3JtYXRdPz9lLmZvcm1hdH1gfWNhc2Uibm90X211bHRpcGxlX29mIjpyZXR1cm5gT2dpbHRpZ3QgdGFsOiBtw6VzdGUgdmFyYSBlbiBtdWx0aXBlbCBhdiAke2UuZGl2aXNvcn1gO2Nhc2UidW5yZWNvZ25pemVkX2tleXMiOnJldHVybmAke2Uua2V5cy5sZW5ndGg+MT8iT2vDpG5kYSBueWNrbGFyIjoiT2vDpG5kIG55Y2tlbCJ9OiAke18oZS5rZXlzLCIsICIpfWA7Y2FzZSJpbnZhbGlkX2tleSI6cmV0dXJuYE9naWx0aWcgbnlja2VsIGkgJHtlLm9yaWdpbj8/InbDpHJkZXQifWA7Y2FzZSJpbnZhbGlkX3VuaW9uIjpyZXR1cm4iT2dpbHRpZyBpbnB1dCI7Y2FzZSJpbnZhbGlkX2VsZW1lbnQiOnJldHVybmBPZ2lsdGlndCB2w6RyZGUgaSAke2Uub3JpZ2luPz8idsOkcmRldCJ9YDtkZWZhdWx0OnJldHVybiJPZ2lsdGlnIGlucHV0In19fTtmdW5jdGlvbiBjZygpe3JldHVybntsb2NhbGVFcnJvcjpzZygpfX1jb25zdCB1Zz0oKT0+e2NvbnN0IHQ9e3N0cmluZzp7dW5pdDoi4K6O4K604K+B4K6k4K+N4K6k4K+B4K6V4K+N4K6V4K6z4K+NIix2ZXJiOiLgrpXgr4rgrqPgr43grp/grr/grrDgr4HgrpXgr43grpUg4K614K+H4K6j4K+N4K6f4K+B4K6u4K+NIn0sZmlsZTp7dW5pdDoi4K6q4K+I4K6f4K+N4K6f4K+B4K6V4K6z4K+NIix2ZXJiOiLgrpXgr4rgrqPgr43grp/grr/grrDgr4HgrpXgr43grpUg4K614K+H4K6j4K+N4K6f4K+B4K6u4K+NIn0sYXJyYXk6e3VuaXQ6IuCuieCuseCvgeCuquCvjeCuquCvgeCuleCus+CvjSIsdmVyYjoi4K6V4K+K4K6j4K+N4K6f4K6/4K6w4K+B4K6V4K+N4K6VIOCuteCvh+Cuo+CvjeCun+CvgeCuruCvjSJ9LHNldDp7dW5pdDoi4K6J4K6x4K+B4K6q4K+N4K6q4K+B4K6V4K6z4K+NIix2ZXJiOiLgrpXgr4rgrqPgr43grp/grr/grrDgr4HgrpXgr43grpUg4K614K+H4K6j4K+N4K6f4K+B4K6u4K+NIn19O2Z1bmN0aW9uIG4oZSl7cmV0dXJuIHRbZV0/P251bGx9Y29uc3Qgcj17cmVnZXg6IuCuieCus+CvjeCus+CvgOCun+CvgSIsZW1haWw6IuCuruCuv+CuqeCvjeCuqeCunuCvjeCumuCusuCvjSDgrq7gr4HgrpXgrrXgrrDgrr8iLHVybDoiVVJMIixlbW9qaToiZW1vamkiLHV1aWQ6IlVVSUQiLHV1aWR2NDoiVVVJRHY0Iix1dWlkdjY6IlVVSUR2NiIsbmFub2lkOiJuYW5vaWQiLGd1aWQ6IkdVSUQiLGN1aWQ6ImN1aWQiLGN1aWQyOiJjdWlkMiIsdWxpZDoiVUxJRCIseGlkOiJYSUQiLGtzdWlkOiJLU1VJRCIsZGF0ZXRpbWU6IklTTyDgrqTgr4fgrqTgrr8g4K6o4K+H4K6w4K6u4K+NIixkYXRlOiJJU08g4K6k4K+H4K6k4K6/Iix0aW1lOiJJU08g4K6o4K+H4K6w4K6u4K+NIixkdXJhdGlvbjoiSVNPIOCuleCuvuCusiDgroXgrrPgrrXgr4EiLGlwdjQ6IklQdjQg4K6u4K+B4K6V4K614K6w4K6/IixpcHY2OiJJUHY2IOCuruCvgeCuleCuteCusOCuvyIsY2lkcnY0OiJJUHY0IOCuteCusOCuruCvjeCuquCvgSIsY2lkcnY2OiJJUHY2IOCuteCusOCuruCvjeCuquCvgSIsYmFzZTY0OiJiYXNlNjQtZW5jb2RlZCDgrprgrrDgrq7gr40iLGJhc2U2NHVybDoiYmFzZTY0dXJsLWVuY29kZWQg4K6a4K6w4K6u4K+NIixqc29uX3N0cmluZzoiSlNPTiDgrprgrrDgrq7gr40iLGUxNjQ6IkUuMTY0IOCujuCuo+CvjSIsand0OiJKV1QiLHRlbXBsYXRlX2xpdGVyYWw6ImlucHV0In0sbz17bmFuOiJOYU4iLG51bWJlcjoi4K6O4K6j4K+NIixhcnJheToi4K6F4K6j4K6/IixudWxsOiLgrrXgr4bgrrHgr4Hgrq7gr4gifTtyZXR1cm4gZT0+e3N3aXRjaChlLmNvZGUpe2Nhc2UiaW52YWxpZF90eXBlIjp7Y29uc3QgaT1vW2UuZXhwZWN0ZWRdPz9lLmV4cGVjdGVkLGE9dyhlLmlucHV0KSxzPW9bYV0/P2E7cmV0dXJuL15bQS1aXS8udGVzdChlLmV4cGVjdGVkKT9g4K6k4K614K6x4K6+4K6pIOCuieCus+CvjeCus+CvgOCun+CvgTog4K6O4K6k4K6/4K6w4K+N4K6q4K6+4K6w4K+N4K6V4K+N4K6V4K6q4K+N4K6q4K6f4K+N4K6f4K6k4K+BIGluc3RhbmNlb2YgJHtlLmV4cGVjdGVkfSwg4K6q4K+G4K6x4K6q4K+N4K6q4K6f4K+N4K6f4K6k4K+BICR7c31gOmDgrqTgrrXgrrHgrr7grqkg4K6J4K6z4K+N4K6z4K+A4K6f4K+BOiDgro7grqTgrr/grrDgr43grqrgrr7grrDgr43grpXgr43grpXgrqrgr43grqrgrp/gr43grp/grqTgr4EgJHtpfSwg4K6q4K+G4K6x4K6q4K+N4K6q4K6f4K+N4K6f4K6k4K+BICR7c31gfWNhc2UiaW52YWxpZF92YWx1ZSI6cmV0dXJuIGUudmFsdWVzLmxlbmd0aD09PTE/YOCupOCuteCuseCuvuCuqSDgrongrrPgr43grrPgr4Dgrp/gr4E6IOCujuCupOCuv+CusOCvjeCuquCuvuCusOCvjeCuleCvjeCuleCuquCvjeCuquCun+CvjeCun+CupOCvgSAke1MoZS52YWx1ZXNbMF0pfWA6YOCupOCuteCuseCuvuCuqSDgrrXgrr/grrDgr4Hgrqrgr43grqrgrq7gr406IOCujuCupOCuv+CusOCvjeCuquCuvuCusOCvjeCuleCvjeCuleCuquCvjeCuquCun+CvjeCun+CupOCvgSAke18oZS52YWx1ZXMsInwiKX0g4K6H4K6y4K+NIOCukuCuqeCvjeCuseCvgWA7Y2FzZSJ0b29fYmlnIjp7Y29uc3QgaT1lLmluY2x1c2l2ZT8iPD0iOiI8IixhPW4oZS5vcmlnaW4pO3JldHVybiBhP2Dgrq7grr/grpUg4K6q4K+G4K6w4K6/4K6v4K6k4K+BOiDgro7grqTgrr/grrDgr43grqrgrr7grrDgr43grpXgr43grpXgrqrgr43grqrgrp/gr43grp/grqTgr4EgJHtlLm9yaWdpbj8/IuCuruCupOCuv+CuquCvjeCuquCvgSJ9ICR7aX0ke2UubWF4aW11bS50b1N0cmluZygpfSAke2EudW5pdD8/IuCuieCuseCvgeCuquCvjeCuquCvgeCuleCus+CvjSJ9IOCuhuCulSDgrofgrrDgr4HgrpXgr43grpUg4K614K+H4K6j4K+N4K6f4K+B4K6u4K+NYDpg4K6u4K6/4K6VIOCuquCvhuCusOCuv+Cur+CupOCvgTog4K6O4K6k4K6/4K6w4K+N4K6q4K6+4K6w4K+N4K6V4K+N4K6V4K6q4K+N4K6q4K6f4K+N4K6f4K6k4K+BICR7ZS5vcmlnaW4/PyLgrq7grqTgrr/grqrgr43grqrgr4EifSAke2l9JHtlLm1heGltdW0udG9TdHJpbmcoKX0g4K6G4K6VIOCuh+CusOCvgeCuleCvjeCulSDgrrXgr4fgrqPgr43grp/gr4Hgrq7gr41gfWNhc2UidG9vX3NtYWxsIjp7Y29uc3QgaT1lLmluY2x1c2l2ZT8iPj0iOiI+IixhPW4oZS5vcmlnaW4pO3JldHVybiBhP2Dgrq7grr/grpXgrprgr40g4K6a4K6/4K6x4K6/4K6v4K6k4K+BOiDgro7grqTgrr/grrDgr43grqrgrr7grrDgr43grpXgr43grpXgrqrgr43grqrgrp/gr43grp/grqTgr4EgJHtlLm9yaWdpbn0gJHtpfSR7ZS5taW5pbXVtLnRvU3RyaW5nKCl9ICR7YS51bml0fSDgrobgrpUg4K6H4K6w4K+B4K6V4K+N4K6VIOCuteCvh+Cuo+CvjeCun+CvgeCuruCvjWA6YOCuruCuv+CuleCumuCvjSDgrprgrr/grrHgrr/grq/grqTgr4E6IOCujuCupOCuv+CusOCvjeCuquCuvuCusOCvjeCuleCvjeCuleCuquCvjeCuquCun+CvjeCun+CupOCvgSAke2Uub3JpZ2lufSAke2l9JHtlLm1pbmltdW0udG9TdHJpbmcoKX0g4K6G4K6VIOCuh+CusOCvgeCuleCvjeCulSDgrrXgr4fgrqPgr43grp/gr4Hgrq7gr41gfWNhc2UiaW52YWxpZF9mb3JtYXQiOntjb25zdCBpPWU7cmV0dXJuIGkuZm9ybWF0PT09InN0YXJ0c193aXRoIj9g4K6k4K614K6x4K6+4K6pIOCumuCusOCuruCvjTogIiR7aS5wcmVmaXh9IiDgrofgrrLgr40g4K6k4K+K4K6f4K6Z4K+N4K6VIOCuteCvh+Cuo+CvjeCun+CvgeCuruCvjWA6aS5mb3JtYXQ9PT0iZW5kc193aXRoIj9g4K6k4K614K6x4K6+4K6pIOCumuCusOCuruCvjTogIiR7aS5zdWZmaXh9IiDgrofgrrLgr40g4K6u4K+B4K6f4K6/4K614K6f4K+I4K6vIOCuteCvh+Cuo+CvjeCun+CvgeCuruCvjWA6aS5mb3JtYXQ9PT0iaW5jbHVkZXMiP2DgrqTgrrXgrrHgrr7grqkg4K6a4K6w4K6u4K+NOiAiJHtpLmluY2x1ZGVzfSIg4K6QIOCuieCus+CvjeCus+Cun+CuleCvjeCulSDgrrXgr4fgrqPgr43grp/gr4Hgrq7gr41gOmkuZm9ybWF0PT09InJlZ2V4Ij9g4K6k4K614K6x4K6+4K6pIOCumuCusOCuruCvjTogJHtpLnBhdHRlcm59IOCuruCvgeCuseCviOCuquCuvuCun+CvjeCun+CvgeCun+CuqeCvjSDgrqrgr4rgrrDgr4Hgrqjgr43grqQg4K614K+H4K6j4K+N4K6f4K+B4K6u4K+NYDpg4K6k4K614K6x4K6+4K6pICR7cltpLmZvcm1hdF0/P2UuZm9ybWF0fWB9Y2FzZSJub3RfbXVsdGlwbGVfb2YiOnJldHVybmDgrqTgrrXgrrHgrr7grqkg4K6O4K6j4K+NOiAke2UuZGl2aXNvcn0g4K6H4K6p4K+NIOCuquCusuCuruCuvuCulSDgrofgrrDgr4HgrpXgr43grpUg4K614K+H4K6j4K+N4K6f4K+B4K6u4K+NYDtjYXNlInVucmVjb2duaXplZF9rZXlzIjpyZXR1cm5g4K6F4K6f4K+I4K6v4K6+4K6z4K6u4K+NIOCupOCvhuCusOCuv+Cur+CuvuCupCDgrrXgrr/grprgr4gke2Uua2V5cy5sZW5ndGg+MT8i4K6V4K6z4K+NIjoiIn06ICR7XyhlLmtleXMsIiwgIil9YDtjYXNlImludmFsaWRfa2V5IjpyZXR1cm5gJHtlLm9yaWdpbn0g4K6H4K6y4K+NIOCupOCuteCuseCuvuCuqSDgrrXgrr/grprgr4hgO2Nhc2UiaW52YWxpZF91bmlvbiI6cmV0dXJuIuCupOCuteCuseCuvuCuqSDgrongrrPgr43grrPgr4Dgrp/gr4EiO2Nhc2UiaW52YWxpZF9lbGVtZW50IjpyZXR1cm5gJHtlLm9yaWdpbn0g4K6H4K6y4K+NIOCupOCuteCuseCuvuCuqSDgrq7grqTgrr/grqrgr43grqrgr4FgO2RlZmF1bHQ6cmV0dXJuIuCupOCuteCuseCuvuCuqSDgrongrrPgr43grrPgr4Dgrp/gr4EifX19O2Z1bmN0aW9uIGxnKCl7cmV0dXJue2xvY2FsZUVycm9yOnVnKCl9fWNvbnN0IGRnPSgpPT57Y29uc3QgdD17c3RyaW5nOnt1bml0OiLguJXguLHguKfguK3guLHguIHguKnguKMiLHZlcmI6IuC4hOC4p+C4o+C4oeC4tSJ9LGZpbGU6e3VuaXQ6IuC5hOC4muC4leC5jCIsdmVyYjoi4LiE4Lin4Lij4Lih4Li1In0sYXJyYXk6e3VuaXQ6IuC4o+C4suC4ouC4geC4suC4oyIsdmVyYjoi4LiE4Lin4Lij4Lih4Li1In0sc2V0Ont1bml0OiLguKPguLLguKLguIHguLLguKMiLHZlcmI6IuC4hOC4p+C4o+C4oeC4tSJ9fTtmdW5jdGlvbiBuKGUpe3JldHVybiB0W2VdPz9udWxsfWNvbnN0IHI9e3JlZ2V4OiLguILguYnguK3guKHguLnguKXguJfguLXguYjguJvguYnguK3guJkiLGVtYWlsOiLguJfguLXguYjguK3guKLguLnguYjguK3guLXguYDguKHguKUiLHVybDoiVVJMIixlbW9qaToi4Lit4Li04LmC4Lih4LiI4Li0Iix1dWlkOiJVVUlEIix1dWlkdjQ6IlVVSUR2NCIsdXVpZHY2OiJVVUlEdjYiLG5hbm9pZDoibmFub2lkIixndWlkOiJHVUlEIixjdWlkOiJjdWlkIixjdWlkMjoiY3VpZDIiLHVsaWQ6IlVMSUQiLHhpZDoiWElEIixrc3VpZDoiS1NVSUQiLGRhdGV0aW1lOiLguKfguLHguJnguJfguLXguYjguYDguKfguKXguLLguYHguJrguJogSVNPIixkYXRlOiLguKfguLHguJnguJfguLXguYjguYHguJrguJogSVNPIix0aW1lOiLguYDguKfguKXguLLguYHguJrguJogSVNPIixkdXJhdGlvbjoi4LiK4LmI4Lin4LiH4LmA4Lin4Lil4Liy4LmB4Lia4LiaIElTTyIsaXB2NDoi4LiX4Li14LmI4Lit4Lii4Li54LmIIElQdjQiLGlwdjY6IuC4l+C4teC5iOC4reC4ouC4ueC5iCBJUHY2IixjaWRydjQ6IuC4iuC5iOC4p+C4hyBJUCDguYHguJrguJogSVB2NCIsY2lkcnY2OiLguIrguYjguKfguIcgSVAg4LmB4Lia4LiaIElQdjYiLGJhc2U2NDoi4LiC4LmJ4Lit4LiE4Lin4Liy4Lih4LmB4Lia4LiaIEJhc2U2NCIsYmFzZTY0dXJsOiLguILguYnguK3guITguKfguLLguKHguYHguJrguJogQmFzZTY0IOC4quC4s+C4q+C4o+C4seC4miBVUkwiLGpzb25fc3RyaW5nOiLguILguYnguK3guITguKfguLLguKHguYHguJrguJogSlNPTiIsZTE2NDoi4LmA4Lia4Lit4Lij4LmM4LmC4LiX4Lij4Lio4Lix4Lie4LiX4LmM4Lij4Liw4Lir4Lin4LmI4Liy4LiH4Lib4Lij4Liw4LmA4LiX4LioIChFLjE2NCkiLGp3dDoi4LmC4LiX4LmA4LiE4LiZIEpXVCIsdGVtcGxhdGVfbGl0ZXJhbDoi4LiC4LmJ4Lit4Lih4Li54Lil4LiX4Li14LmI4Lib4LmJ4Lit4LiZIn0sbz17bmFuOiJOYU4iLG51bWJlcjoi4LiV4Lix4Lin4LmA4Lil4LiCIixhcnJheToi4Lit4Liy4Lij4LmM4LmA4Lij4Lii4LmMIChBcnJheSkiLG51bGw6IuC5hOC4oeC5iOC4oeC4teC4hOC5iOC4siAobnVsbCkifTtyZXR1cm4gZT0+e3N3aXRjaChlLmNvZGUpe2Nhc2UiaW52YWxpZF90eXBlIjp7Y29uc3QgaT1vW2UuZXhwZWN0ZWRdPz9lLmV4cGVjdGVkLGE9dyhlLmlucHV0KSxzPW9bYV0/P2E7cmV0dXJuL15bQS1aXS8udGVzdChlLmV4cGVjdGVkKT9g4Lib4Lij4Liw4LmA4Lig4LiX4LiC4LmJ4Lit4Lih4Li54Lil4LmE4Lih4LmI4LiW4Li54LiB4LiV4LmJ4Lit4LiHOiDguITguKfguKPguYDguJvguYfguJkgaW5zdGFuY2VvZiAke2UuZXhwZWN0ZWR9IOC5geC4leC5iOC5hOC4lOC5ieC4o+C4seC4miAke3N9YDpg4Lib4Lij4Liw4LmA4Lig4LiX4LiC4LmJ4Lit4Lih4Li54Lil4LmE4Lih4LmI4LiW4Li54LiB4LiV4LmJ4Lit4LiHOiDguITguKfguKPguYDguJvguYfguJkgJHtpfSDguYHguJXguYjguYTguJTguYnguKPguLHguJogJHtzfWB9Y2FzZSJpbnZhbGlkX3ZhbHVlIjpyZXR1cm4gZS52YWx1ZXMubGVuZ3RoPT09MT9g4LiE4LmI4Liy4LmE4Lih4LmI4LiW4Li54LiB4LiV4LmJ4Lit4LiHOiDguITguKfguKPguYDguJvguYfguJkgJHtTKGUudmFsdWVzWzBdKX1gOmDguJXguLHguKfguYDguKXguLfguK3guIHguYTguKHguYjguJbguLnguIHguJXguYnguK3guIc6IOC4hOC4p+C4o+C5gOC4m+C5h+C4meC4q+C4meC4tuC5iOC4h+C5g+C4mSAke18oZS52YWx1ZXMsInwiKX1gO2Nhc2UidG9vX2JpZyI6e2NvbnN0IGk9ZS5pbmNsdXNpdmU/IuC5hOC4oeC5iOC5gOC4geC4tOC4mSI6IuC4meC5ieC4reC4ouC4geC4p+C5iOC4siIsYT1uKGUub3JpZ2luKTtyZXR1cm4gYT9g4LmA4LiB4Li04LiZ4LiB4Liz4Lir4LiZ4LiUOiAke2Uub3JpZ2luPz8i4LiE4LmI4LiyIn0g4LiE4Lin4Lij4Lih4Li1JHtpfSAke2UubWF4aW11bS50b1N0cmluZygpfSAke2EudW5pdD8/IuC4o+C4suC4ouC4geC4suC4oyJ9YDpg4LmA4LiB4Li04LiZ4LiB4Liz4Lir4LiZ4LiUOiAke2Uub3JpZ2luPz8i4LiE4LmI4LiyIn0g4LiE4Lin4Lij4Lih4Li1JHtpfSAke2UubWF4aW11bS50b1N0cmluZygpfWB9Y2FzZSJ0b29fc21hbGwiOntjb25zdCBpPWUuaW5jbHVzaXZlPyLguK3guKLguYjguLLguIfguJnguYnguK3guKIiOiLguKHguLLguIHguIHguKfguYjguLIiLGE9bihlLm9yaWdpbik7cmV0dXJuIGE/YOC4meC5ieC4reC4ouC4geC4p+C5iOC4suC4geC4s+C4q+C4meC4lDogJHtlLm9yaWdpbn0g4LiE4Lin4Lij4Lih4Li1JHtpfSAke2UubWluaW11bS50b1N0cmluZygpfSAke2EudW5pdH1gOmDguJnguYnguK3guKLguIHguKfguYjguLLguIHguLPguKvguJnguJQ6ICR7ZS5vcmlnaW59IOC4hOC4p+C4o+C4oeC4tSR7aX0gJHtlLm1pbmltdW0udG9TdHJpbmcoKX1gfWNhc2UiaW52YWxpZF9mb3JtYXQiOntjb25zdCBpPWU7cmV0dXJuIGkuZm9ybWF0PT09InN0YXJ0c193aXRoIj9g4Lij4Li54Lib4LmB4Lia4Lia4LmE4Lih4LmI4LiW4Li54LiB4LiV4LmJ4Lit4LiHOiDguILguYnguK3guITguKfguLLguKHguJXguYnguK3guIfguILguLbguYnguJnguJXguYnguJnguJTguYnguKfguKIgIiR7aS5wcmVmaXh9ImA6aS5mb3JtYXQ9PT0iZW5kc193aXRoIj9g4Lij4Li54Lib4LmB4Lia4Lia4LmE4Lih4LmI4LiW4Li54LiB4LiV4LmJ4Lit4LiHOiDguILguYnguK3guITguKfguLLguKHguJXguYnguK3guIfguKXguIfguJfguYnguLLguKLguJTguYnguKfguKIgIiR7aS5zdWZmaXh9ImA6aS5mb3JtYXQ9PT0iaW5jbHVkZXMiP2DguKPguLnguJvguYHguJrguJrguYTguKHguYjguJbguLnguIHguJXguYnguK3guIc6IOC4guC5ieC4reC4hOC4p+C4suC4oeC4leC5ieC4reC4h+C4oeC4tSAiJHtpLmluY2x1ZGVzfSIg4Lit4Lii4Li54LmI4LmD4LiZ4LiC4LmJ4Lit4LiE4Lin4Liy4LihYDppLmZvcm1hdD09PSJyZWdleCI/YOC4o+C4ueC4m+C5geC4muC4muC5hOC4oeC5iOC4luC4ueC4geC4leC5ieC4reC4hzog4LiV4LmJ4Lit4LiH4LiV4Lij4LiH4LiB4Lix4Lia4Lij4Li54Lib4LmB4Lia4Lia4LiX4Li14LmI4LiB4Liz4Lir4LiZ4LiUICR7aS5wYXR0ZXJufWA6YOC4o+C4ueC4m+C5geC4muC4muC5hOC4oeC5iOC4luC4ueC4geC4leC5ieC4reC4hzogJHtyW2kuZm9ybWF0XT8/ZS5mb3JtYXR9YH1jYXNlIm5vdF9tdWx0aXBsZV9vZiI6cmV0dXJuYOC4leC4seC4p+C5gOC4peC4guC5hOC4oeC5iOC4luC4ueC4geC4leC5ieC4reC4hzog4LiV4LmJ4Lit4LiH4LmA4Lib4LmH4LiZ4LiI4Liz4LiZ4Lin4LiZ4LiX4Li14LmI4Lir4Liy4Lij4LiU4LmJ4Lin4LiiICR7ZS5kaXZpc29yfSDguYTguJTguYnguKXguIfguJXguLHguKdgO2Nhc2UidW5yZWNvZ25pemVkX2tleXMiOnJldHVybmDguJ7guJrguITguLXguKLguYzguJfguLXguYjguYTguKHguYjguKPguLnguYnguIjguLHguIE6ICR7XyhlLmtleXMsIiwgIil9YDtjYXNlImludmFsaWRfa2V5IjpyZXR1cm5g4LiE4Li14Lii4LmM4LmE4Lih4LmI4LiW4Li54LiB4LiV4LmJ4Lit4LiH4LmD4LiZICR7ZS5vcmlnaW59YDtjYXNlImludmFsaWRfdW5pb24iOnJldHVybiLguILguYnguK3guKHguLnguKXguYTguKHguYjguJbguLnguIHguJXguYnguK3guIc6IOC5hOC4oeC5iOC4leC4o+C4h+C4geC4seC4muC4o+C4ueC4m+C5geC4muC4muC4ouC4ueC5gOC4meC4teC4ouC4meC4l+C4teC5iOC4geC4s+C4q+C4meC4lOC5hOC4p+C5iSI7Y2FzZSJpbnZhbGlkX2VsZW1lbnQiOnJldHVybmDguILguYnguK3guKHguLnguKXguYTguKHguYjguJbguLnguIHguJXguYnguK3guIfguYPguJkgJHtlLm9yaWdpbn1gO2RlZmF1bHQ6cmV0dXJuIuC4guC5ieC4reC4oeC4ueC4peC5hOC4oeC5iOC4luC4ueC4geC4leC5ieC4reC4hyJ9fX07ZnVuY3Rpb24gbWcoKXtyZXR1cm57bG9jYWxlRXJyb3I6ZGcoKX19Y29uc3QgcGc9KCk9Pntjb25zdCB0PXtzdHJpbmc6e3VuaXQ6ImthcmFrdGVyIix2ZXJiOiJvbG1hbMSxIn0sZmlsZTp7dW5pdDoiYmF5dCIsdmVyYjoib2xtYWzEsSJ9LGFycmF5Ont1bml0OiLDtsSfZSIsdmVyYjoib2xtYWzEsSJ9LHNldDp7dW5pdDoiw7bEn2UiLHZlcmI6Im9sbWFsxLEifX07ZnVuY3Rpb24gbihlKXtyZXR1cm4gdFtlXT8/bnVsbH1jb25zdCByPXtyZWdleDoiZ2lyZGkiLGVtYWlsOiJlLXBvc3RhIGFkcmVzaSIsdXJsOiJVUkwiLGVtb2ppOiJlbW9qaSIsdXVpZDoiVVVJRCIsdXVpZHY0OiJVVUlEdjQiLHV1aWR2NjoiVVVJRHY2IixuYW5vaWQ6Im5hbm9pZCIsZ3VpZDoiR1VJRCIsY3VpZDoiY3VpZCIsY3VpZDI6ImN1aWQyIix1bGlkOiJVTElEIix4aWQ6IlhJRCIsa3N1aWQ6IktTVUlEIixkYXRldGltZToiSVNPIHRhcmloIHZlIHNhYXQiLGRhdGU6IklTTyB0YXJpaCIsdGltZToiSVNPIHNhYXQiLGR1cmF0aW9uOiJJU08gc8O8cmUiLGlwdjQ6IklQdjQgYWRyZXNpIixpcHY2OiJJUHY2IGFkcmVzaSIsY2lkcnY0OiJJUHY0IGFyYWzEscSfxLEiLGNpZHJ2NjoiSVB2NiBhcmFsxLHEn8SxIixiYXNlNjQ6ImJhc2U2NCBpbGUgxZ9pZnJlbGVubWnFnyBtZXRpbiIsYmFzZTY0dXJsOiJiYXNlNjR1cmwgaWxlIMWfaWZyZWxlbm1pxZ8gbWV0aW4iLGpzb25fc3RyaW5nOiJKU09OIGRpemVzaSIsZTE2NDoiRS4xNjQgc2F5xLFzxLEiLGp3dDoiSldUIix0ZW1wbGF0ZV9saXRlcmFsOiLFnmFibG9uIGRpemVzaSJ9LG89e25hbjoiTmFOIn07cmV0dXJuIGU9Pntzd2l0Y2goZS5jb2RlKXtjYXNlImludmFsaWRfdHlwZSI6e2NvbnN0IGk9b1tlLmV4cGVjdGVkXT8/ZS5leHBlY3RlZCxhPXcoZS5pbnB1dCkscz1vW2FdPz9hO3JldHVybi9eW0EtWl0vLnRlc3QoZS5leHBlY3RlZCk/YEdlw6dlcnNpeiBkZcSfZXI6IGJla2xlbmVuIGluc3RhbmNlb2YgJHtlLmV4cGVjdGVkfSwgYWzEsW5hbiAke3N9YDpgR2XDp2Vyc2l6IGRlxJ9lcjogYmVrbGVuZW4gJHtpfSwgYWzEsW5hbiAke3N9YH1jYXNlImludmFsaWRfdmFsdWUiOnJldHVybiBlLnZhbHVlcy5sZW5ndGg9PT0xP2BHZcOnZXJzaXogZGXEn2VyOiBiZWtsZW5lbiAke1MoZS52YWx1ZXNbMF0pfWA6YEdlw6dlcnNpeiBzZcOnZW5lazogYcWfYcSfxLFkYWtpbGVyZGVuIGJpcmkgb2xtYWzEsTogJHtfKGUudmFsdWVzLCJ8Iil9YDtjYXNlInRvb19iaWciOntjb25zdCBpPWUuaW5jbHVzaXZlPyI8PSI6IjwiLGE9bihlLm9yaWdpbik7cmV0dXJuIGE/YMOHb2sgYsO8ecO8azogYmVrbGVuZW4gJHtlLm9yaWdpbj8/ImRlxJ9lciJ9ICR7aX0ke2UubWF4aW11bS50b1N0cmluZygpfSAke2EudW5pdD8/IsO2xJ9lIn1gOmDDh29rIGLDvHnDvGs6IGJla2xlbmVuICR7ZS5vcmlnaW4/PyJkZcSfZXIifSAke2l9JHtlLm1heGltdW0udG9TdHJpbmcoKX1gfWNhc2UidG9vX3NtYWxsIjp7Y29uc3QgaT1lLmluY2x1c2l2ZT8iPj0iOiI+IixhPW4oZS5vcmlnaW4pO3JldHVybiBhP2DDh29rIGvDvMOnw7xrOiBiZWtsZW5lbiAke2Uub3JpZ2lufSAke2l9JHtlLm1pbmltdW0udG9TdHJpbmcoKX0gJHthLnVuaXR9YDpgw4dvayBrw7zDp8O8azogYmVrbGVuZW4gJHtlLm9yaWdpbn0gJHtpfSR7ZS5taW5pbXVtLnRvU3RyaW5nKCl9YH1jYXNlImludmFsaWRfZm9ybWF0Ijp7Y29uc3QgaT1lO3JldHVybiBpLmZvcm1hdD09PSJzdGFydHNfd2l0aCI/YEdlw6dlcnNpeiBtZXRpbjogIiR7aS5wcmVmaXh9IiBpbGUgYmHFn2xhbWFsxLFgOmkuZm9ybWF0PT09ImVuZHNfd2l0aCI/YEdlw6dlcnNpeiBtZXRpbjogIiR7aS5zdWZmaXh9IiBpbGUgYml0bWVsaWA6aS5mb3JtYXQ9PT0iaW5jbHVkZXMiP2BHZcOnZXJzaXogbWV0aW46ICIke2kuaW5jbHVkZXN9IiBpw6dlcm1lbGlgOmkuZm9ybWF0PT09InJlZ2V4Ij9gR2XDp2Vyc2l6IG1ldGluOiAke2kucGF0dGVybn0gZGVzZW5pbmUgdXltYWzEsWA6YEdlw6dlcnNpeiAke3JbaS5mb3JtYXRdPz9lLmZvcm1hdH1gfWNhc2Uibm90X211bHRpcGxlX29mIjpyZXR1cm5gR2XDp2Vyc2l6IHNhecSxOiAke2UuZGl2aXNvcn0gaWxlIHRhbSBiw7Zsw7xuZWJpbG1lbGlgO2Nhc2UidW5yZWNvZ25pemVkX2tleXMiOnJldHVybmBUYW7EsW5tYXlhbiBhbmFodGFyJHtlLmtleXMubGVuZ3RoPjE/ImxhciI6IiJ9OiAke18oZS5rZXlzLCIsICIpfWA7Y2FzZSJpbnZhbGlkX2tleSI6cmV0dXJuYCR7ZS5vcmlnaW59IGnDp2luZGUgZ2XDp2Vyc2l6IGFuYWh0YXJgO2Nhc2UiaW52YWxpZF91bmlvbiI6cmV0dXJuIkdlw6dlcnNpeiBkZcSfZXIiO2Nhc2UiaW52YWxpZF9lbGVtZW50IjpyZXR1cm5gJHtlLm9yaWdpbn0gacOnaW5kZSBnZcOnZXJzaXogZGXEn2VyYDtkZWZhdWx0OnJldHVybiJHZcOnZXJzaXogZGXEn2VyIn19fTtmdW5jdGlvbiBmZygpe3JldHVybntsb2NhbGVFcnJvcjpwZygpfX1jb25zdCBnZz0oKT0+e2NvbnN0IHQ9e3N0cmluZzp7dW5pdDoi0YHQuNC80LLQvtC70ZbQsiIsdmVyYjoi0LzQsNGC0LjQvNC1In0sZmlsZTp7dW5pdDoi0LHQsNC50YLRltCyIix2ZXJiOiLQvNCw0YLQuNC80LUifSxhcnJheTp7dW5pdDoi0LXQu9C10LzQtdC90YLRltCyIix2ZXJiOiLQvNCw0YLQuNC80LUifSxzZXQ6e3VuaXQ6ItC10LvQtdC80LXQvdGC0ZbQsiIsdmVyYjoi0LzQsNGC0LjQvNC1In19O2Z1bmN0aW9uIG4oZSl7cmV0dXJuIHRbZV0/P251bGx9Y29uc3Qgcj17cmVnZXg6ItCy0YXRltC00L3RliDQtNCw0L3RliIsZW1haWw6ItCw0LTRgNC10YHQsCDQtdC70LXQutGC0YDQvtC90L3QvtGXINC/0L7RiNGC0LgiLHVybDoiVVJMIixlbW9qaToi0LXQvNC+0LTQt9GWIix1dWlkOiJVVUlEIix1dWlkdjQ6IlVVSUR2NCIsdXVpZHY2OiJVVUlEdjYiLG5hbm9pZDoibmFub2lkIixndWlkOiJHVUlEIixjdWlkOiJjdWlkIixjdWlkMjoiY3VpZDIiLHVsaWQ6IlVMSUQiLHhpZDoiWElEIixrc3VpZDoiS1NVSUQiLGRhdGV0aW1lOiLQtNCw0YLQsCDRgtCwINGH0LDRgSBJU08iLGRhdGU6ItC00LDRgtCwIElTTyIsdGltZToi0YfQsNGBIElTTyIsZHVyYXRpb246ItGC0YDQuNCy0LDQu9GW0YHRgtGMIElTTyIsaXB2NDoi0LDQtNGA0LXRgdCwIElQdjQiLGlwdjY6ItCw0LTRgNC10YHQsCBJUHY2IixjaWRydjQ6ItC00ZbQsNC/0LDQt9C+0L0gSVB2NCIsY2lkcnY2OiLQtNGW0LDQv9Cw0LfQvtC9IElQdjYiLGJhc2U2NDoi0YDRj9C00L7QuiDRgyDQutC+0LTRg9Cy0LDQvdC90ZYgYmFzZTY0IixiYXNlNjR1cmw6ItGA0Y/QtNC+0Log0YMg0LrQvtC00YPQstCw0L3QvdGWIGJhc2U2NHVybCIsanNvbl9zdHJpbmc6ItGA0Y/QtNC+0LogSlNPTiIsZTE2NDoi0L3QvtC80LXRgCBFLjE2NCIsand0OiJKV1QiLHRlbXBsYXRlX2xpdGVyYWw6ItCy0YXRltC00L3RliDQtNCw0L3RliJ9LG89e25hbjoiTmFOIixudW1iZXI6ItGH0LjRgdC70L4iLGFycmF5OiLQvNCw0YHQuNCyIn07cmV0dXJuIGU9Pntzd2l0Y2goZS5jb2RlKXtjYXNlImludmFsaWRfdHlwZSI6e2NvbnN0IGk9b1tlLmV4cGVjdGVkXT8/ZS5leHBlY3RlZCxhPXcoZS5pbnB1dCkscz1vW2FdPz9hO3JldHVybi9eW0EtWl0vLnRlc3QoZS5leHBlY3RlZCk/YNCd0LXQv9GA0LDQstC40LvRjNC90ZYg0LLRhdGW0LTQvdGWINC00LDQvdGWOiDQvtGH0ZbQutGD0ZTRgtGM0YHRjyBpbnN0YW5jZW9mICR7ZS5leHBlY3RlZH0sINC+0YLRgNC40LzQsNC90L4gJHtzfWA6YNCd0LXQv9GA0LDQstC40LvRjNC90ZYg0LLRhdGW0LTQvdGWINC00LDQvdGWOiDQvtGH0ZbQutGD0ZTRgtGM0YHRjyAke2l9LCDQvtGC0YDQuNC80LDQvdC+ICR7c31gfWNhc2UiaW52YWxpZF92YWx1ZSI6cmV0dXJuIGUudmFsdWVzLmxlbmd0aD09PTE/YNCd0LXQv9GA0LDQstC40LvRjNC90ZYg0LLRhdGW0LTQvdGWINC00LDQvdGWOiDQvtGH0ZbQutGD0ZTRgtGM0YHRjyAke1MoZS52YWx1ZXNbMF0pfWA6YNCd0LXQv9GA0LDQstC40LvRjNC90LAg0L7Qv9GG0ZbRjzog0L7Rh9GW0LrRg9GU0YLRjNGB0Y8g0L7QtNC90LUg0LcgJHtfKGUudmFsdWVzLCJ8Iil9YDtjYXNlInRvb19iaWciOntjb25zdCBpPWUuaW5jbHVzaXZlPyI8PSI6IjwiLGE9bihlLm9yaWdpbik7cmV0dXJuIGE/YNCX0LDQvdCw0LTRgtC+INCy0LXQu9C40LrQtTog0L7Rh9GW0LrRg9GU0YLRjNGB0Y8sINGJ0L4gJHtlLm9yaWdpbj8/ItC30L3QsNGH0LXQvdC90Y8ifSAke2EudmVyYn0gJHtpfSR7ZS5tYXhpbXVtLnRvU3RyaW5nKCl9ICR7YS51bml0Pz8i0LXQu9C10LzQtdC90YLRltCyIn1gOmDQl9Cw0L3QsNC00YLQviDQstC10LvQuNC60LU6INC+0YfRltC60YPRlNGC0YzRgdGPLCDRidC+ICR7ZS5vcmlnaW4/PyLQt9C90LDRh9C10L3QvdGPIn0g0LHRg9C00LUgJHtpfSR7ZS5tYXhpbXVtLnRvU3RyaW5nKCl9YH1jYXNlInRvb19zbWFsbCI6e2NvbnN0IGk9ZS5pbmNsdXNpdmU/Ij49IjoiPiIsYT1uKGUub3JpZ2luKTtyZXR1cm4gYT9g0JfQsNC90LDQtNGC0L4g0LzQsNC70LU6INC+0YfRltC60YPRlNGC0YzRgdGPLCDRidC+ICR7ZS5vcmlnaW59ICR7YS52ZXJifSAke2l9JHtlLm1pbmltdW0udG9TdHJpbmcoKX0gJHthLnVuaXR9YDpg0JfQsNC90LDQtNGC0L4g0LzQsNC70LU6INC+0YfRltC60YPRlNGC0YzRgdGPLCDRidC+ICR7ZS5vcmlnaW59INCx0YPQtNC1ICR7aX0ke2UubWluaW11bS50b1N0cmluZygpfWB9Y2FzZSJpbnZhbGlkX2Zvcm1hdCI6e2NvbnN0IGk9ZTtyZXR1cm4gaS5mb3JtYXQ9PT0ic3RhcnRzX3dpdGgiP2DQndC10L/RgNCw0LLQuNC70YzQvdC40Lkg0YDRj9C00L7Qujog0L/QvtCy0LjQvdC10L0g0L/QvtGH0LjQvdCw0YLQuNGB0Y8g0LcgIiR7aS5wcmVmaXh9ImA6aS5mb3JtYXQ9PT0iZW5kc193aXRoIj9g0J3QtdC/0YDQsNCy0LjQu9GM0L3QuNC5INGA0Y/QtNC+0Lo6INC/0L7QstC40L3QtdC9INC30LDQutGW0L3Rh9GD0LLQsNGC0LjRgdGPINC90LAgIiR7aS5zdWZmaXh9ImA6aS5mb3JtYXQ9PT0iaW5jbHVkZXMiP2DQndC10L/RgNCw0LLQuNC70YzQvdC40Lkg0YDRj9C00L7Qujog0L/QvtCy0LjQvdC10L0g0LzRltGB0YLQuNGC0LggIiR7aS5pbmNsdWRlc30iYDppLmZvcm1hdD09PSJyZWdleCI/YNCd0LXQv9GA0LDQstC40LvRjNC90LjQuSDRgNGP0LTQvtC6OiDQv9C+0LLQuNC90LXQvSDQstGW0LTQv9C+0LLRltC00LDRgtC4INGI0LDQsdC70L7QvdGDICR7aS5wYXR0ZXJufWA6YNCd0LXQv9GA0LDQstC40LvRjNC90LjQuSAke3JbaS5mb3JtYXRdPz9lLmZvcm1hdH1gfWNhc2Uibm90X211bHRpcGxlX29mIjpyZXR1cm5g0J3QtdC/0YDQsNCy0LjQu9GM0L3QtSDRh9C40YHQu9C+OiDQv9C+0LLQuNC90L3QviDQsdGD0YLQuCDQutGA0LDRgtC90LjQvCAke2UuZGl2aXNvcn1gO2Nhc2UidW5yZWNvZ25pemVkX2tleXMiOnJldHVybmDQndC10YDQvtC30L/RltC30L3QsNC90LjQuSDQutC70Y7RhyR7ZS5rZXlzLmxlbmd0aD4xPyLRliI6IiJ9OiAke18oZS5rZXlzLCIsICIpfWA7Y2FzZSJpbnZhbGlkX2tleSI6cmV0dXJuYNCd0LXQv9GA0LDQstC40LvRjNC90LjQuSDQutC70Y7RhyDRgyAke2Uub3JpZ2lufWA7Y2FzZSJpbnZhbGlkX3VuaW9uIjpyZXR1cm4i0J3QtdC/0YDQsNCy0LjQu9GM0L3RliDQstGF0ZbQtNC90ZYg0LTQsNC90ZYiO2Nhc2UiaW52YWxpZF9lbGVtZW50IjpyZXR1cm5g0J3QtdC/0YDQsNCy0LjQu9GM0L3QtSDQt9C90LDRh9C10L3QvdGPINGDICR7ZS5vcmlnaW59YDtkZWZhdWx0OnJldHVybiLQndC10L/RgNCw0LLQuNC70YzQvdGWINCy0YXRltC00L3RliDQtNCw0L3RliJ9fX07ZnVuY3Rpb24geGwoKXtyZXR1cm57bG9jYWxlRXJyb3I6Z2coKX19ZnVuY3Rpb24gdmcoKXtyZXR1cm4geGwoKX1jb25zdCBoZz0oKT0+e2NvbnN0IHQ9e3N0cmluZzp7dW5pdDoi2K3YsdmI2YEiLHZlcmI6ItuB2YjZhtinIn0sZmlsZTp7dW5pdDoi2KjYp9im2bnYsyIsdmVyYjoi24HZiNmG2KcifSxhcnJheTp7dW5pdDoi2KLYptm52YXYsiIsdmVyYjoi24HZiNmG2KcifSxzZXQ6e3VuaXQ6Itii2KbZudmF2LIiLHZlcmI6ItuB2YjZhtinIn19O2Z1bmN0aW9uIG4oZSl7cmV0dXJuIHRbZV0/P251bGx9Y29uc3Qgcj17cmVnZXg6Itin2YYg2b7ZuSIsZW1haWw6Itin24wg2YXbjNmEINin24zaiNix24zYsyIsdXJsOiLbjNmIINii2LEg2KfbjNmEIixlbW9qaToi2KfbjNmF2YjYrNuMIix1dWlkOiLbjNmIINuM2Ygg2KLYptuMINqI24wiLHV1aWR2NDoi24zZiCDbjNmIINii2KbbjCDaiNuMINmI24wgNCIsdXVpZHY2OiLbjNmIINuM2Ygg2KLYptuMINqI24wg2YjbjCA2IixuYW5vaWQ6ItmG24zZhtmIINii2KbbjCDaiNuMIixndWlkOiLYrNuMINuM2Ygg2KLYptuMINqI24wiLGN1aWQ6Itiz24wg24zZiCDYotim24wg2ojbjCIsY3VpZDI6Itiz24wg24zZiCDYotim24wg2ojbjCAyIix1bGlkOiLbjNmIINin24zZhCDYotim24wg2ojbjCIseGlkOiLYp9uM2qnYsyDYotim24wg2ojbjCIsa3N1aWQ6Itqp25Ig2KfbjNizINuM2Ygg2KLYptuMINqI24wiLGRhdGV0aW1lOiLYotim24wg2KfbjNizINin2Ygg2ojbjNm5INm52KfYptmFIixkYXRlOiLYotim24wg2KfbjNizINin2Ygg2KrYp9ix24zYriIsdGltZToi2KLYptuMINin24zYsyDYp9mIINmI2YLYqiIsZHVyYXRpb246Itii2KbbjCDYp9uM2LMg2KfZiCDZhdiv2KoiLGlwdjQ6Itii2KbbjCDZvtuMINmI24wgNCDYp9uM2ojYsduM2LMiLGlwdjY6Itii2KbbjCDZvtuMINmI24wgNiDYp9uM2ojYsduM2LMiLGNpZHJ2NDoi2KLYptuMINm+24wg2YjbjCA0INix24zZhtisIixjaWRydjY6Itii2KbbjCDZvtuMINmI24wgNiDYsduM2YbYrCIsYmFzZTY0OiLYqNuM2LMgNjQg2KfZhiDaqdmI2ojaiCDYs9m52LHZhtqvIixiYXNlNjR1cmw6Itio24zYsyA2NCDbjNmIINii2LEg2KfbjNmEINin2YYg2qnZiNqI2ogg2LPZudix2YbaryIsanNvbl9zdHJpbmc6Itis25Ig2KfbjNizINin2Ygg2KfbjNmGINiz2bnYsdmG2q8iLGUxNjQ6Itin24wgMTY0INmG2YXYqNixIixqd3Q6Itis25Ig2ojYqNmE24zZiCDZuduMIix0ZW1wbGF0ZV9saXRlcmFsOiLYp9mGINm+2bkifSxvPXtuYW46Ik5hTiIsbnVtYmVyOiLZhtmF2KjYsSIsYXJyYXk6Itii2LHbkiIsbnVsbDoi2YbZhCJ9O3JldHVybiBlPT57c3dpdGNoKGUuY29kZSl7Y2FzZSJpbnZhbGlkX3R5cGUiOntjb25zdCBpPW9bZS5leHBlY3RlZF0/P2UuZXhwZWN0ZWQsYT13KGUuaW5wdXQpLHM9b1thXT8/YTtyZXR1cm4vXltBLVpdLy50ZXN0KGUuZXhwZWN0ZWQpP2DYutmE2Lcg2KfZhiDZvtm5OiBpbnN0YW5jZW9mICR7ZS5leHBlY3RlZH0g2YXYqtmI2YLYuSDYqtq+2KfYjCAke3N9INmF2YjYtdmI2YQg24HZiNinYDpg2LrZhNi3INin2YYg2b7ZuTogJHtpfSDZhdiq2YjZgti5INiq2r7Yp9iMICR7c30g2YXZiNi12YjZhCDbgdmI2KdgfWNhc2UiaW52YWxpZF92YWx1ZSI6cmV0dXJuIGUudmFsdWVzLmxlbmd0aD09PTE/YNi62YTYtyDYp9mGINm+2bk6ICR7UyhlLnZhbHVlc1swXSl9INmF2KrZiNmC2Lkg2KravtinYDpg2LrZhNi3INii2b7YtNmGOiAke18oZS52YWx1ZXMsInwiKX0g2YXbjNq6INiz25Ig2KfbjNqpINmF2KrZiNmC2Lkg2KravtinYDtjYXNlInRvb19iaWciOntjb25zdCBpPWUuaW5jbHVzaXZlPyI8PSI6IjwiLGE9bihlLm9yaWdpbik7cmV0dXJuIGE/YNio24HYqiDYqNqR2Kc6ICR7ZS5vcmlnaW4/PyLZiNuM2YTbjNmIIn0g2qnbkiAke2l9JHtlLm1heGltdW0udG9TdHJpbmcoKX0gJHthLnVuaXQ/PyLYudmG2KfYtdixIn0g24HZiNmG25Ig2YXYqtmI2YLYuSDYqtq+25JgOmDYqNuB2Kog2KjakdinOiAke2Uub3JpZ2luPz8i2YjbjNmE24zZiCJ9INqp2KcgJHtpfSR7ZS5tYXhpbXVtLnRvU3RyaW5nKCl9INuB2YjZhtinINmF2KrZiNmC2Lkg2KravtinYH1jYXNlInRvb19zbWFsbCI6e2NvbnN0IGk9ZS5pbmNsdXNpdmU/Ij49IjoiPiIsYT1uKGUub3JpZ2luKTtyZXR1cm4gYT9g2KjbgdiqINqG2r7ZiNm52Kc6ICR7ZS5vcmlnaW59INqp25IgJHtpfSR7ZS5taW5pbXVtLnRvU3RyaW5nKCl9ICR7YS51bml0fSDbgdmI2YbbkiDZhdiq2YjZgti5INiq2r7bkmA6YNio24HYqiDahtq+2YjZudinOiAke2Uub3JpZ2lufSDaqdinICR7aX0ke2UubWluaW11bS50b1N0cmluZygpfSDbgdmI2YbYpyDZhdiq2YjZgti5INiq2r7Yp2B9Y2FzZSJpbnZhbGlkX2Zvcm1hdCI6e2NvbnN0IGk9ZTtyZXR1cm4gaS5mb3JtYXQ9PT0ic3RhcnRzX3dpdGgiP2DYutmE2Lcg2LPZudix2YbarzogIiR7aS5wcmVmaXh9IiDYs9uSINi02LHZiNi5INuB2YjZhtinINqG2KfbgduM25JgOmkuZm9ybWF0PT09ImVuZHNfd2l0aCI/YNi62YTYtyDYs9m52LHZhtqvOiAiJHtpLnN1ZmZpeH0iINm+2LEg2K7YqtmFINuB2YjZhtinINqG2KfbgduM25JgOmkuZm9ybWF0PT09ImluY2x1ZGVzIj9g2LrZhNi3INiz2bnYsdmG2q86ICIke2kuaW5jbHVkZXN9IiDYtNin2YXZhCDbgdmI2YbYpyDahtin24HbjNuSYDppLmZvcm1hdD09PSJyZWdleCI/YNi62YTYtyDYs9m52LHZhtqvOiDZvtuM2bnYsdmGICR7aS5wYXR0ZXJufSDYs9uSINmF24zahiDbgdmI2YbYpyDahtin24HbjNuSYDpg2LrZhNi3ICR7cltpLmZvcm1hdF0/P2UuZm9ybWF0fWB9Y2FzZSJub3RfbXVsdGlwbGVfb2YiOnJldHVybmDYutmE2Lcg2YbZhdio2LE6ICR7ZS5kaXZpc29yfSDaqdinINmF2LbYp9i52YEg24HZiNmG2Kcg2obYp9uB24zbkmA7Y2FzZSJ1bnJlY29nbml6ZWRfa2V5cyI6cmV0dXJuYNi624zYsSDYqtiz2YTbjNmFINi02K/bgSDaqduMJHtlLmtleXMubGVuZ3RoPjE/ItiyIjoiIn06ICR7XyhlLmtleXMsItiMICIpfWA7Y2FzZSJpbnZhbGlkX2tleSI6cmV0dXJuYCR7ZS5vcmlnaW59INmF24zauiDYutmE2Lcg2qnbjGA7Y2FzZSJpbnZhbGlkX3VuaW9uIjpyZXR1cm4i2LrZhNi3INin2YYg2b7ZuSI7Y2FzZSJpbnZhbGlkX2VsZW1lbnQiOnJldHVybmAke2Uub3JpZ2lufSDZhduM2rog2LrZhNi3INmI24zZhNuM2YhgO2RlZmF1bHQ6cmV0dXJuIti62YTYtyDYp9mGINm+2bkifX19O2Z1bmN0aW9uICRnKCl7cmV0dXJue2xvY2FsZUVycm9yOmhnKCl9fWNvbnN0IF9nPSgpPT57Y29uc3QgdD17c3RyaW5nOnt1bml0OiJiZWxnaSIsdmVyYjoiYm/igJhsaXNoaSBrZXJhayJ9LGZpbGU6e3VuaXQ6ImJheXQiLHZlcmI6ImJv4oCYbGlzaGkga2VyYWsifSxhcnJheTp7dW5pdDoiZWxlbWVudCIsdmVyYjoiYm/igJhsaXNoaSBrZXJhayJ9LHNldDp7dW5pdDoiZWxlbWVudCIsdmVyYjoiYm/igJhsaXNoaSBrZXJhayJ9LG1hcDp7dW5pdDoieW96dXYiLHZlcmI6ImJv4oCYbGlzaGkga2VyYWsifX07ZnVuY3Rpb24gbihlKXtyZXR1cm4gdFtlXT8/bnVsbH1jb25zdCByPXtyZWdleDoia2lyaXNoIixlbWFpbDoiZWxla3Ryb24gcG9jaHRhIG1hbnppbGkiLHVybDoiVVJMIixlbW9qaToiZW1vamkiLHV1aWQ6IlVVSUQiLHV1aWR2NDoiVVVJRHY0Iix1dWlkdjY6IlVVSUR2NiIsbmFub2lkOiJuYW5vaWQiLGd1aWQ6IkdVSUQiLGN1aWQ6ImN1aWQiLGN1aWQyOiJjdWlkMiIsdWxpZDoiVUxJRCIseGlkOiJYSUQiLGtzdWlkOiJLU1VJRCIsZGF0ZXRpbWU6IklTTyBzYW5hIHZhIHZhcXRpIixkYXRlOiJJU08gc2FuYSIsdGltZToiSVNPIHZhcXQiLGR1cmF0aW9uOiJJU08gZGF2b21peWxpayIsaXB2NDoiSVB2NCBtYW56aWwiLGlwdjY6IklQdjYgbWFuemlsIixtYWM6Ik1BQyBtYW56aWwiLGNpZHJ2NDoiSVB2NCBkaWFwYXpvbiIsY2lkcnY2OiJJUHY2IGRpYXBhem9uIixiYXNlNjQ6ImJhc2U2NCBrb2RsYW5nYW4gc2F0ciIsYmFzZTY0dXJsOiJiYXNlNjR1cmwga29kbGFuZ2FuIHNhdHIiLGpzb25fc3RyaW5nOiJKU09OIHNhdHIiLGUxNjQ6IkUuMTY0IHJhcWFtIixqd3Q6IkpXVCIsdGVtcGxhdGVfbGl0ZXJhbDoia2lyaXNoIn0sbz17bmFuOiJOYU4iLG51bWJlcjoicmFxYW0iLGFycmF5OiJtYXNzaXYifTtyZXR1cm4gZT0+e3N3aXRjaChlLmNvZGUpe2Nhc2UiaW52YWxpZF90eXBlIjp7Y29uc3QgaT1vW2UuZXhwZWN0ZWRdPz9lLmV4cGVjdGVkLGE9dyhlLmlucHV0KSxzPW9bYV0/P2E7cmV0dXJuL15bQS1aXS8udGVzdChlLmV4cGVjdGVkKT9gTm90b+KAmGfigJhyaSBraXJpc2g6IGt1dGlsZ2FuIGluc3RhbmNlb2YgJHtlLmV4cGVjdGVkfSwgcWFidWwgcWlsaW5nYW4gJHtzfWA6YE5vdG/igJhn4oCYcmkga2lyaXNoOiBrdXRpbGdhbiAke2l9LCBxYWJ1bCBxaWxpbmdhbiAke3N9YH1jYXNlImludmFsaWRfdmFsdWUiOnJldHVybiBlLnZhbHVlcy5sZW5ndGg9PT0xP2BOb3Rv4oCYZ+KAmHJpIGtpcmlzaDoga3V0aWxnYW4gJHtTKGUudmFsdWVzWzBdKX1gOmBOb3Rv4oCYZ+KAmHJpIHZhcmlhbnQ6IHF1eWlkYWdpbGFyZGFuIGJpcmkga3V0aWxnYW4gJHtfKGUudmFsdWVzLCJ8Iil9YDtjYXNlInRvb19iaWciOntjb25zdCBpPWUuaW5jbHVzaXZlPyI8PSI6IjwiLGE9bihlLm9yaWdpbik7cmV0dXJuIGE/YEp1ZGEga2F0dGE6IGt1dGlsZ2FuICR7ZS5vcmlnaW4/PyJxaXltYXQifSAke2l9JHtlLm1heGltdW0udG9TdHJpbmcoKX0gJHthLnVuaXR9ICR7YS52ZXJifWA6YEp1ZGEga2F0dGE6IGt1dGlsZ2FuICR7ZS5vcmlnaW4/PyJxaXltYXQifSAke2l9JHtlLm1heGltdW0udG9TdHJpbmcoKX1gfWNhc2UidG9vX3NtYWxsIjp7Y29uc3QgaT1lLmluY2x1c2l2ZT8iPj0iOiI+IixhPW4oZS5vcmlnaW4pO3JldHVybiBhP2BKdWRhIGtpY2hpazoga3V0aWxnYW4gJHtlLm9yaWdpbn0gJHtpfSR7ZS5taW5pbXVtLnRvU3RyaW5nKCl9ICR7YS51bml0fSAke2EudmVyYn1gOmBKdWRhIGtpY2hpazoga3V0aWxnYW4gJHtlLm9yaWdpbn0gJHtpfSR7ZS5taW5pbXVtLnRvU3RyaW5nKCl9YH1jYXNlImludmFsaWRfZm9ybWF0Ijp7Y29uc3QgaT1lO3JldHVybiBpLmZvcm1hdD09PSJzdGFydHNfd2l0aCI/YE5vdG/igJhn4oCYcmkgc2F0cjogIiR7aS5wcmVmaXh9IiBiaWxhbiBib3NobGFuaXNoaSBrZXJha2A6aS5mb3JtYXQ9PT0iZW5kc193aXRoIj9gTm90b+KAmGfigJhyaSBzYXRyOiAiJHtpLnN1ZmZpeH0iIGJpbGFuIHR1Z2FzaGkga2VyYWtgOmkuZm9ybWF0PT09ImluY2x1ZGVzIj9gTm90b+KAmGfigJhyaSBzYXRyOiAiJHtpLmluY2x1ZGVzfSIgbmkgb+KAmHogaWNoaWdhIG9saXNoaSBrZXJha2A6aS5mb3JtYXQ9PT0icmVnZXgiP2BOb3Rv4oCYZ+KAmHJpIHNhdHI6ICR7aS5wYXR0ZXJufSBzaGFibG9uaWdhIG1vcyBrZWxpc2hpIGtlcmFrYDpgTm90b+KAmGfigJhyaSAke3JbaS5mb3JtYXRdPz9lLmZvcm1hdH1gfWNhc2Uibm90X211bHRpcGxlX29mIjpyZXR1cm5gTm90b+KAmGfigJhyaSByYXFhbTogJHtlLmRpdmlzb3J9IG5pbmcga2FycmFsaXNpIGJv4oCYbGlzaGkga2VyYWtgO2Nhc2UidW5yZWNvZ25pemVkX2tleXMiOnJldHVybmBOb21h4oCZbHVtIGthbGl0JHtlLmtleXMubGVuZ3RoPjE/ImxhciI6IiJ9OiAke18oZS5rZXlzLCIsICIpfWA7Y2FzZSJpbnZhbGlkX2tleSI6cmV0dXJuYCR7ZS5vcmlnaW59IGRhZ2kga2FsaXQgbm90b+KAmGfigJhyaWA7Y2FzZSJpbnZhbGlkX3VuaW9uIjpyZXR1cm4iTm90b+KAmGfigJhyaSBraXJpc2giO2Nhc2UiaW52YWxpZF9lbGVtZW50IjpyZXR1cm5gJHtlLm9yaWdpbn0gZGEgbm90b+KAmGfigJhyaSBxaXltYXRgO2RlZmF1bHQ6cmV0dXJuIk5vdG/igJhn4oCYcmkga2lyaXNoIn19fTtmdW5jdGlvbiBiZygpe3JldHVybntsb2NhbGVFcnJvcjpfZygpfX1jb25zdCB5Zz0oKT0+e2NvbnN0IHQ9e3N0cmluZzp7dW5pdDoia8O9IHThu7EiLHZlcmI6ImPDsyJ9LGZpbGU6e3VuaXQ6ImJ5dGUiLHZlcmI6ImPDsyJ9LGFycmF5Ont1bml0OiJwaOG6p24gdOG7rSIsdmVyYjoiY8OzIn0sc2V0Ont1bml0OiJwaOG6p24gdOG7rSIsdmVyYjoiY8OzIn19O2Z1bmN0aW9uIG4oZSl7cmV0dXJuIHRbZV0/P251bGx9Y29uc3Qgcj17cmVnZXg6IsSR4bqndSB2w6BvIixlbWFpbDoixJHhu4thIGNo4buJIGVtYWlsIix1cmw6IlVSTCIsZW1vamk6ImVtb2ppIix1dWlkOiJVVUlEIix1dWlkdjQ6IlVVSUR2NCIsdXVpZHY2OiJVVUlEdjYiLG5hbm9pZDoibmFub2lkIixndWlkOiJHVUlEIixjdWlkOiJjdWlkIixjdWlkMjoiY3VpZDIiLHVsaWQ6IlVMSUQiLHhpZDoiWElEIixrc3VpZDoiS1NVSUQiLGRhdGV0aW1lOiJuZ8OgeSBnaeG7nSBJU08iLGRhdGU6Im5nw6B5IElTTyIsdGltZToiZ2nhu50gSVNPIixkdXJhdGlvbjoia2hv4bqjbmcgdGjhu51pIGdpYW4gSVNPIixpcHY0OiLEkeG7i2EgY2jhu4kgSVB2NCIsaXB2NjoixJHhu4thIGNo4buJIElQdjYiLGNpZHJ2NDoiZOG6o2kgSVB2NCIsY2lkcnY2OiJk4bqjaSBJUHY2IixiYXNlNjQ6ImNodeG7l2kgbcOjIGjDs2EgYmFzZTY0IixiYXNlNjR1cmw6ImNodeG7l2kgbcOjIGjDs2EgYmFzZTY0dXJsIixqc29uX3N0cmluZzoiY2h14buXaSBKU09OIixlMTY0OiJz4buRIEUuMTY0Iixqd3Q6IkpXVCIsdGVtcGxhdGVfbGl0ZXJhbDoixJHhuqd1IHbDoG8ifSxvPXtuYW46Ik5hTiIsbnVtYmVyOiJz4buRIixhcnJheToibeG6o25nIn07cmV0dXJuIGU9Pntzd2l0Y2goZS5jb2RlKXtjYXNlImludmFsaWRfdHlwZSI6e2NvbnN0IGk9b1tlLmV4cGVjdGVkXT8/ZS5leHBlY3RlZCxhPXcoZS5pbnB1dCkscz1vW2FdPz9hO3JldHVybi9eW0EtWl0vLnRlc3QoZS5leHBlY3RlZCk/YMSQ4bqndSB2w6BvIGtow7RuZyBo4bujcCBs4buHOiBtb25nIMSR4bujaSBpbnN0YW5jZW9mICR7ZS5leHBlY3RlZH0sIG5o4bqtbiDEkcaw4bujYyAke3N9YDpgxJDhuqd1IHbDoG8ga2jDtG5nIGjhu6NwIGzhu4c6IG1vbmcgxJHhu6NpICR7aX0sIG5o4bqtbiDEkcaw4bujYyAke3N9YH1jYXNlImludmFsaWRfdmFsdWUiOnJldHVybiBlLnZhbHVlcy5sZW5ndGg9PT0xP2DEkOG6p3UgdsOgbyBraMO0bmcgaOG7o3AgbOG7hzogbW9uZyDEkeG7o2kgJHtTKGUudmFsdWVzWzBdKX1gOmBUw7l5IGNo4buNbiBraMO0bmcgaOG7o3AgbOG7hzogbW9uZyDEkeG7o2kgbeG7mXQgdHJvbmcgY8OhYyBnacOhIHRy4buLICR7XyhlLnZhbHVlcywifCIpfWA7Y2FzZSJ0b29fYmlnIjp7Y29uc3QgaT1lLmluY2x1c2l2ZT8iPD0iOiI8IixhPW4oZS5vcmlnaW4pO3JldHVybiBhP2BRdcOhIGzhu5tuOiBtb25nIMSR4bujaSAke2Uub3JpZ2luPz8iZ2nDoSB0cuG7iyJ9ICR7YS52ZXJifSAke2l9JHtlLm1heGltdW0udG9TdHJpbmcoKX0gJHthLnVuaXQ/PyJwaOG6p24gdOG7rSJ9YDpgUXXDoSBs4bubbjogbW9uZyDEkeG7o2kgJHtlLm9yaWdpbj8/Imdpw6EgdHLhu4sifSAke2l9JHtlLm1heGltdW0udG9TdHJpbmcoKX1gfWNhc2UidG9vX3NtYWxsIjp7Y29uc3QgaT1lLmluY2x1c2l2ZT8iPj0iOiI+IixhPW4oZS5vcmlnaW4pO3JldHVybiBhP2BRdcOhIG5o4buPOiBtb25nIMSR4bujaSAke2Uub3JpZ2lufSAke2EudmVyYn0gJHtpfSR7ZS5taW5pbXVtLnRvU3RyaW5nKCl9ICR7YS51bml0fWA6YFF1w6Egbmjhu486IG1vbmcgxJHhu6NpICR7ZS5vcmlnaW59ICR7aX0ke2UubWluaW11bS50b1N0cmluZygpfWB9Y2FzZSJpbnZhbGlkX2Zvcm1hdCI6e2NvbnN0IGk9ZTtyZXR1cm4gaS5mb3JtYXQ9PT0ic3RhcnRzX3dpdGgiP2BDaHXhu5dpIGtow7RuZyBo4bujcCBs4buHOiBwaOG6o2kgYuG6r3QgxJHhuqd1IGLhurFuZyAiJHtpLnByZWZpeH0iYDppLmZvcm1hdD09PSJlbmRzX3dpdGgiP2BDaHXhu5dpIGtow7RuZyBo4bujcCBs4buHOiBwaOG6o2kga+G6v3QgdGjDumMgYuG6sW5nICIke2kuc3VmZml4fSJgOmkuZm9ybWF0PT09ImluY2x1ZGVzIj9gQ2h14buXaSBraMO0bmcgaOG7o3AgbOG7hzogcGjhuqNpIGJhbyBn4buTbSAiJHtpLmluY2x1ZGVzfSJgOmkuZm9ybWF0PT09InJlZ2V4Ij9gQ2h14buXaSBraMO0bmcgaOG7o3AgbOG7hzogcGjhuqNpIGto4bubcCB24bubaSBt4bqrdSAke2kucGF0dGVybn1gOmAke3JbaS5mb3JtYXRdPz9lLmZvcm1hdH0ga2jDtG5nIGjhu6NwIGzhu4dgfWNhc2Uibm90X211bHRpcGxlX29mIjpyZXR1cm5gU+G7kSBraMO0bmcgaOG7o3AgbOG7hzogcGjhuqNpIGzDoCBi4buZaSBz4buRIGPhu6dhICR7ZS5kaXZpc29yfWA7Y2FzZSJ1bnJlY29nbml6ZWRfa2V5cyI6cmV0dXJuYEtow7NhIGtow7RuZyDEkcaw4bujYyBuaOG6rW4gZOG6oW5nOiAke18oZS5rZXlzLCIsICIpfWA7Y2FzZSJpbnZhbGlkX2tleSI6cmV0dXJuYEtow7NhIGtow7RuZyBo4bujcCBs4buHIHRyb25nICR7ZS5vcmlnaW59YDtjYXNlImludmFsaWRfdW5pb24iOnJldHVybiLEkOG6p3UgdsOgbyBraMO0bmcgaOG7o3AgbOG7hyI7Y2FzZSJpbnZhbGlkX2VsZW1lbnQiOnJldHVybmBHacOhIHRy4buLIGtow7RuZyBo4bujcCBs4buHIHRyb25nICR7ZS5vcmlnaW59YDtkZWZhdWx0OnJldHVybiLEkOG6p3UgdsOgbyBraMO0bmcgaOG7o3AgbOG7hyJ9fX07ZnVuY3Rpb24ga2coKXtyZXR1cm57bG9jYWxlRXJyb3I6eWcoKX19Y29uc3QgU2c9KCk9Pntjb25zdCB0PXtzdHJpbmc6e3VuaXQ6IuWtl+espiIsdmVyYjoi5YyF5ZCrIn0sZmlsZTp7dW5pdDoi5a2X6IqCIix2ZXJiOiLljIXlkKsifSxhcnJheTp7dW5pdDoi6aG5Iix2ZXJiOiLljIXlkKsifSxzZXQ6e3VuaXQ6IumhuSIsdmVyYjoi5YyF5ZCrIn19O2Z1bmN0aW9uIG4oZSl7cmV0dXJuIHRbZV0/P251bGx9Y29uc3Qgcj17cmVnZXg6Iui+k+WFpSIsZW1haWw6IueUteWtkOmCruS7tiIsdXJsOiJVUkwiLGVtb2ppOiLooajmg4XnrKblj7ciLHV1aWQ6IlVVSUQiLHV1aWR2NDoiVVVJRHY0Iix1dWlkdjY6IlVVSUR2NiIsbmFub2lkOiJuYW5vaWQiLGd1aWQ6IkdVSUQiLGN1aWQ6ImN1aWQiLGN1aWQyOiJjdWlkMiIsdWxpZDoiVUxJRCIseGlkOiJYSUQiLGtzdWlkOiJLU1VJRCIsZGF0ZXRpbWU6IklTT+aXpeacn+aXtumXtCIsZGF0ZToiSVNP5pel5pyfIix0aW1lOiJJU0/ml7bpl7QiLGR1cmF0aW9uOiJJU0/ml7bplb8iLGlwdjQ6IklQdjTlnLDlnYAiLGlwdjY6IklQdjblnLDlnYAiLGNpZHJ2NDoiSVB2NOe9keautSIsY2lkcnY2OiJJUHY2572R5q61IixiYXNlNjQ6ImJhc2U2NOe8lueggeWtl+espuS4siIsYmFzZTY0dXJsOiJiYXNlNjR1cmznvJbnoIHlrZfnrKbkuLIiLGpzb25fc3RyaW5nOiJKU09O5a2X56ym5LiyIixlMTY0OiJFLjE2NOWPt+eggSIsand0OiJKV1QiLHRlbXBsYXRlX2xpdGVyYWw6Iui+k+WFpSJ9LG89e25hbjoiTmFOIixudW1iZXI6IuaVsOWtlyIsYXJyYXk6IuaVsOe7hCIsbnVsbDoi56m65YC8KG51bGwpIn07cmV0dXJuIGU9Pntzd2l0Y2goZS5jb2RlKXtjYXNlImludmFsaWRfdHlwZSI6e2NvbnN0IGk9b1tlLmV4cGVjdGVkXT8/ZS5leHBlY3RlZCxhPXcoZS5pbnB1dCkscz1vW2FdPz9hO3JldHVybi9eW0EtWl0vLnRlc3QoZS5leHBlY3RlZCk/YOaXoOaViOi+k+WFpe+8muacn+acmyBpbnN0YW5jZW9mICR7ZS5leHBlY3RlZH3vvIzlrp7pmYXmjqXmlLYgJHtzfWA6YOaXoOaViOi+k+WFpe+8muacn+acmyAke2l977yM5a6e6ZmF5o6l5pS2ICR7c31gfWNhc2UiaW52YWxpZF92YWx1ZSI6cmV0dXJuIGUudmFsdWVzLmxlbmd0aD09PTE/YOaXoOaViOi+k+WFpe+8muacn+acmyAke1MoZS52YWx1ZXNbMF0pfWA6YOaXoOaViOmAiemhue+8muacn+acm+S7peS4i+S5i+S4gCAke18oZS52YWx1ZXMsInwiKX1gO2Nhc2UidG9vX2JpZyI6e2NvbnN0IGk9ZS5pbmNsdXNpdmU/Ijw9IjoiPCIsYT1uKGUub3JpZ2luKTtyZXR1cm4gYT9g5pWw5YC86L+H5aSn77ya5pyf5pybICR7ZS5vcmlnaW4/PyLlgLwifSAke2l9JHtlLm1heGltdW0udG9TdHJpbmcoKX0gJHthLnVuaXQ/PyLkuKrlhYPntKAifWA6YOaVsOWAvOi/h+Wkp++8muacn+acmyAke2Uub3JpZ2luPz8i5YC8In0gJHtpfSR7ZS5tYXhpbXVtLnRvU3RyaW5nKCl9YH1jYXNlInRvb19zbWFsbCI6e2NvbnN0IGk9ZS5pbmNsdXNpdmU/Ij49IjoiPiIsYT1uKGUub3JpZ2luKTtyZXR1cm4gYT9g5pWw5YC86L+H5bCP77ya5pyf5pybICR7ZS5vcmlnaW59ICR7aX0ke2UubWluaW11bS50b1N0cmluZygpfSAke2EudW5pdH1gOmDmlbDlgLzov4flsI/vvJrmnJ/mnJsgJHtlLm9yaWdpbn0gJHtpfSR7ZS5taW5pbXVtLnRvU3RyaW5nKCl9YH1jYXNlImludmFsaWRfZm9ybWF0Ijp7Y29uc3QgaT1lO3JldHVybiBpLmZvcm1hdD09PSJzdGFydHNfd2l0aCI/YOaXoOaViOWtl+espuS4su+8muW/hemhu+S7pSAiJHtpLnByZWZpeH0iIOW8gOWktGA6aS5mb3JtYXQ9PT0iZW5kc193aXRoIj9g5peg5pWI5a2X56ym5Liy77ya5b+F6aG75LulICIke2kuc3VmZml4fSIg57uT5bC+YDppLmZvcm1hdD09PSJpbmNsdWRlcyI/YOaXoOaViOWtl+espuS4su+8muW/hemhu+WMheWQqyAiJHtpLmluY2x1ZGVzfSJgOmkuZm9ybWF0PT09InJlZ2V4Ij9g5peg5pWI5a2X56ym5Liy77ya5b+F6aG75ruh6Laz5q2j5YiZ6KGo6L6+5byPICR7aS5wYXR0ZXJufWA6YOaXoOaViCR7cltpLmZvcm1hdF0/P2UuZm9ybWF0fWB9Y2FzZSJub3RfbXVsdGlwbGVfb2YiOnJldHVybmDml6DmlYjmlbDlrZfvvJrlv4XpobvmmK8gJHtlLmRpdmlzb3J9IOeahOWAjeaVsGA7Y2FzZSJ1bnJlY29nbml6ZWRfa2V5cyI6cmV0dXJuYOWHuueOsOacquefpeeahOmUrihrZXkpOiAke18oZS5rZXlzLCIsICIpfWA7Y2FzZSJpbnZhbGlkX2tleSI6cmV0dXJuYCR7ZS5vcmlnaW59IOS4reeahOmUrihrZXkp5peg5pWIYDtjYXNlImludmFsaWRfdW5pb24iOnJldHVybiLml6DmlYjovpPlhaUiO2Nhc2UiaW52YWxpZF9lbGVtZW50IjpyZXR1cm5gJHtlLm9yaWdpbn0g5Lit5YyF5ZCr5peg5pWI5YC8KHZhbHVlKWA7ZGVmYXVsdDpyZXR1cm4i5peg5pWI6L6T5YWlIn19fTtmdW5jdGlvbiB3Zygpe3JldHVybntsb2NhbGVFcnJvcjpTZygpfX1jb25zdCBJZz0oKT0+e2NvbnN0IHQ9e3N0cmluZzp7dW5pdDoi5a2X5YWDIix2ZXJiOiLmk4HmnIkifSxmaWxlOnt1bml0OiLkvY3lhYPntYQiLHZlcmI6IuaTgeaciSJ9LGFycmF5Ont1bml0OiLpoIXnm64iLHZlcmI6IuaTgeaciSJ9LHNldDp7dW5pdDoi6aCF55uuIix2ZXJiOiLmk4HmnIkifX07ZnVuY3Rpb24gbihlKXtyZXR1cm4gdFtlXT8/bnVsbH1jb25zdCByPXtyZWdleDoi6Ly45YWlIixlbWFpbDoi6YO15Lu25Zyw5Z2AIix1cmw6IlVSTCIsZW1vamk6ImVtb2ppIix1dWlkOiJVVUlEIix1dWlkdjQ6IlVVSUR2NCIsdXVpZHY2OiJVVUlEdjYiLG5hbm9pZDoibmFub2lkIixndWlkOiJHVUlEIixjdWlkOiJjdWlkIixjdWlkMjoiY3VpZDIiLHVsaWQ6IlVMSUQiLHhpZDoiWElEIixrc3VpZDoiS1NVSUQiLGRhdGV0aW1lOiJJU08g5pel5pyf5pmC6ZaTIixkYXRlOiJJU08g5pel5pyfIix0aW1lOiJJU08g5pmC6ZaTIixkdXJhdGlvbjoiSVNPIOacn+mWkyIsaXB2NDoiSVB2NCDkvY3lnYAiLGlwdjY6IklQdjYg5L2N5Z2AIixjaWRydjQ6IklQdjQg56+E5ZyNIixjaWRydjY6IklQdjYg56+E5ZyNIixiYXNlNjQ6ImJhc2U2NCDnt6jnorzlrZfkuLIiLGJhc2U2NHVybDoiYmFzZTY0dXJsIOe3qOeivOWtl+S4siIsanNvbl9zdHJpbmc6IkpTT04g5a2X5LiyIixlMTY0OiJFLjE2NCDmlbjlgLwiLGp3dDoiSldUIix0ZW1wbGF0ZV9saXRlcmFsOiLovLjlhaUifSxvPXtuYW46Ik5hTiJ9O3JldHVybiBlPT57c3dpdGNoKGUuY29kZSl7Y2FzZSJpbnZhbGlkX3R5cGUiOntjb25zdCBpPW9bZS5leHBlY3RlZF0/P2UuZXhwZWN0ZWQsYT13KGUuaW5wdXQpLHM9b1thXT8/YTtyZXR1cm4vXltBLVpdLy50ZXN0KGUuZXhwZWN0ZWQpP2DnhKHmlYjnmoTovLjlhaXlgLzvvJrpoJDmnJ/ngrogaW5zdGFuY2VvZiAke2UuZXhwZWN0ZWR977yM5L2G5pS25YiwICR7c31gOmDnhKHmlYjnmoTovLjlhaXlgLzvvJrpoJDmnJ/ngrogJHtpfe+8jOS9huaUtuWIsCAke3N9YH1jYXNlImludmFsaWRfdmFsdWUiOnJldHVybiBlLnZhbHVlcy5sZW5ndGg9PT0xP2DnhKHmlYjnmoTovLjlhaXlgLzvvJrpoJDmnJ/ngrogJHtTKGUudmFsdWVzWzBdKX1gOmDnhKHmlYjnmoTpgbjpoIXvvJrpoJDmnJ/ngrrku6XkuIvlhbbkuK3kuYvkuIAgJHtfKGUudmFsdWVzLCJ8Iil9YDtjYXNlInRvb19iaWciOntjb25zdCBpPWUuaW5jbHVzaXZlPyI8PSI6IjwiLGE9bihlLm9yaWdpbik7cmV0dXJuIGE/YOaVuOWAvOmBjuWkp++8mumgkOacnyAke2Uub3JpZ2luPz8i5YC8In0g5oeJ54K6ICR7aX0ke2UubWF4aW11bS50b1N0cmluZygpfSAke2EudW5pdD8/IuWAi+WFg+e0oCJ9YDpg5pW45YC86YGO5aSn77ya6aCQ5pyfICR7ZS5vcmlnaW4/PyLlgLwifSDmh4nngrogJHtpfSR7ZS5tYXhpbXVtLnRvU3RyaW5nKCl9YH1jYXNlInRvb19zbWFsbCI6e2NvbnN0IGk9ZS5pbmNsdXNpdmU/Ij49IjoiPiIsYT1uKGUub3JpZ2luKTtyZXR1cm4gYT9g5pW45YC86YGO5bCP77ya6aCQ5pyfICR7ZS5vcmlnaW59IOaHieeCuiAke2l9JHtlLm1pbmltdW0udG9TdHJpbmcoKX0gJHthLnVuaXR9YDpg5pW45YC86YGO5bCP77ya6aCQ5pyfICR7ZS5vcmlnaW59IOaHieeCuiAke2l9JHtlLm1pbmltdW0udG9TdHJpbmcoKX1gfWNhc2UiaW52YWxpZF9mb3JtYXQiOntjb25zdCBpPWU7cmV0dXJuIGkuZm9ybWF0PT09InN0YXJ0c193aXRoIj9g54Sh5pWI55qE5a2X5Liy77ya5b+F6aCI5LulICIke2kucHJlZml4fSIg6ZaL6aCtYDppLmZvcm1hdD09PSJlbmRzX3dpdGgiP2DnhKHmlYjnmoTlrZfkuLLvvJrlv4XpoIjku6UgIiR7aS5zdWZmaXh9IiDntZDlsL5gOmkuZm9ybWF0PT09ImluY2x1ZGVzIj9g54Sh5pWI55qE5a2X5Liy77ya5b+F6aCI5YyF5ZCrICIke2kuaW5jbHVkZXN9ImA6aS5mb3JtYXQ9PT0icmVnZXgiP2DnhKHmlYjnmoTlrZfkuLLvvJrlv4XpoIjnrKblkIjmoLzlvI8gJHtpLnBhdHRlcm59YDpg54Sh5pWI55qEICR7cltpLmZvcm1hdF0/P2UuZm9ybWF0fWB9Y2FzZSJub3RfbXVsdGlwbGVfb2YiOnJldHVybmDnhKHmlYjnmoTmlbjlrZfvvJrlv4XpoIjngrogJHtlLmRpdmlzb3J9IOeahOWAjeaVuGA7Y2FzZSJ1bnJlY29nbml6ZWRfa2V5cyI6cmV0dXJuYOeEoeazleitmOWIpeeahOmNteWAvCR7ZS5rZXlzLmxlbmd0aD4xPyLlgJEiOiIife+8miR7XyhlLmtleXMsIuOAgSIpfWA7Y2FzZSJpbnZhbGlkX2tleSI6cmV0dXJuYCR7ZS5vcmlnaW59IOS4reacieeEoeaViOeahOmNteWAvGA7Y2FzZSJpbnZhbGlkX3VuaW9uIjpyZXR1cm4i54Sh5pWI55qE6Ly45YWl5YC8IjtjYXNlImludmFsaWRfZWxlbWVudCI6cmV0dXJuYCR7ZS5vcmlnaW59IOS4reacieeEoeaViOeahOWAvGA7ZGVmYXVsdDpyZXR1cm4i54Sh5pWI55qE6Ly45YWl5YC8In19fTtmdW5jdGlvbiB6Zygpe3JldHVybntsb2NhbGVFcnJvcjpJZygpfX1jb25zdCB4Zz0oKT0+e2NvbnN0IHQ9e3N0cmluZzp7dW5pdDoiw6BtaSIsdmVyYjoibsOtIn0sZmlsZTp7dW5pdDoiYnl0ZXMiLHZlcmI6Im7DrSJ9LGFycmF5Ont1bml0OiJua2FuIix2ZXJiOiJuw60ifSxzZXQ6e3VuaXQ6Im5rYW4iLHZlcmI6Im7DrSJ9fTtmdW5jdGlvbiBuKGUpe3JldHVybiB0W2VdPz9udWxsfWNvbnN0IHI9e3JlZ2V4OiLhurnMgHLhu40gw6xiw6F34buNbMOpIixlbWFpbDoiw6Bkw61y4bq5zIFzw6wgw6xt4bq5zIFsw6wiLHVybDoiVVJMIixlbW9qaToiZW1vamkiLHV1aWQ6IlVVSUQiLHV1aWR2NDoiVVVJRHY0Iix1dWlkdjY6IlVVSUR2NiIsbmFub2lkOiJuYW5vaWQiLGd1aWQ6IkdVSUQiLGN1aWQ6ImN1aWQiLGN1aWQyOiJjdWlkMiIsdWxpZDoiVUxJRCIseGlkOiJYSUQiLGtzdWlkOiJLU1VJRCIsZGF0ZXRpbWU6IsOga8Oza8OyIElTTyIsZGF0ZToi4buNauG7jcyBIElTTyIsdGltZToiw6Brw7Nrw7IgSVNPIixkdXJhdGlvbjoiw6Brw7Nrw7IgdMOzIHDDqSBJU08iLGlwdjQ6IsOgZMOtcuG6ucyBc8OsIElQdjQiLGlwdjY6IsOgZMOtcuG6ucyBc8OsIElQdjYiLGNpZHJ2NDoiw6BnYsOoZ2LDqCBJUHY0IixjaWRydjY6IsOgZ2LDqGdiw6ggSVB2NiIsYmFzZTY0OiLhu43MgHLhu43MgCB0w60gYSBr4buNzIEgbsOtIGJhc2U2NCIsYmFzZTY0dXJsOiLhu43MgHLhu43MgCBiYXNlNjR1cmwiLGpzb25fc3RyaW5nOiLhu43MgHLhu43MgCBKU09OIixlMTY0OiJu4buNzIFtYsOgIEUuMTY0Iixqd3Q6IkpXVCIsdGVtcGxhdGVfbGl0ZXJhbDoi4bq5zIBy4buNIMOsYsOhd+G7jWzDqSJ9LG89e25hbjoiTmFOIixudW1iZXI6Im7hu43MgW1iw6AiLGFycmF5OiJha29w4buNIn07cmV0dXJuIGU9Pntzd2l0Y2goZS5jb2RlKXtjYXNlImludmFsaWRfdHlwZSI6e2NvbnN0IGk9b1tlLmV4cGVjdGVkXT8/ZS5leHBlY3RlZCxhPXcoZS5pbnB1dCkscz1vW2FdPz9hO3JldHVybi9eW0EtWl0vLnRlc3QoZS5leHBlY3RlZCk/YMOMYsOhd+G7jWzDqSBh4bmjw6zhuaNlOiBhIG7DrSBsw6F0aSBmaSBpbnN0YW5jZW9mICR7ZS5leHBlY3RlZH0sIMOgbeG7jcyAIGEgcsOtICR7c31gOmDDjGLDoXfhu41sw6kgYeG5o8Os4bmjZTogYSBuw60gbMOhdGkgZmkgJHtpfSwgw6Bt4buNzIAgYSByw60gJHtzfWB9Y2FzZSJpbnZhbGlkX3ZhbHVlIjpyZXR1cm4gZS52YWx1ZXMubGVuZ3RoPT09MT9gw4xiw6F34buNbMOpIGHhuaPDrOG5o2U6IGEgbsOtIGzDoXRpIGZpICR7UyhlLnZhbHVlc1swXSl9YDpgw4DhuaPDoHnDoG4gYeG5o8Os4bmjZTogeWFuIOG7jcyAa2FuIGzDoXJhICR7XyhlLnZhbHVlcywifCIpfWA7Y2FzZSJ0b29fYmlnIjp7Y29uc3QgaT1lLmluY2x1c2l2ZT8iPD0iOiI8IixhPW4oZS5vcmlnaW4pO3JldHVybiBhP2BUw7MgcOG7jcyAIGrDuTogYSBuw60gbMOhdGkgauG6ucyBIHDDqSAke2Uub3JpZ2luPz8iaXllIn0gJHthLnZlcmJ9ICR7aX0ke2UubWF4aW11bX0gJHthLnVuaXR9YDpgVMOzIHDhu43MgCBqw7k6IGEgbsOtIGzDoXRpIGrhurnMgSAke2l9JHtlLm1heGltdW19YH1jYXNlInRvb19zbWFsbCI6e2NvbnN0IGk9ZS5pbmNsdXNpdmU/Ij49IjoiPiIsYT1uKGUub3JpZ2luKTtyZXR1cm4gYT9gS8OpcsOpIGp1OiBhIG7DrSBsw6F0aSBq4bq5zIEgcMOpICR7ZS5vcmlnaW59ICR7YS52ZXJifSAke2l9JHtlLm1pbmltdW19ICR7YS51bml0fWA6YEvDqXLDqSBqdTogYSBuw60gbMOhdGkgauG6ucyBICR7aX0ke2UubWluaW11bX1gfWNhc2UiaW52YWxpZF9mb3JtYXQiOntjb25zdCBpPWU7cmV0dXJuIGkuZm9ybWF0PT09InN0YXJ0c193aXRoIj9g4buMzIBy4buNzIAgYeG5o8Os4bmjZTogZ2Lhu43MgWThu43MgCBi4bq5zIBy4bq5zIAgcOG6ucyAbMO6ICIke2kucHJlZml4fSJgOmkuZm9ybWF0PT09ImVuZHNfd2l0aCI/YOG7jMyAcuG7jcyAIGHhuaPDrOG5o2U6IGdi4buNzIFk4buNzIAgcGFyw60gcOG6ucyAbMO6ICIke2kuc3VmZml4fSJgOmkuZm9ybWF0PT09ImluY2x1ZGVzIj9g4buMzIBy4buNzIAgYeG5o8Os4bmjZTogZ2Lhu43MgWThu43MgCBuw60gIiR7aS5pbmNsdWRlc30iYDppLmZvcm1hdD09PSJyZWdleCI/YOG7jMyAcuG7jcyAIGHhuaPDrOG5o2U6IGdi4buNzIFk4buNzIAgYsOhIMOgcOG6ueG6uXLhurkgbXUgJHtpLnBhdHRlcm59YDpgQeG5o8Os4bmjZTogJHtyW2kuZm9ybWF0XT8/ZS5mb3JtYXR9YH1jYXNlIm5vdF9tdWx0aXBsZV9vZiI6cmV0dXJuYE7hu43MgW1iw6AgYeG5o8Os4bmjZTogZ2Lhu43MgWThu43MgCBq4bq5zIEgw6h5w6AgcMOtcMOtbiB0aSAke2UuZGl2aXNvcn1gO2Nhc2UidW5yZWNvZ25pemVkX2tleXMiOnJldHVybmBC4buNdMOsbsOsIMOgw6xt4buNzIA6ICR7XyhlLmtleXMsIiwgIil9YDtjYXNlImludmFsaWRfa2V5IjpyZXR1cm5gQuG7jXTDrG7DrCBh4bmjw6zhuaNlIG7DrW7DuiAke2Uub3JpZ2lufWA7Y2FzZSJpbnZhbGlkX3VuaW9uIjpyZXR1cm4iw4xiw6F34buNbMOpIGHhuaPDrOG5o2UiO2Nhc2UiaW52YWxpZF9lbGVtZW50IjpyZXR1cm5gSXllIGHhuaPDrOG5o2UgbsOtbsO6ICR7ZS5vcmlnaW59YDtkZWZhdWx0OnJldHVybiLDjGLDoXfhu41sw6kgYeG5o8Os4bmjZSJ9fX07ZnVuY3Rpb24gVGcoKXtyZXR1cm57bG9jYWxlRXJyb3I6eGcoKX19Y29uc3QgSmk9T2JqZWN0LmZyZWV6ZShPYmplY3QuZGVmaW5lUHJvcGVydHkoe19fcHJvdG9fXzpudWxsLGFyOkNwLGF6OkxwLGJlOnFwLGJnOkpwLGNhOldwLGNzOlZwLGRhOkdwLGRlOllwLGVsOmVmLGVuOklsLGVvOnJmLGVzOmFmLGZhOmNmLGZpOmxmLGZyOm1mLGZyQ0E6ZmYsaGU6dmYsaHI6JGYsaHU6YmYsaHk6a2YsaWQ6d2YsaXM6emYsaXQ6VGYsamE6T2Ysa2E6UGYsa2g6RGYsa206emwsa286WmYsbHQ6Q2YsbWs6TGYsbXM6cWYsbmw6SmYsbm86V2Ysb3RhOlZmLHBsOllmLHBzOkdmLHB0OmVnLHJvOm5nLHJ1OmlnLHNsOmFnLHN2OmNnLHRhOmxnLHRoOm1nLHRyOmZnLHVhOnZnLHVrOnhsLHVyOiRnLHV6OmJnLHZpOmtnLHlvOlRnLHpoQ046d2csemhUVzp6Z30sU3ltYm9sLnRvU3RyaW5nVGFnLHt2YWx1ZToiTW9kdWxlIn0pKTt2YXIgRHM7Y29uc3QgSGk9U3ltYm9sKCJab2RPdXRwdXQiKSxXaT1TeW1ib2woIlpvZElucHV0Iik7Y2xhc3MgVGx7Y29uc3RydWN0b3IoKXt0aGlzLl9tYXA9bmV3IFdlYWtNYXAsdGhpcy5faWRtYXA9bmV3IE1hcH1hZGQobiwuLi5yKXtjb25zdCBvPXJbMF07cmV0dXJuIHRoaXMuX21hcC5zZXQobixvKSxvJiZ0eXBlb2Ygbz09Im9iamVjdCImJiJpZCJpbiBvJiZ0aGlzLl9pZG1hcC5zZXQoby5pZCxuKSx0aGlzfWNsZWFyKCl7cmV0dXJuIHRoaXMuX21hcD1uZXcgV2Vha01hcCx0aGlzLl9pZG1hcD1uZXcgTWFwLHRoaXN9cmVtb3ZlKG4pe2NvbnN0IHI9dGhpcy5fbWFwLmdldChuKTtyZXR1cm4gciYmdHlwZW9mIHI9PSJvYmplY3QiJiYiaWQiaW4gciYmdGhpcy5faWRtYXAuZGVsZXRlKHIuaWQpLHRoaXMuX21hcC5kZWxldGUobiksdGhpc31nZXQobil7Y29uc3Qgcj1uLl96b2QucGFyZW50O2lmKHIpe2NvbnN0IG89ey4uLnRoaXMuZ2V0KHIpPz97fX07ZGVsZXRlIG8uaWQ7Y29uc3QgZT17Li4ubywuLi50aGlzLl9tYXAuZ2V0KG4pfTtyZXR1cm4gT2JqZWN0LmtleXMoZSkubGVuZ3RoP2U6dm9pZCAwfXJldHVybiB0aGlzLl9tYXAuZ2V0KG4pfWhhcyhuKXtyZXR1cm4gdGhpcy5fbWFwLmhhcyhuKX19ZnVuY3Rpb24gdHIoKXtyZXR1cm4gbmV3IFRsfShEcz1nbG9iYWxUaGlzKS5fX3pvZF9nbG9iYWxSZWdpc3RyeT8/KERzLl9fem9kX2dsb2JhbFJlZ2lzdHJ5PXRyKCkpO2NvbnN0IGNlPWdsb2JhbFRoaXMuX196b2RfZ2xvYmFsUmVnaXN0cnk7ZnVuY3Rpb24gamwodCxuKXtyZXR1cm4gbmV3IHQoe3R5cGU6InN0cmluZyIsLi4uaChuKX0pfWZ1bmN0aW9uIE9sKHQsbil7cmV0dXJuIG5ldyB0KHt0eXBlOiJzdHJpbmciLGNvZXJjZTohMCwuLi5oKG4pfSl9ZnVuY3Rpb24gQmkodCxuKXtyZXR1cm4gbmV3IHQoe3R5cGU6InN0cmluZyIsZm9ybWF0OiJlbWFpbCIsY2hlY2s6InN0cmluZ19mb3JtYXQiLGFib3J0OiExLC4uLmgobil9KX1mdW5jdGlvbiBMbih0LG4pe3JldHVybiBuZXcgdCh7dHlwZToic3RyaW5nIixmb3JtYXQ6Imd1aWQiLGNoZWNrOiJzdHJpbmdfZm9ybWF0IixhYm9ydDohMSwuLi5oKG4pfSl9ZnVuY3Rpb24gVmkodCxuKXtyZXR1cm4gbmV3IHQoe3R5cGU6InN0cmluZyIsZm9ybWF0OiJ1dWlkIixjaGVjazoic3RyaW5nX2Zvcm1hdCIsYWJvcnQ6ITEsLi4uaChuKX0pfWZ1bmN0aW9uIEtpKHQsbil7cmV0dXJuIG5ldyB0KHt0eXBlOiJzdHJpbmciLGZvcm1hdDoidXVpZCIsY2hlY2s6InN0cmluZ19mb3JtYXQiLGFib3J0OiExLHZlcnNpb246InY0IiwuLi5oKG4pfSl9ZnVuY3Rpb24gR2kodCxuKXtyZXR1cm4gbmV3IHQoe3R5cGU6InN0cmluZyIsZm9ybWF0OiJ1dWlkIixjaGVjazoic3RyaW5nX2Zvcm1hdCIsYWJvcnQ6ITEsdmVyc2lvbjoidjYiLC4uLmgobil9KX1mdW5jdGlvbiBYaSh0LG4pe3JldHVybiBuZXcgdCh7dHlwZToic3RyaW5nIixmb3JtYXQ6InV1aWQiLGNoZWNrOiJzdHJpbmdfZm9ybWF0IixhYm9ydDohMSx2ZXJzaW9uOiJ2NyIsLi4uaChuKX0pfWZ1bmN0aW9uIG5yKHQsbil7cmV0dXJuIG5ldyB0KHt0eXBlOiJzdHJpbmciLGZvcm1hdDoidXJsIixjaGVjazoic3RyaW5nX2Zvcm1hdCIsYWJvcnQ6ITEsLi4uaChuKX0pfWZ1bmN0aW9uIFlpKHQsbil7cmV0dXJuIG5ldyB0KHt0eXBlOiJzdHJpbmciLGZvcm1hdDoiZW1vamkiLGNoZWNrOiJzdHJpbmdfZm9ybWF0IixhYm9ydDohMSwuLi5oKG4pfSl9ZnVuY3Rpb24gUWkodCxuKXtyZXR1cm4gbmV3IHQoe3R5cGU6InN0cmluZyIsZm9ybWF0OiJuYW5vaWQiLGNoZWNrOiJzdHJpbmdfZm9ybWF0IixhYm9ydDohMSwuLi5oKG4pfSl9ZnVuY3Rpb24gZW8odCxuKXtyZXR1cm4gbmV3IHQoe3R5cGU6InN0cmluZyIsZm9ybWF0OiJjdWlkIixjaGVjazoic3RyaW5nX2Zvcm1hdCIsYWJvcnQ6ITEsLi4uaChuKX0pfWZ1bmN0aW9uIHRvKHQsbil7cmV0dXJuIG5ldyB0KHt0eXBlOiJzdHJpbmciLGZvcm1hdDoiY3VpZDIiLGNoZWNrOiJzdHJpbmdfZm9ybWF0IixhYm9ydDohMSwuLi5oKG4pfSl9ZnVuY3Rpb24gbm8odCxuKXtyZXR1cm4gbmV3IHQoe3R5cGU6InN0cmluZyIsZm9ybWF0OiJ1bGlkIixjaGVjazoic3RyaW5nX2Zvcm1hdCIsYWJvcnQ6ITEsLi4uaChuKX0pfWZ1bmN0aW9uIHJvKHQsbil7cmV0dXJuIG5ldyB0KHt0eXBlOiJzdHJpbmciLGZvcm1hdDoieGlkIixjaGVjazoic3RyaW5nX2Zvcm1hdCIsYWJvcnQ6ITEsLi4uaChuKX0pfWZ1bmN0aW9uIGlvKHQsbil7cmV0dXJuIG5ldyB0KHt0eXBlOiJzdHJpbmciLGZvcm1hdDoia3N1aWQiLGNoZWNrOiJzdHJpbmdfZm9ybWF0IixhYm9ydDohMSwuLi5oKG4pfSl9ZnVuY3Rpb24gb28odCxuKXtyZXR1cm4gbmV3IHQoe3R5cGU6InN0cmluZyIsZm9ybWF0OiJpcHY0IixjaGVjazoic3RyaW5nX2Zvcm1hdCIsYWJvcnQ6ITEsLi4uaChuKX0pfWZ1bmN0aW9uIGFvKHQsbil7cmV0dXJuIG5ldyB0KHt0eXBlOiJzdHJpbmciLGZvcm1hdDoiaXB2NiIsY2hlY2s6InN0cmluZ19mb3JtYXQiLGFib3J0OiExLC4uLmgobil9KX1mdW5jdGlvbiBVbCh0LG4pe3JldHVybiBuZXcgdCh7dHlwZToic3RyaW5nIixmb3JtYXQ6Im1hYyIsY2hlY2s6InN0cmluZ19mb3JtYXQiLGFib3J0OiExLC4uLmgobil9KX1mdW5jdGlvbiBzbyh0LG4pe3JldHVybiBuZXcgdCh7dHlwZToic3RyaW5nIixmb3JtYXQ6ImNpZHJ2NCIsY2hlY2s6InN0cmluZ19mb3JtYXQiLGFib3J0OiExLC4uLmgobil9KX1mdW5jdGlvbiBjbyh0LG4pe3JldHVybiBuZXcgdCh7dHlwZToic3RyaW5nIixmb3JtYXQ6ImNpZHJ2NiIsY2hlY2s6InN0cmluZ19mb3JtYXQiLGFib3J0OiExLC4uLmgobil9KX1mdW5jdGlvbiB1byh0LG4pe3JldHVybiBuZXcgdCh7dHlwZToic3RyaW5nIixmb3JtYXQ6ImJhc2U2NCIsY2hlY2s6InN0cmluZ19mb3JtYXQiLGFib3J0OiExLC4uLmgobil9KX1mdW5jdGlvbiBsbyh0LG4pe3JldHVybiBuZXcgdCh7dHlwZToic3RyaW5nIixmb3JtYXQ6ImJhc2U2NHVybCIsY2hlY2s6InN0cmluZ19mb3JtYXQiLGFib3J0OiExLC4uLmgobil9KX1mdW5jdGlvbiBtbyh0LG4pe3JldHVybiBuZXcgdCh7dHlwZToic3RyaW5nIixmb3JtYXQ6ImUxNjQiLGNoZWNrOiJzdHJpbmdfZm9ybWF0IixhYm9ydDohMSwuLi5oKG4pfSl9ZnVuY3Rpb24gcG8odCxuKXtyZXR1cm4gbmV3IHQoe3R5cGU6InN0cmluZyIsZm9ybWF0OiJqd3QiLGNoZWNrOiJzdHJpbmdfZm9ybWF0IixhYm9ydDohMSwuLi5oKG4pfSl9Y29uc3QgZm89e0FueTpudWxsLE1pbnV0ZTotMSxTZWNvbmQ6MCxNaWxsaXNlY29uZDozLE1pY3Jvc2Vjb25kOjZ9O2Z1bmN0aW9uIFBsKHQsbil7cmV0dXJuIG5ldyB0KHt0eXBlOiJzdHJpbmciLGZvcm1hdDoiZGF0ZXRpbWUiLGNoZWNrOiJzdHJpbmdfZm9ybWF0IixvZmZzZXQ6ITEsbG9jYWw6ITEscHJlY2lzaW9uOm51bGwsLi4uaChuKX0pfWZ1bmN0aW9uIE5sKHQsbil7cmV0dXJuIG5ldyB0KHt0eXBlOiJzdHJpbmciLGZvcm1hdDoiZGF0ZSIsY2hlY2s6InN0cmluZ19mb3JtYXQiLC4uLmgobil9KX1mdW5jdGlvbiBEbCh0LG4pe3JldHVybiBuZXcgdCh7dHlwZToic3RyaW5nIixmb3JtYXQ6InRpbWUiLGNoZWNrOiJzdHJpbmdfZm9ybWF0IixwcmVjaXNpb246bnVsbCwuLi5oKG4pfSl9ZnVuY3Rpb24gRWwodCxuKXtyZXR1cm4gbmV3IHQoe3R5cGU6InN0cmluZyIsZm9ybWF0OiJkdXJhdGlvbiIsY2hlY2s6InN0cmluZ19mb3JtYXQiLC4uLmgobil9KX1mdW5jdGlvbiBabCh0LG4pe3JldHVybiBuZXcgdCh7dHlwZToibnVtYmVyIixjaGVja3M6W10sLi4uaChuKX0pfWZ1bmN0aW9uIFJsKHQsbil7cmV0dXJuIG5ldyB0KHt0eXBlOiJudW1iZXIiLGNvZXJjZTohMCxjaGVja3M6W10sLi4uaChuKX0pfWZ1bmN0aW9uIENsKHQsbil7cmV0dXJuIG5ldyB0KHt0eXBlOiJudW1iZXIiLGNoZWNrOiJudW1iZXJfZm9ybWF0IixhYm9ydDohMSxmb3JtYXQ6InNhZmVpbnQiLC4uLmgobil9KX1mdW5jdGlvbiBBbCh0LG4pe3JldHVybiBuZXcgdCh7dHlwZToibnVtYmVyIixjaGVjazoibnVtYmVyX2Zvcm1hdCIsYWJvcnQ6ITEsZm9ybWF0OiJmbG9hdDMyIiwuLi5oKG4pfSl9ZnVuY3Rpb24gTGwodCxuKXtyZXR1cm4gbmV3IHQoe3R5cGU6Im51bWJlciIsY2hlY2s6Im51bWJlcl9mb3JtYXQiLGFib3J0OiExLGZvcm1hdDoiZmxvYXQ2NCIsLi4uaChuKX0pfWZ1bmN0aW9uIE1sKHQsbil7cmV0dXJuIG5ldyB0KHt0eXBlOiJudW1iZXIiLGNoZWNrOiJudW1iZXJfZm9ybWF0IixhYm9ydDohMSxmb3JtYXQ6ImludDMyIiwuLi5oKG4pfSl9ZnVuY3Rpb24gcWwodCxuKXtyZXR1cm4gbmV3IHQoe3R5cGU6Im51bWJlciIsY2hlY2s6Im51bWJlcl9mb3JtYXQiLGFib3J0OiExLGZvcm1hdDoidWludDMyIiwuLi5oKG4pfSl9ZnVuY3Rpb24gRmwodCxuKXtyZXR1cm4gbmV3IHQoe3R5cGU6ImJvb2xlYW4iLC4uLmgobil9KX1mdW5jdGlvbiBKbCh0LG4pe3JldHVybiBuZXcgdCh7dHlwZToiYm9vbGVhbiIsY29lcmNlOiEwLC4uLmgobil9KX1mdW5jdGlvbiBIbCh0LG4pe3JldHVybiBuZXcgdCh7dHlwZToiYmlnaW50IiwuLi5oKG4pfSl9ZnVuY3Rpb24gV2wodCxuKXtyZXR1cm4gbmV3IHQoe3R5cGU6ImJpZ2ludCIsY29lcmNlOiEwLC4uLmgobil9KX1mdW5jdGlvbiBCbCh0LG4pe3JldHVybiBuZXcgdCh7dHlwZToiYmlnaW50IixjaGVjazoiYmlnaW50X2Zvcm1hdCIsYWJvcnQ6ITEsZm9ybWF0OiJpbnQ2NCIsLi4uaChuKX0pfWZ1bmN0aW9uIFZsKHQsbil7cmV0dXJuIG5ldyB0KHt0eXBlOiJiaWdpbnQiLGNoZWNrOiJiaWdpbnRfZm9ybWF0IixhYm9ydDohMSxmb3JtYXQ6InVpbnQ2NCIsLi4uaChuKX0pfWZ1bmN0aW9uIEtsKHQsbil7cmV0dXJuIG5ldyB0KHt0eXBlOiJzeW1ib2wiLC4uLmgobil9KX1mdW5jdGlvbiBHbCh0LG4pe3JldHVybiBuZXcgdCh7dHlwZToidW5kZWZpbmVkIiwuLi5oKG4pfSl9ZnVuY3Rpb24gWGwodCxuKXtyZXR1cm4gbmV3IHQoe3R5cGU6Im51bGwiLC4uLmgobil9KX1mdW5jdGlvbiBZbCh0KXtyZXR1cm4gbmV3IHQoe3R5cGU6ImFueSJ9KX1mdW5jdGlvbiBRbCh0KXtyZXR1cm4gbmV3IHQoe3R5cGU6InVua25vd24ifSl9ZnVuY3Rpb24gZWQodCxuKXtyZXR1cm4gbmV3IHQoe3R5cGU6Im5ldmVyIiwuLi5oKG4pfSl9ZnVuY3Rpb24gdGQodCxuKXtyZXR1cm4gbmV3IHQoe3R5cGU6InZvaWQiLC4uLmgobil9KX1mdW5jdGlvbiBuZCh0LG4pe3JldHVybiBuZXcgdCh7dHlwZToiZGF0ZSIsLi4uaChuKX0pfWZ1bmN0aW9uIHJkKHQsbil7cmV0dXJuIG5ldyB0KHt0eXBlOiJkYXRlIixjb2VyY2U6ITAsLi4uaChuKX0pfWZ1bmN0aW9uIGlkKHQsbil7cmV0dXJuIG5ldyB0KHt0eXBlOiJuYW4iLC4uLmgobil9KX1mdW5jdGlvbiB5ZSh0LG4pe3JldHVybiBuZXcgRGkoe2NoZWNrOiJsZXNzX3RoYW4iLC4uLmgobiksdmFsdWU6dCxpbmNsdXNpdmU6ITF9KX1mdW5jdGlvbiB1ZSh0LG4pe3JldHVybiBuZXcgRGkoe2NoZWNrOiJsZXNzX3RoYW4iLC4uLmgobiksdmFsdWU6dCxpbmNsdXNpdmU6ITB9KX1mdW5jdGlvbiBrZSh0LG4pe3JldHVybiBuZXcgRWkoe2NoZWNrOiJncmVhdGVyX3RoYW4iLC4uLmgobiksdmFsdWU6dCxpbmNsdXNpdmU6ITF9KX1mdW5jdGlvbiBpZSh0LG4pe3JldHVybiBuZXcgRWkoe2NoZWNrOiJncmVhdGVyX3RoYW4iLC4uLmgobiksdmFsdWU6dCxpbmNsdXNpdmU6ITB9KX1mdW5jdGlvbiBycih0KXtyZXR1cm4ga2UoMCx0KX1mdW5jdGlvbiBpcih0KXtyZXR1cm4geWUoMCx0KX1mdW5jdGlvbiBvcih0KXtyZXR1cm4gdWUoMCx0KX1mdW5jdGlvbiBhcih0KXtyZXR1cm4gaWUoMCx0KX1mdW5jdGlvbiBEZSh0LG4pe3JldHVybiBuZXcgV2Moe2NoZWNrOiJtdWx0aXBsZV9vZiIsLi4uaChuKSx2YWx1ZTp0fSl9ZnVuY3Rpb24gQWUodCxuKXtyZXR1cm4gbmV3IEtjKHtjaGVjazoibWF4X3NpemUiLC4uLmgobiksbWF4aW11bTp0fSl9ZnVuY3Rpb24gU2UodCxuKXtyZXR1cm4gbmV3IEdjKHtjaGVjazoibWluX3NpemUiLC4uLmgobiksbWluaW11bTp0fSl9ZnVuY3Rpb24gdHQodCxuKXtyZXR1cm4gbmV3IFhjKHtjaGVjazoic2l6ZV9lcXVhbHMiLC4uLmgobiksc2l6ZTp0fSl9ZnVuY3Rpb24gbnQodCxuKXtyZXR1cm4gbmV3IFljKHtjaGVjazoibWF4X2xlbmd0aCIsLi4uaChuKSxtYXhpbXVtOnR9KX1mdW5jdGlvbiB3ZSh0LG4pe3JldHVybiBuZXcgUWMoe2NoZWNrOiJtaW5fbGVuZ3RoIiwuLi5oKG4pLG1pbmltdW06dH0pfWZ1bmN0aW9uIHJ0KHQsbil7cmV0dXJuIG5ldyBldSh7Y2hlY2s6Imxlbmd0aF9lcXVhbHMiLC4uLmgobiksbGVuZ3RoOnR9KX1mdW5jdGlvbiBSdCh0LG4pe3JldHVybiBuZXcgdHUoe2NoZWNrOiJzdHJpbmdfZm9ybWF0Iixmb3JtYXQ6InJlZ2V4IiwuLi5oKG4pLHBhdHRlcm46dH0pfWZ1bmN0aW9uIEN0KHQpe3JldHVybiBuZXcgbnUoe2NoZWNrOiJzdHJpbmdfZm9ybWF0Iixmb3JtYXQ6Imxvd2VyY2FzZSIsLi4uaCh0KX0pfWZ1bmN0aW9uIEF0KHQpe3JldHVybiBuZXcgcnUoe2NoZWNrOiJzdHJpbmdfZm9ybWF0Iixmb3JtYXQ6InVwcGVyY2FzZSIsLi4uaCh0KX0pfWZ1bmN0aW9uIEx0KHQsbil7cmV0dXJuIG5ldyBpdSh7Y2hlY2s6InN0cmluZ19mb3JtYXQiLGZvcm1hdDoiaW5jbHVkZXMiLC4uLmgobiksaW5jbHVkZXM6dH0pfWZ1bmN0aW9uIE10KHQsbil7cmV0dXJuIG5ldyBvdSh7Y2hlY2s6InN0cmluZ19mb3JtYXQiLGZvcm1hdDoic3RhcnRzX3dpdGgiLC4uLmgobikscHJlZml4OnR9KX1mdW5jdGlvbiBxdCh0LG4pe3JldHVybiBuZXcgYXUoe2NoZWNrOiJzdHJpbmdfZm9ybWF0Iixmb3JtYXQ6ImVuZHNfd2l0aCIsLi4uaChuKSxzdWZmaXg6dH0pfWZ1bmN0aW9uIHNyKHQsbixyKXtyZXR1cm4gbmV3IHN1KHtjaGVjazoicHJvcGVydHkiLHByb3BlcnR5OnQsc2NoZW1hOm4sLi4uaChyKX0pfWZ1bmN0aW9uIEZ0KHQsbil7cmV0dXJuIG5ldyBjdSh7Y2hlY2s6Im1pbWVfdHlwZSIsbWltZTp0LC4uLmgobil9KX1mdW5jdGlvbiBfZSh0KXtyZXR1cm4gbmV3IHV1KHtjaGVjazoib3ZlcndyaXRlIix0eDp0fSl9ZnVuY3Rpb24gSnQodCl7cmV0dXJuIF9lKG49Pm4ubm9ybWFsaXplKHQpKX1mdW5jdGlvbiBIdCgpe3JldHVybiBfZSh0PT50LnRyaW0oKSl9ZnVuY3Rpb24gV3QoKXtyZXR1cm4gX2UodD0+dC50b0xvd2VyQ2FzZSgpKX1mdW5jdGlvbiBCdCgpe3JldHVybiBfZSh0PT50LnRvVXBwZXJDYXNlKCkpfWZ1bmN0aW9uIFZ0KCl7cmV0dXJuIF9lKHQ9PldzKHQpKX1mdW5jdGlvbiBvZCh0LG4scil7cmV0dXJuIG5ldyB0KHt0eXBlOiJhcnJheSIsZWxlbWVudDpuLC4uLmgocil9KX1mdW5jdGlvbiBqZyh0LG4scil7cmV0dXJuIG5ldyB0KHt0eXBlOiJ1bmlvbiIsb3B0aW9uczpuLC4uLmgocil9KX1mdW5jdGlvbiBPZyh0LG4scil7cmV0dXJuIG5ldyB0KHt0eXBlOiJ1bmlvbiIsb3B0aW9uczpuLGluY2x1c2l2ZTohMSwuLi5oKHIpfSl9ZnVuY3Rpb24gVWcodCxuLHIsbyl7cmV0dXJuIG5ldyB0KHt0eXBlOiJ1bmlvbiIsb3B0aW9uczpyLGRpc2NyaW1pbmF0b3I6biwuLi5oKG8pfSl9ZnVuY3Rpb24gUGcodCxuLHIpe3JldHVybiBuZXcgdCh7dHlwZToiaW50ZXJzZWN0aW9uIixsZWZ0Om4scmlnaHQ6cn0pfWZ1bmN0aW9uIE5nKHQsbixyLG8pe2NvbnN0IGU9ciBpbnN0YW5jZW9mIHgsaT1lP286cixhPWU/cjpudWxsO3JldHVybiBuZXcgdCh7dHlwZToidHVwbGUiLGl0ZW1zOm4scmVzdDphLC4uLmgoaSl9KX1mdW5jdGlvbiBEZyh0LG4scixvKXtyZXR1cm4gbmV3IHQoe3R5cGU6InJlY29yZCIsa2V5VHlwZTpuLHZhbHVlVHlwZTpyLC4uLmgobyl9KX1mdW5jdGlvbiBFZyh0LG4scixvKXtyZXR1cm4gbmV3IHQoe3R5cGU6Im1hcCIsa2V5VHlwZTpuLHZhbHVlVHlwZTpyLC4uLmgobyl9KX1mdW5jdGlvbiBaZyh0LG4scil7cmV0dXJuIG5ldyB0KHt0eXBlOiJzZXQiLHZhbHVlVHlwZTpuLC4uLmgocil9KX1mdW5jdGlvbiBSZyh0LG4scil7Y29uc3Qgbz1BcnJheS5pc0FycmF5KG4pP09iamVjdC5mcm9tRW50cmllcyhuLm1hcChlPT5bZSxlXSkpOm47cmV0dXJuIG5ldyB0KHt0eXBlOiJlbnVtIixlbnRyaWVzOm8sLi4uaChyKX0pfWZ1bmN0aW9uIENnKHQsbixyKXtyZXR1cm4gbmV3IHQoe3R5cGU6ImVudW0iLGVudHJpZXM6biwuLi5oKHIpfSl9ZnVuY3Rpb24gQWcodCxuLHIpe3JldHVybiBuZXcgdCh7dHlwZToibGl0ZXJhbCIsdmFsdWVzOkFycmF5LmlzQXJyYXkobik/bjpbbl0sLi4uaChyKX0pfWZ1bmN0aW9uIGFkKHQsbil7cmV0dXJuIG5ldyB0KHt0eXBlOiJmaWxlIiwuLi5oKG4pfSl9ZnVuY3Rpb24gTGcodCxuKXtyZXR1cm4gbmV3IHQoe3R5cGU6InRyYW5zZm9ybSIsdHJhbnNmb3JtOm59KX1mdW5jdGlvbiBNZyh0LG4pe3JldHVybiBuZXcgdCh7dHlwZToib3B0aW9uYWwiLGlubmVyVHlwZTpufSl9ZnVuY3Rpb24gcWcodCxuKXtyZXR1cm4gbmV3IHQoe3R5cGU6Im51bGxhYmxlIixpbm5lclR5cGU6bn0pfWZ1bmN0aW9uIEZnKHQsbixyKXtyZXR1cm4gbmV3IHQoe3R5cGU6ImRlZmF1bHQiLGlubmVyVHlwZTpuLGdldCBkZWZhdWx0VmFsdWUoKXtyZXR1cm4gdHlwZW9mIHI9PSJmdW5jdGlvbiI/cigpOlZuKHIpfX0pfWZ1bmN0aW9uIEpnKHQsbixyKXtyZXR1cm4gbmV3IHQoe3R5cGU6Im5vbm9wdGlvbmFsIixpbm5lclR5cGU6biwuLi5oKHIpfSl9ZnVuY3Rpb24gSGcodCxuKXtyZXR1cm4gbmV3IHQoe3R5cGU6InN1Y2Nlc3MiLGlubmVyVHlwZTpufSl9ZnVuY3Rpb24gV2codCxuLHIpe3JldHVybiBuZXcgdCh7dHlwZToiY2F0Y2giLGlubmVyVHlwZTpuLGNhdGNoVmFsdWU6dHlwZW9mIHI9PSJmdW5jdGlvbiI/cjooKT0+cn0pfWZ1bmN0aW9uIEJnKHQsbixyKXtyZXR1cm4gbmV3IHQoe3R5cGU6InBpcGUiLGluOm4sb3V0OnJ9KX1mdW5jdGlvbiBWZyh0LG4pe3JldHVybiBuZXcgdCh7dHlwZToicmVhZG9ubHkiLGlubmVyVHlwZTpufSl9ZnVuY3Rpb24gS2codCxuLHIpe3JldHVybiBuZXcgdCh7dHlwZToidGVtcGxhdGVfbGl0ZXJhbCIscGFydHM6biwuLi5oKHIpfSl9ZnVuY3Rpb24gR2codCxuKXtyZXR1cm4gbmV3IHQoe3R5cGU6ImxhenkiLGdldHRlcjpufSl9ZnVuY3Rpb24gWGcodCxuKXtyZXR1cm4gbmV3IHQoe3R5cGU6InByb21pc2UiLGlubmVyVHlwZTpufSl9ZnVuY3Rpb24gc2QodCxuLHIpe2NvbnN0IG89aChyKTtyZXR1cm4gby5hYm9ydD8/KG8uYWJvcnQ9ITApLG5ldyB0KHt0eXBlOiJjdXN0b20iLGNoZWNrOiJjdXN0b20iLGZuOm4sLi4ub30pfWZ1bmN0aW9uIGNkKHQsbixyKXtyZXR1cm4gbmV3IHQoe3R5cGU6ImN1c3RvbSIsY2hlY2s6ImN1c3RvbSIsZm46biwuLi5oKHIpfSl9ZnVuY3Rpb24gdWQodCxuKXtjb25zdCByPWxkKG89PihvLmFkZElzc3VlPWU9PntpZih0eXBlb2YgZT09InN0cmluZyIpby5pc3N1ZXMucHVzaChIZShlLG8udmFsdWUsci5fem9kLmRlZikpO2Vsc2V7Y29uc3QgaT1lO2kuZmF0YWwmJihpLmNvbnRpbnVlPSExKSxpLmNvZGU/PyhpLmNvZGU9ImN1c3RvbSIpLGkuaW5wdXQ/PyhpLmlucHV0PW8udmFsdWUpLGkuaW5zdD8/KGkuaW5zdD1yKSxpLmNvbnRpbnVlPz8oaS5jb250aW51ZT0hci5fem9kLmRlZi5hYm9ydCksby5pc3N1ZXMucHVzaChIZShpKSl9fSx0KG8udmFsdWUsbykpLG4pO3JldHVybiByfWZ1bmN0aW9uIGxkKHQsbil7Y29uc3Qgcj1uZXcgSih7Y2hlY2s6ImN1c3RvbSIsLi4uaChuKX0pO3JldHVybiByLl96b2QuY2hlY2s9dCxyfWZ1bmN0aW9uIGRkKHQpe2NvbnN0IG49bmV3IEooe2NoZWNrOiJkZXNjcmliZSJ9KTtyZXR1cm4gbi5fem9kLm9uYXR0YWNoPVtyPT57Y29uc3Qgbz1jZS5nZXQocik/P3t9O2NlLmFkZChyLHsuLi5vLGRlc2NyaXB0aW9uOnR9KX1dLG4uX3pvZC5jaGVjaz0oKT0+e30sbn1mdW5jdGlvbiBtZCh0KXtjb25zdCBuPW5ldyBKKHtjaGVjazoibWV0YSJ9KTtyZXR1cm4gbi5fem9kLm9uYXR0YWNoPVtyPT57Y29uc3Qgbz1jZS5nZXQocik/P3t9O2NlLmFkZChyLHsuLi5vLC4uLnR9KX1dLG4uX3pvZC5jaGVjaz0oKT0+e30sbn1mdW5jdGlvbiBwZCh0LG4pe2NvbnN0IHI9aChuKTtsZXQgbz1yLnRydXRoeT8/WyJ0cnVlIiwiMSIsInllcyIsIm9uIiwieSIsImVuYWJsZWQiXSxlPXIuZmFsc3k/P1siZmFsc2UiLCIwIiwibm8iLCJvZmYiLCJuIiwiZGlzYWJsZWQiXTtyLmNhc2UhPT0ic2Vuc2l0aXZlIiYmKG89by5tYXAoJD0+dHlwZW9mICQ9PSJzdHJpbmciPyQudG9Mb3dlckNhc2UoKTokKSxlPWUubWFwKCQ9PnR5cGVvZiAkPT0ic3RyaW5nIj8kLnRvTG93ZXJDYXNlKCk6JCkpO2NvbnN0IGk9bmV3IFNldChvKSxhPW5ldyBTZXQoZSkscz10LkNvZGVjPz9GaSxjPXQuQm9vbGVhbj8/Q2ksdT10LlN0cmluZz8/WnQsbD1uZXcgdSh7dHlwZToic3RyaW5nIixlcnJvcjpyLmVycm9yfSksZz1uZXcgYyh7dHlwZToiYm9vbGVhbiIsZXJyb3I6ci5lcnJvcn0pLHY9bmV3IHMoe3R5cGU6InBpcGUiLGluOmwsb3V0OmcsdHJhbnNmb3JtOigoJCx5KT0+e2xldCBIPSQ7cmV0dXJuIHIuY2FzZSE9PSJzZW5zaXRpdmUiJiYoSD1ILnRvTG93ZXJDYXNlKCkpLGkuaGFzKEgpPyEwOmEuaGFzKEgpPyExOih5Lmlzc3Vlcy5wdXNoKHtjb2RlOiJpbnZhbGlkX3ZhbHVlIixleHBlY3RlZDoic3RyaW5nYm9vbCIsdmFsdWVzOlsuLi5pLC4uLmFdLGlucHV0OnkudmFsdWUsaW5zdDp2LGNvbnRpbnVlOiExfSkse30pfSkscmV2ZXJzZVRyYW5zZm9ybTooKCQseSk9PiQ9PT0hMD9vWzBdfHwidHJ1ZSI6ZVswXXx8ImZhbHNlIiksZXJyb3I6ci5lcnJvcn0pO3JldHVybiB2fWZ1bmN0aW9uIEt0KHQsbixyLG89e30pe2NvbnN0IGU9aChvKSxpPXsuLi5oKG8pLGNoZWNrOiJzdHJpbmdfZm9ybWF0Iix0eXBlOiJzdHJpbmciLGZvcm1hdDpuLGZuOnR5cGVvZiByPT0iZnVuY3Rpb24iP3I6cz0+ci50ZXN0KHMpLC4uLmV9O3JldHVybiByIGluc3RhbmNlb2YgUmVnRXhwJiYoaS5wYXR0ZXJuPXIpLG5ldyB0KGkpfWZ1bmN0aW9uIEJlKHQpe2xldCBuPXQ/LnRhcmdldD8/ImRyYWZ0LTIwMjAtMTIiO3JldHVybiBuPT09ImRyYWZ0LTQiJiYobj0iZHJhZnQtMDQiKSxuPT09ImRyYWZ0LTciJiYobj0iZHJhZnQtMDciKSx7cHJvY2Vzc29yczp0LnByb2Nlc3NvcnM/P3t9LG1ldGFkYXRhUmVnaXN0cnk6dD8ubWV0YWRhdGE/P2NlLHRhcmdldDpuLHVucmVwcmVzZW50YWJsZTp0Py51bnJlcHJlc2VudGFibGU/PyJ0aHJvdyIsb3ZlcnJpZGU6dD8ub3ZlcnJpZGU/PygoKT0+e30pLGlvOnQ/LmlvPz8ib3V0cHV0Iixjb3VudGVyOjAsc2VlbjpuZXcgTWFwLGN5Y2xlczp0Py5jeWNsZXM/PyJyZWYiLHJldXNlZDp0Py5yZXVzZWQ/PyJpbmxpbmUiLGV4dGVybmFsOnQ/LmV4dGVybmFsPz92b2lkIDB9fWZ1bmN0aW9uIEModCxuLHI9e3BhdGg6W10sc2NoZW1hUGF0aDpbXX0pe3ZhciBvO2NvbnN0IGU9dC5fem9kLmRlZixpPW4uc2Vlbi5nZXQodCk7aWYoaSlyZXR1cm4gaS5jb3VudCsrLHIuc2NoZW1hUGF0aC5pbmNsdWRlcyh0KSYmKGkuY3ljbGU9ci5wYXRoKSxpLnNjaGVtYTtjb25zdCBhPXtzY2hlbWE6e30sY291bnQ6MSxjeWNsZTp2b2lkIDAscGF0aDpyLnBhdGh9O24uc2Vlbi5zZXQodCxhKTtjb25zdCBzPXQuX3pvZC50b0pTT05TY2hlbWE/LigpO2lmKHMpYS5zY2hlbWE9cztlbHNle2NvbnN0IGw9ey4uLnIsc2NoZW1hUGF0aDpbLi4uci5zY2hlbWFQYXRoLHRdLHBhdGg6ci5wYXRofTtpZih0Ll96b2QucHJvY2Vzc0pTT05TY2hlbWEpdC5fem9kLnByb2Nlc3NKU09OU2NoZW1hKG4sYS5zY2hlbWEsbCk7ZWxzZXtjb25zdCB2PWEuc2NoZW1hLCQ9bi5wcm9jZXNzb3JzW2UudHlwZV07aWYoISQpdGhyb3cgbmV3IEVycm9yKGBbdG9KU09OU2NoZW1hXTogTm9uLXJlcHJlc2VudGFibGUgdHlwZSBlbmNvdW50ZXJlZDogJHtlLnR5cGV9YCk7JCh0LG4sdixsKX1jb25zdCBnPXQuX3pvZC5wYXJlbnQ7ZyYmKGEucmVmfHwoYS5yZWY9ZyksQyhnLG4sbCksbi5zZWVuLmdldChnKS5pc1BhcmVudD0hMCl9Y29uc3QgYz1uLm1ldGFkYXRhUmVnaXN0cnkuZ2V0KHQpO3JldHVybiBjJiZPYmplY3QuYXNzaWduKGEuc2NoZW1hLGMpLG4uaW89PT0iaW5wdXQiJiZyZSh0KSYmKGRlbGV0ZSBhLnNjaGVtYS5leGFtcGxlcyxkZWxldGUgYS5zY2hlbWEuZGVmYXVsdCksbi5pbz09PSJpbnB1dCImJiJfcHJlZmF1bHQiaW4gYS5zY2hlbWEmJigobz1hLnNjaGVtYSkuZGVmYXVsdD8/KG8uZGVmYXVsdD1hLnNjaGVtYS5fcHJlZmF1bHQpKSxkZWxldGUgYS5zY2hlbWEuX3ByZWZhdWx0LG4uc2Vlbi5nZXQodCkuc2NoZW1hfWZ1bmN0aW9uIFZlKHQsbil7Y29uc3Qgcj10LnNlZW4uZ2V0KG4pO2lmKCFyKXRocm93IG5ldyBFcnJvcigiVW5wcm9jZXNzZWQgc2NoZW1hLiBUaGlzIGlzIGEgYnVnIGluIFpvZC4iKTtjb25zdCBvPW5ldyBNYXA7Zm9yKGNvbnN0IGEgb2YgdC5zZWVuLmVudHJpZXMoKSl7Y29uc3Qgcz10Lm1ldGFkYXRhUmVnaXN0cnkuZ2V0KGFbMF0pPy5pZDtpZihzKXtjb25zdCBjPW8uZ2V0KHMpO2lmKGMmJmMhPT1hWzBdKXRocm93IG5ldyBFcnJvcihgRHVwbGljYXRlIHNjaGVtYSBpZCAiJHtzfSIgZGV0ZWN0ZWQgZHVyaW5nIEpTT04gU2NoZW1hIGNvbnZlcnNpb24uIFR3byBkaWZmZXJlbnQgc2NoZW1hcyBjYW5ub3Qgc2hhcmUgdGhlIHNhbWUgaWQgd2hlbiBjb252ZXJ0ZWQgdG9nZXRoZXIuYCk7by5zZXQocyxhWzBdKX19Y29uc3QgZT1hPT57Y29uc3Qgcz10LnRhcmdldD09PSJkcmFmdC0yMDIwLTEyIj8iJGRlZnMiOiJkZWZpbml0aW9ucyI7aWYodC5leHRlcm5hbCl7Y29uc3QgZz10LmV4dGVybmFsLnJlZ2lzdHJ5LmdldChhWzBdKT8uaWQsdj10LmV4dGVybmFsLnVyaT8/KHk9PnkpO2lmKGcpcmV0dXJue3JlZjp2KGcpfTtjb25zdCAkPWFbMV0uZGVmSWQ/P2FbMV0uc2NoZW1hLmlkPz9gc2NoZW1hJHt0LmNvdW50ZXIrK31gO3JldHVybiBhWzFdLmRlZklkPSQse2RlZklkOiQscmVmOmAke3YoIl9fc2hhcmVkIil9Iy8ke3N9LyR7JH1gfX1pZihhWzFdPT09cilyZXR1cm57cmVmOiIjIn07Y29uc3QgdT1gIy8ke3N9L2AsbD1hWzFdLnNjaGVtYS5pZD8/YF9fc2NoZW1hJHt0LmNvdW50ZXIrK31gO3JldHVybntkZWZJZDpsLHJlZjp1K2x9fSxpPWE9PntpZihhWzFdLnNjaGVtYS4kcmVmKXJldHVybjtjb25zdCBzPWFbMV0se3JlZjpjLGRlZklkOnV9PWUoYSk7cy5kZWY9ey4uLnMuc2NoZW1hfSx1JiYocy5kZWZJZD11KTtjb25zdCBsPXMuc2NoZW1hO2Zvcihjb25zdCBnIGluIGwpZGVsZXRlIGxbZ107bC4kcmVmPWN9O2lmKHQuY3ljbGVzPT09InRocm93Iilmb3IoY29uc3QgYSBvZiB0LnNlZW4uZW50cmllcygpKXtjb25zdCBzPWFbMV07aWYocy5jeWNsZSl0aHJvdyBuZXcgRXJyb3IoYEN5Y2xlIGRldGVjdGVkOiAjLyR7cy5jeWNsZT8uam9pbigiLyIpfS88cm9vdD4KClNldCB0aGUgXGBjeWNsZXNcYCBwYXJhbWV0ZXIgdG8gXGAicmVmIlxgIHRvIHJlc29sdmUgY3ljbGljYWwgc2NoZW1hcyB3aXRoIGRlZnMuYCl9Zm9yKGNvbnN0IGEgb2YgdC5zZWVuLmVudHJpZXMoKSl7Y29uc3Qgcz1hWzFdO2lmKG49PT1hWzBdKXtpKGEpO2NvbnRpbnVlfWlmKHQuZXh0ZXJuYWwpe2NvbnN0IHU9dC5leHRlcm5hbC5yZWdpc3RyeS5nZXQoYVswXSk/LmlkO2lmKG4hPT1hWzBdJiZ1KXtpKGEpO2NvbnRpbnVlfX1pZih0Lm1ldGFkYXRhUmVnaXN0cnkuZ2V0KGFbMF0pPy5pZCl7aShhKTtjb250aW51ZX1pZihzLmN5Y2xlKXtpKGEpO2NvbnRpbnVlfWlmKHMuY291bnQ+MSYmdC5yZXVzZWQ9PT0icmVmIil7aShhKTtjb250aW51ZX19fWZ1bmN0aW9uIEtlKHQsbil7Y29uc3Qgcj10LnNlZW4uZ2V0KG4pO2lmKCFyKXRocm93IG5ldyBFcnJvcigiVW5wcm9jZXNzZWQgc2NoZW1hLiBUaGlzIGlzIGEgYnVnIGluIFpvZC4iKTtjb25zdCBvPXM9Pntjb25zdCBjPXQuc2Vlbi5nZXQocyk7aWYoYy5yZWY9PT1udWxsKXJldHVybjtjb25zdCB1PWMuZGVmPz9jLnNjaGVtYSxsPXsuLi51fSxnPWMucmVmO2lmKGMucmVmPW51bGwsZyl7byhnKTtjb25zdCAkPXQuc2Vlbi5nZXQoZykseT0kLnNjaGVtYTtpZih5LiRyZWYmJih0LnRhcmdldD09PSJkcmFmdC0wNyJ8fHQudGFyZ2V0PT09ImRyYWZ0LTA0Inx8dC50YXJnZXQ9PT0ib3BlbmFwaS0zLjAiKT8odS5hbGxPZj11LmFsbE9mPz9bXSx1LmFsbE9mLnB1c2goeSkpOk9iamVjdC5hc3NpZ24odSx5KSxPYmplY3QuYXNzaWduKHUsbCkscy5fem9kLnBhcmVudD09PWcpZm9yKGNvbnN0IEwgaW4gdSlMPT09IiRyZWYifHxMPT09ImFsbE9mInx8TCBpbiBsfHxkZWxldGUgdVtMXTtpZih5LiRyZWYmJiQuZGVmKWZvcihjb25zdCBMIGluIHUpTD09PSIkcmVmInx8TD09PSJhbGxPZiJ8fEwgaW4gJC5kZWYmJkpTT04uc3RyaW5naWZ5KHVbTF0pPT09SlNPTi5zdHJpbmdpZnkoJC5kZWZbTF0pJiZkZWxldGUgdVtMXX1jb25zdCB2PXMuX3pvZC5wYXJlbnQ7aWYodiYmdiE9PWcpe28odik7Y29uc3QgJD10LnNlZW4uZ2V0KHYpO2lmKCQ/LnNjaGVtYS4kcmVmJiYodS4kcmVmPSQuc2NoZW1hLiRyZWYsJC5kZWYpKWZvcihjb25zdCB5IGluIHUpeT09PSIkcmVmInx8eT09PSJhbGxPZiJ8fHkgaW4gJC5kZWYmJkpTT04uc3RyaW5naWZ5KHVbeV0pPT09SlNPTi5zdHJpbmdpZnkoJC5kZWZbeV0pJiZkZWxldGUgdVt5XX10Lm92ZXJyaWRlKHt6b2RTY2hlbWE6cyxqc29uU2NoZW1hOnUscGF0aDpjLnBhdGg/P1tdfSl9O2Zvcihjb25zdCBzIG9mWy4uLnQuc2Vlbi5lbnRyaWVzKCldLnJldmVyc2UoKSlvKHNbMF0pO2NvbnN0IGU9e307aWYodC50YXJnZXQ9PT0iZHJhZnQtMjAyMC0xMiI/ZS4kc2NoZW1hPSJodHRwczovL2pzb24tc2NoZW1hLm9yZy9kcmFmdC8yMDIwLTEyL3NjaGVtYSI6dC50YXJnZXQ9PT0iZHJhZnQtMDciP2UuJHNjaGVtYT0iaHR0cDovL2pzb24tc2NoZW1hLm9yZy9kcmFmdC0wNy9zY2hlbWEjIjp0LnRhcmdldD09PSJkcmFmdC0wNCI/ZS4kc2NoZW1hPSJodHRwOi8vanNvbi1zY2hlbWEub3JnL2RyYWZ0LTA0L3NjaGVtYSMiOnQudGFyZ2V0LHQuZXh0ZXJuYWw/LnVyaSl7Y29uc3Qgcz10LmV4dGVybmFsLnJlZ2lzdHJ5LmdldChuKT8uaWQ7aWYoIXMpdGhyb3cgbmV3IEVycm9yKCJTY2hlbWEgaXMgbWlzc2luZyBhbiBgaWRgIHByb3BlcnR5Iik7ZS4kaWQ9dC5leHRlcm5hbC51cmkocyl9T2JqZWN0LmFzc2lnbihlLHIuZGVmPz9yLnNjaGVtYSk7Y29uc3QgaT10Lm1ldGFkYXRhUmVnaXN0cnkuZ2V0KG4pPy5pZDtpIT09dm9pZCAwJiZlLmlkPT09aSYmZGVsZXRlIGUuaWQ7Y29uc3QgYT10LmV4dGVybmFsPy5kZWZzPz97fTtmb3IoY29uc3QgcyBvZiB0LnNlZW4uZW50cmllcygpKXtjb25zdCBjPXNbMV07Yy5kZWYmJmMuZGVmSWQmJihjLmRlZi5pZD09PWMuZGVmSWQmJmRlbGV0ZSBjLmRlZi5pZCxhW2MuZGVmSWRdPWMuZGVmKX10LmV4dGVybmFsfHxPYmplY3Qua2V5cyhhKS5sZW5ndGg+MCYmKHQudGFyZ2V0PT09ImRyYWZ0LTIwMjAtMTIiP2UuJGRlZnM9YTplLmRlZmluaXRpb25zPWEpO3RyeXtjb25zdCBzPUpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoZSkpO3JldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkocywifnN0YW5kYXJkIix7dmFsdWU6ey4uLm5bIn5zdGFuZGFyZCJdLGpzb25TY2hlbWE6e2lucHV0Omt0KG4sImlucHV0Iix0LnByb2Nlc3NvcnMpLG91dHB1dDprdChuLCJvdXRwdXQiLHQucHJvY2Vzc29ycyl9fSxlbnVtZXJhYmxlOiExLHdyaXRhYmxlOiExfSksc31jYXRjaHt0aHJvdyBuZXcgRXJyb3IoIkVycm9yIGNvbnZlcnRpbmcgc2NoZW1hIHRvIEpTT04uIil9fWZ1bmN0aW9uIHJlKHQsbil7Y29uc3Qgcj1uPz97c2VlbjpuZXcgU2V0fTtpZihyLnNlZW4uaGFzKHQpKXJldHVybiExO3Iuc2Vlbi5hZGQodCk7Y29uc3Qgbz10Ll96b2QuZGVmO2lmKG8udHlwZT09PSJ0cmFuc2Zvcm0iKXJldHVybiEwO2lmKG8udHlwZT09PSJhcnJheSIpcmV0dXJuIHJlKG8uZWxlbWVudCxyKTtpZihvLnR5cGU9PT0ic2V0IilyZXR1cm4gcmUoby52YWx1ZVR5cGUscik7aWYoby50eXBlPT09ImxhenkiKXJldHVybiByZShvLmdldHRlcigpLHIpO2lmKG8udHlwZT09PSJwcm9taXNlInx8by50eXBlPT09Im9wdGlvbmFsInx8by50eXBlPT09Im5vbm9wdGlvbmFsInx8by50eXBlPT09Im51bGxhYmxlInx8by50eXBlPT09InJlYWRvbmx5Inx8by50eXBlPT09ImRlZmF1bHQifHxvLnR5cGU9PT0icHJlZmF1bHQiKXJldHVybiByZShvLmlubmVyVHlwZSxyKTtpZihvLnR5cGU9PT0iaW50ZXJzZWN0aW9uIilyZXR1cm4gcmUoby5sZWZ0LHIpfHxyZShvLnJpZ2h0LHIpO2lmKG8udHlwZT09PSJyZWNvcmQifHxvLnR5cGU9PT0ibWFwIilyZXR1cm4gcmUoby5rZXlUeXBlLHIpfHxyZShvLnZhbHVlVHlwZSxyKTtpZihvLnR5cGU9PT0icGlwZSIpcmV0dXJuIHQuX3pvZC50cmFpdHMuaGFzKCIkWm9kQ29kZWMiKT8hMDpyZShvLmluLHIpfHxyZShvLm91dCxyKTtpZihvLnR5cGU9PT0ib2JqZWN0Iil7Zm9yKGNvbnN0IGUgaW4gby5zaGFwZSlpZihyZShvLnNoYXBlW2VdLHIpKXJldHVybiEwO3JldHVybiExfWlmKG8udHlwZT09PSJ1bmlvbiIpe2Zvcihjb25zdCBlIG9mIG8ub3B0aW9ucylpZihyZShlLHIpKXJldHVybiEwO3JldHVybiExfWlmKG8udHlwZT09PSJ0dXBsZSIpe2Zvcihjb25zdCBlIG9mIG8uaXRlbXMpaWYocmUoZSxyKSlyZXR1cm4hMDtyZXR1cm4hIShvLnJlc3QmJnJlKG8ucmVzdCxyKSl9cmV0dXJuITF9Y29uc3QgZmQ9KHQsbj17fSk9PnI9Pntjb25zdCBvPUJlKHsuLi5yLHByb2Nlc3NvcnM6bn0pO3JldHVybiBDKHQsbyksVmUobyx0KSxLZShvLHQpfSxrdD0odCxuLHI9e30pPT5vPT57Y29uc3R7bGlicmFyeU9wdGlvbnM6ZSx0YXJnZXQ6aX09bz8/e30sYT1CZSh7Li4uZT8/e30sdGFyZ2V0OmksaW86bixwcm9jZXNzb3JzOnJ9KTtyZXR1cm4gQyh0LGEpLFZlKGEsdCksS2UoYSx0KX0sWWc9e2d1aWQ6InV1aWQiLHVybDoidXJpIixkYXRldGltZToiZGF0ZS10aW1lIixqc29uX3N0cmluZzoianNvbi1zdHJpbmciLHJlZ2V4OiIifSxnZD0odCxuLHIsbyk9Pntjb25zdCBlPXI7ZS50eXBlPSJzdHJpbmciO2NvbnN0e21pbmltdW06aSxtYXhpbXVtOmEsZm9ybWF0OnMscGF0dGVybnM6Yyxjb250ZW50RW5jb2Rpbmc6dX09dC5fem9kLmJhZztpZih0eXBlb2YgaT09Im51bWJlciImJihlLm1pbkxlbmd0aD1pKSx0eXBlb2YgYT09Im51bWJlciImJihlLm1heExlbmd0aD1hKSxzJiYoZS5mb3JtYXQ9WWdbc10/P3MsZS5mb3JtYXQ9PT0iIiYmZGVsZXRlIGUuZm9ybWF0LHM9PT0idGltZSImJmRlbGV0ZSBlLmZvcm1hdCksdSYmKGUuY29udGVudEVuY29kaW5nPXUpLGMmJmMuc2l6ZT4wKXtjb25zdCBsPVsuLi5jXTtsLmxlbmd0aD09PTE/ZS5wYXR0ZXJuPWxbMF0uc291cmNlOmwubGVuZ3RoPjEmJihlLmFsbE9mPVsuLi5sLm1hcChnPT4oey4uLm4udGFyZ2V0PT09ImRyYWZ0LTA3Inx8bi50YXJnZXQ9PT0iZHJhZnQtMDQifHxuLnRhcmdldD09PSJvcGVuYXBpLTMuMCI/e3R5cGU6InN0cmluZyJ9Ont9LHBhdHRlcm46Zy5zb3VyY2V9KSldKX19LHZkPSh0LG4scixvKT0+e2NvbnN0IGU9cix7bWluaW11bTppLG1heGltdW06YSxmb3JtYXQ6cyxtdWx0aXBsZU9mOmMsZXhjbHVzaXZlTWF4aW11bTp1LGV4Y2x1c2l2ZU1pbmltdW06bH09dC5fem9kLmJhZzt0eXBlb2Ygcz09InN0cmluZyImJnMuaW5jbHVkZXMoImludCIpP2UudHlwZT0iaW50ZWdlciI6ZS50eXBlPSJudW1iZXIiO2NvbnN0IGc9dHlwZW9mIGw9PSJudW1iZXIiJiZsPj0oaT8/TnVtYmVyLk5FR0FUSVZFX0lORklOSVRZKSx2PXR5cGVvZiB1PT0ibnVtYmVyIiYmdTw9KGE/P051bWJlci5QT1NJVElWRV9JTkZJTklUWSksJD1uLnRhcmdldD09PSJkcmFmdC0wNCJ8fG4udGFyZ2V0PT09Im9wZW5hcGktMy4wIjtnPyQ/KGUubWluaW11bT1sLGUuZXhjbHVzaXZlTWluaW11bT0hMCk6ZS5leGNsdXNpdmVNaW5pbXVtPWw6dHlwZW9mIGk9PSJudW1iZXIiJiYoZS5taW5pbXVtPWkpLHY/JD8oZS5tYXhpbXVtPXUsZS5leGNsdXNpdmVNYXhpbXVtPSEwKTplLmV4Y2x1c2l2ZU1heGltdW09dTp0eXBlb2YgYT09Im51bWJlciImJihlLm1heGltdW09YSksdHlwZW9mIGM9PSJudW1iZXIiJiYoZS5tdWx0aXBsZU9mPWMpfSxoZD0odCxuLHIsbyk9PntyLnR5cGU9ImJvb2xlYW4ifSwkZD0odCxuLHIsbyk9PntpZihuLnVucmVwcmVzZW50YWJsZT09PSJ0aHJvdyIpdGhyb3cgbmV3IEVycm9yKCJCaWdJbnQgY2Fubm90IGJlIHJlcHJlc2VudGVkIGluIEpTT04gU2NoZW1hIil9LF9kPSh0LG4scixvKT0+e2lmKG4udW5yZXByZXNlbnRhYmxlPT09InRocm93Iil0aHJvdyBuZXcgRXJyb3IoIlN5bWJvbHMgY2Fubm90IGJlIHJlcHJlc2VudGVkIGluIEpTT04gU2NoZW1hIil9LGJkPSh0LG4scixvKT0+e24udGFyZ2V0PT09Im9wZW5hcGktMy4wIj8oci50eXBlPSJzdHJpbmciLHIubnVsbGFibGU9ITAsci5lbnVtPVtudWxsXSk6ci50eXBlPSJudWxsIn0seWQ9KHQsbixyLG8pPT57aWYobi51bnJlcHJlc2VudGFibGU9PT0idGhyb3ciKXRocm93IG5ldyBFcnJvcigiVW5kZWZpbmVkIGNhbm5vdCBiZSByZXByZXNlbnRlZCBpbiBKU09OIFNjaGVtYSIpfSxrZD0odCxuLHIsbyk9PntpZihuLnVucmVwcmVzZW50YWJsZT09PSJ0aHJvdyIpdGhyb3cgbmV3IEVycm9yKCJWb2lkIGNhbm5vdCBiZSByZXByZXNlbnRlZCBpbiBKU09OIFNjaGVtYSIpfSxTZD0odCxuLHIsbyk9PntyLm5vdD17fX0sd2Q9KHQsbixyLG8pPT57fSxJZD0odCxuLHIsbyk9Pnt9LHpkPSh0LG4scixvKT0+e2lmKG4udW5yZXByZXNlbnRhYmxlPT09InRocm93Iil0aHJvdyBuZXcgRXJyb3IoIkRhdGUgY2Fubm90IGJlIHJlcHJlc2VudGVkIGluIEpTT04gU2NoZW1hIil9LHhkPSh0LG4scixvKT0+e2NvbnN0IGU9dC5fem9kLmRlZixpPXZpKGUuZW50cmllcyk7aS5ldmVyeShhPT50eXBlb2YgYT09Im51bWJlciIpJiYoci50eXBlPSJudW1iZXIiKSxpLmV2ZXJ5KGE9PnR5cGVvZiBhPT0ic3RyaW5nIikmJihyLnR5cGU9InN0cmluZyIpLHIuZW51bT1pfSxUZD0odCxuLHIsbyk9Pntjb25zdCBlPXQuX3pvZC5kZWYsaT1bXTtmb3IoY29uc3QgYSBvZiBlLnZhbHVlcylpZihhPT09dm9pZCAwKXtpZihuLnVucmVwcmVzZW50YWJsZT09PSJ0aHJvdyIpdGhyb3cgbmV3IEVycm9yKCJMaXRlcmFsIGB1bmRlZmluZWRgIGNhbm5vdCBiZSByZXByZXNlbnRlZCBpbiBKU09OIFNjaGVtYSIpfWVsc2UgaWYodHlwZW9mIGE9PSJiaWdpbnQiKXtpZihuLnVucmVwcmVzZW50YWJsZT09PSJ0aHJvdyIpdGhyb3cgbmV3IEVycm9yKCJCaWdJbnQgbGl0ZXJhbHMgY2Fubm90IGJlIHJlcHJlc2VudGVkIGluIEpTT04gU2NoZW1hIik7aS5wdXNoKE51bWJlcihhKSl9ZWxzZSBpLnB1c2goYSk7aWYoaS5sZW5ndGghPT0wKWlmKGkubGVuZ3RoPT09MSl7Y29uc3QgYT1pWzBdO3IudHlwZT1hPT09bnVsbD8ibnVsbCI6dHlwZW9mIGEsbi50YXJnZXQ9PT0iZHJhZnQtMDQifHxuLnRhcmdldD09PSJvcGVuYXBpLTMuMCI/ci5lbnVtPVthXTpyLmNvbnN0PWF9ZWxzZSBpLmV2ZXJ5KGE9PnR5cGVvZiBhPT0ibnVtYmVyIikmJihyLnR5cGU9Im51bWJlciIpLGkuZXZlcnkoYT0+dHlwZW9mIGE9PSJzdHJpbmciKSYmKHIudHlwZT0ic3RyaW5nIiksaS5ldmVyeShhPT50eXBlb2YgYT09ImJvb2xlYW4iKSYmKHIudHlwZT0iYm9vbGVhbiIpLGkuZXZlcnkoYT0+YT09PW51bGwpJiYoci50eXBlPSJudWxsIiksci5lbnVtPWl9LGpkPSh0LG4scixvKT0+e2lmKG4udW5yZXByZXNlbnRhYmxlPT09InRocm93Iil0aHJvdyBuZXcgRXJyb3IoIk5hTiBjYW5ub3QgYmUgcmVwcmVzZW50ZWQgaW4gSlNPTiBTY2hlbWEiKX0sT2Q9KHQsbixyLG8pPT57Y29uc3QgZT1yLGk9dC5fem9kLnBhdHRlcm47aWYoIWkpdGhyb3cgbmV3IEVycm9yKCJQYXR0ZXJuIG5vdCBmb3VuZCBpbiB0ZW1wbGF0ZSBsaXRlcmFsIik7ZS50eXBlPSJzdHJpbmciLGUucGF0dGVybj1pLnNvdXJjZX0sVWQ9KHQsbixyLG8pPT57Y29uc3QgZT1yLGk9e3R5cGU6InN0cmluZyIsZm9ybWF0OiJiaW5hcnkiLGNvbnRlbnRFbmNvZGluZzoiYmluYXJ5In0se21pbmltdW06YSxtYXhpbXVtOnMsbWltZTpjfT10Ll96b2QuYmFnO2EhPT12b2lkIDAmJihpLm1pbkxlbmd0aD1hKSxzIT09dm9pZCAwJiYoaS5tYXhMZW5ndGg9cyksYz9jLmxlbmd0aD09PTE/KGkuY29udGVudE1lZGlhVHlwZT1jWzBdLE9iamVjdC5hc3NpZ24oZSxpKSk6KE9iamVjdC5hc3NpZ24oZSxpKSxlLmFueU9mPWMubWFwKHU9Pih7Y29udGVudE1lZGlhVHlwZTp1fSkpKTpPYmplY3QuYXNzaWduKGUsaSl9LFBkPSh0LG4scixvKT0+e3IudHlwZT0iYm9vbGVhbiJ9LE5kPSh0LG4scixvKT0+e2lmKG4udW5yZXByZXNlbnRhYmxlPT09InRocm93Iil0aHJvdyBuZXcgRXJyb3IoIkN1c3RvbSB0eXBlcyBjYW5ub3QgYmUgcmVwcmVzZW50ZWQgaW4gSlNPTiBTY2hlbWEiKX0sRGQ9KHQsbixyLG8pPT57aWYobi51bnJlcHJlc2VudGFibGU9PT0idGhyb3ciKXRocm93IG5ldyBFcnJvcigiRnVuY3Rpb24gdHlwZXMgY2Fubm90IGJlIHJlcHJlc2VudGVkIGluIEpTT04gU2NoZW1hIil9LEVkPSh0LG4scixvKT0+e2lmKG4udW5yZXByZXNlbnRhYmxlPT09InRocm93Iil0aHJvdyBuZXcgRXJyb3IoIlRyYW5zZm9ybXMgY2Fubm90IGJlIHJlcHJlc2VudGVkIGluIEpTT04gU2NoZW1hIil9LFpkPSh0LG4scixvKT0+e2lmKG4udW5yZXByZXNlbnRhYmxlPT09InRocm93Iil0aHJvdyBuZXcgRXJyb3IoIk1hcCBjYW5ub3QgYmUgcmVwcmVzZW50ZWQgaW4gSlNPTiBTY2hlbWEiKX0sUmQ9KHQsbixyLG8pPT57aWYobi51bnJlcHJlc2VudGFibGU9PT0idGhyb3ciKXRocm93IG5ldyBFcnJvcigiU2V0IGNhbm5vdCBiZSByZXByZXNlbnRlZCBpbiBKU09OIFNjaGVtYSIpfSxDZD0odCxuLHIsbyk9Pntjb25zdCBlPXIsaT10Ll96b2QuZGVmLHttaW5pbXVtOmEsbWF4aW11bTpzfT10Ll96b2QuYmFnO3R5cGVvZiBhPT0ibnVtYmVyIiYmKGUubWluSXRlbXM9YSksdHlwZW9mIHM9PSJudW1iZXIiJiYoZS5tYXhJdGVtcz1zKSxlLnR5cGU9ImFycmF5IixlLml0ZW1zPUMoaS5lbGVtZW50LG4sey4uLm8scGF0aDpbLi4uby5wYXRoLCJpdGVtcyJdfSl9LEFkPSh0LG4scixvKT0+e2NvbnN0IGU9cixpPXQuX3pvZC5kZWY7ZS50eXBlPSJvYmplY3QiLGUucHJvcGVydGllcz17fTtjb25zdCBhPWkuc2hhcGU7Zm9yKGNvbnN0IHUgaW4gYSllLnByb3BlcnRpZXNbdV09QyhhW3VdLG4sey4uLm8scGF0aDpbLi4uby5wYXRoLCJwcm9wZXJ0aWVzIix1XX0pO2NvbnN0IHM9bmV3IFNldChPYmplY3Qua2V5cyhhKSksYz1uZXcgU2V0KFsuLi5zXS5maWx0ZXIodT0+e2NvbnN0IGw9aS5zaGFwZVt1XS5fem9kO3JldHVybiBuLmlvPT09ImlucHV0Ij9sLm9wdGluPT09dm9pZCAwOmwub3B0b3V0PT09dm9pZCAwfSkpO2Muc2l6ZT4wJiYoZS5yZXF1aXJlZD1BcnJheS5mcm9tKGMpKSxpLmNhdGNoYWxsPy5fem9kLmRlZi50eXBlPT09Im5ldmVyIj9lLmFkZGl0aW9uYWxQcm9wZXJ0aWVzPSExOmkuY2F0Y2hhbGw/aS5jYXRjaGFsbCYmKGUuYWRkaXRpb25hbFByb3BlcnRpZXM9QyhpLmNhdGNoYWxsLG4sey4uLm8scGF0aDpbLi4uby5wYXRoLCJhZGRpdGlvbmFsUHJvcGVydGllcyJdfSkpOm4uaW89PT0ib3V0cHV0IiYmKGUuYWRkaXRpb25hbFByb3BlcnRpZXM9ITEpfSxnbz0odCxuLHIsbyk9Pntjb25zdCBlPXQuX3pvZC5kZWYsaT1lLmluY2x1c2l2ZT09PSExLGE9ZS5vcHRpb25zLm1hcCgocyxjKT0+QyhzLG4sey4uLm8scGF0aDpbLi4uby5wYXRoLGk/Im9uZU9mIjoiYW55T2YiLGNdfSkpO2k/ci5vbmVPZj1hOnIuYW55T2Y9YX0sTGQ9KHQsbixyLG8pPT57Y29uc3QgZT10Ll96b2QuZGVmLGk9QyhlLmxlZnQsbix7Li4ubyxwYXRoOlsuLi5vLnBhdGgsImFsbE9mIiwwXX0pLGE9QyhlLnJpZ2h0LG4sey4uLm8scGF0aDpbLi4uby5wYXRoLCJhbGxPZiIsMV19KSxzPXU9PiJhbGxPZiJpbiB1JiZPYmplY3Qua2V5cyh1KS5sZW5ndGg9PT0xLGM9Wy4uLnMoaSk/aS5hbGxPZjpbaV0sLi4ucyhhKT9hLmFsbE9mOlthXV07ci5hbGxPZj1jfSxNZD0odCxuLHIsbyk9Pntjb25zdCBlPXIsaT10Ll96b2QuZGVmO2UudHlwZT0iYXJyYXkiO2NvbnN0IGE9bi50YXJnZXQ9PT0iZHJhZnQtMjAyMC0xMiI/InByZWZpeEl0ZW1zIjoiaXRlbXMiLHM9bi50YXJnZXQ9PT0iZHJhZnQtMjAyMC0xMiJ8fG4udGFyZ2V0PT09Im9wZW5hcGktMy4wIj8iaXRlbXMiOiJhZGRpdGlvbmFsSXRlbXMiLGM9aS5pdGVtcy5tYXAoKHYsJCk9PkModixuLHsuLi5vLHBhdGg6Wy4uLm8ucGF0aCxhLCRdfSkpLHU9aS5yZXN0P0MoaS5yZXN0LG4sey4uLm8scGF0aDpbLi4uby5wYXRoLHMsLi4ubi50YXJnZXQ9PT0ib3BlbmFwaS0zLjAiP1tpLml0ZW1zLmxlbmd0aF06W11dfSk6bnVsbDtuLnRhcmdldD09PSJkcmFmdC0yMDIwLTEyIj8oZS5wcmVmaXhJdGVtcz1jLHUmJihlLml0ZW1zPXUpKTpuLnRhcmdldD09PSJvcGVuYXBpLTMuMCI/KGUuaXRlbXM9e2FueU9mOmN9LHUmJmUuaXRlbXMuYW55T2YucHVzaCh1KSxlLm1pbkl0ZW1zPWMubGVuZ3RoLHV8fChlLm1heEl0ZW1zPWMubGVuZ3RoKSk6KGUuaXRlbXM9Yyx1JiYoZS5hZGRpdGlvbmFsSXRlbXM9dSkpO2NvbnN0e21pbmltdW06bCxtYXhpbXVtOmd9PXQuX3pvZC5iYWc7dHlwZW9mIGw9PSJudW1iZXIiJiYoZS5taW5JdGVtcz1sKSx0eXBlb2YgZz09Im51bWJlciImJihlLm1heEl0ZW1zPWcpfSxxZD0odCxuLHIsbyk9Pntjb25zdCBlPXIsaT10Ll96b2QuZGVmO2UudHlwZT0ib2JqZWN0Ijtjb25zdCBhPWkua2V5VHlwZSxjPWEuX3pvZC5iYWc/LnBhdHRlcm5zO2lmKGkubW9kZT09PSJsb29zZSImJmMmJmMuc2l6ZT4wKXtjb25zdCBsPUMoaS52YWx1ZVR5cGUsbix7Li4ubyxwYXRoOlsuLi5vLnBhdGgsInBhdHRlcm5Qcm9wZXJ0aWVzIiwiKiJdfSk7ZS5wYXR0ZXJuUHJvcGVydGllcz17fTtmb3IoY29uc3QgZyBvZiBjKWUucGF0dGVyblByb3BlcnRpZXNbZy5zb3VyY2VdPWx9ZWxzZShuLnRhcmdldD09PSJkcmFmdC0wNyJ8fG4udGFyZ2V0PT09ImRyYWZ0LTIwMjAtMTIiKSYmKGUucHJvcGVydHlOYW1lcz1DKGkua2V5VHlwZSxuLHsuLi5vLHBhdGg6Wy4uLm8ucGF0aCwicHJvcGVydHlOYW1lcyJdfSkpLGUuYWRkaXRpb25hbFByb3BlcnRpZXM9QyhpLnZhbHVlVHlwZSxuLHsuLi5vLHBhdGg6Wy4uLm8ucGF0aCwiYWRkaXRpb25hbFByb3BlcnRpZXMiXX0pO2NvbnN0IHU9YS5fem9kLnZhbHVlcztpZih1KXtjb25zdCBsPVsuLi51XS5maWx0ZXIoZz0+dHlwZW9mIGc9PSJzdHJpbmcifHx0eXBlb2YgZz09Im51bWJlciIpO2wubGVuZ3RoPjAmJihlLnJlcXVpcmVkPWwpfX0sRmQ9KHQsbixyLG8pPT57Y29uc3QgZT10Ll96b2QuZGVmLGk9QyhlLmlubmVyVHlwZSxuLG8pLGE9bi5zZWVuLmdldCh0KTtuLnRhcmdldD09PSJvcGVuYXBpLTMuMCI/KGEucmVmPWUuaW5uZXJUeXBlLHIubnVsbGFibGU9ITApOnIuYW55T2Y9W2kse3R5cGU6Im51bGwifV19LEpkPSh0LG4scixvKT0+e2NvbnN0IGU9dC5fem9kLmRlZjtDKGUuaW5uZXJUeXBlLG4sbyk7Y29uc3QgaT1uLnNlZW4uZ2V0KHQpO2kucmVmPWUuaW5uZXJUeXBlfSxIZD0odCxuLHIsbyk9Pntjb25zdCBlPXQuX3pvZC5kZWY7QyhlLmlubmVyVHlwZSxuLG8pO2NvbnN0IGk9bi5zZWVuLmdldCh0KTtpLnJlZj1lLmlubmVyVHlwZSxyLmRlZmF1bHQ9SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShlLmRlZmF1bHRWYWx1ZSkpfSxXZD0odCxuLHIsbyk9Pntjb25zdCBlPXQuX3pvZC5kZWY7QyhlLmlubmVyVHlwZSxuLG8pO2NvbnN0IGk9bi5zZWVuLmdldCh0KTtpLnJlZj1lLmlubmVyVHlwZSxuLmlvPT09ImlucHV0IiYmKHIuX3ByZWZhdWx0PUpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoZS5kZWZhdWx0VmFsdWUpKSl9LEJkPSh0LG4scixvKT0+e2NvbnN0IGU9dC5fem9kLmRlZjtDKGUuaW5uZXJUeXBlLG4sbyk7Y29uc3QgaT1uLnNlZW4uZ2V0KHQpO2kucmVmPWUuaW5uZXJUeXBlO2xldCBhO3RyeXthPWUuY2F0Y2hWYWx1ZSh2b2lkIDApfWNhdGNoe3Rocm93IG5ldyBFcnJvcigiRHluYW1pYyBjYXRjaCB2YWx1ZXMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gSlNPTiBTY2hlbWEiKX1yLmRlZmF1bHQ9YX0sVmQ9KHQsbixyLG8pPT57Y29uc3QgZT10Ll96b2QuZGVmLGk9ZS5pbi5fem9kLnRyYWl0cy5oYXMoIiRab2RUcmFuc2Zvcm0iKSxhPW4uaW89PT0iaW5wdXQiP2k/ZS5vdXQ6ZS5pbjplLm91dDtDKGEsbixvKTtjb25zdCBzPW4uc2Vlbi5nZXQodCk7cy5yZWY9YX0sS2Q9KHQsbixyLG8pPT57Y29uc3QgZT10Ll96b2QuZGVmO0MoZS5pbm5lclR5cGUsbixvKTtjb25zdCBpPW4uc2Vlbi5nZXQodCk7aS5yZWY9ZS5pbm5lclR5cGUsci5yZWFkT25seT0hMH0sR2Q9KHQsbixyLG8pPT57Y29uc3QgZT10Ll96b2QuZGVmO0MoZS5pbm5lclR5cGUsbixvKTtjb25zdCBpPW4uc2Vlbi5nZXQodCk7aS5yZWY9ZS5pbm5lclR5cGV9LHZvPSh0LG4scixvKT0+e2NvbnN0IGU9dC5fem9kLmRlZjtDKGUuaW5uZXJUeXBlLG4sbyk7Y29uc3QgaT1uLnNlZW4uZ2V0KHQpO2kucmVmPWUuaW5uZXJUeXBlfSxYZD0odCxuLHIsbyk9Pntjb25zdCBlPXQuX3pvZC5pbm5lclR5cGU7QyhlLG4sbyk7Y29uc3QgaT1uLnNlZW4uZ2V0KHQpO2kucmVmPWV9LGRpPXtzdHJpbmc6Z2QsbnVtYmVyOnZkLGJvb2xlYW46aGQsYmlnaW50OiRkLHN5bWJvbDpfZCxudWxsOmJkLHVuZGVmaW5lZDp5ZCx2b2lkOmtkLG5ldmVyOlNkLGFueTp3ZCx1bmtub3duOklkLGRhdGU6emQsZW51bTp4ZCxsaXRlcmFsOlRkLG5hbjpqZCx0ZW1wbGF0ZV9saXRlcmFsOk9kLGZpbGU6VWQsc3VjY2VzczpQZCxjdXN0b206TmQsZnVuY3Rpb246RGQsdHJhbnNmb3JtOkVkLG1hcDpaZCxzZXQ6UmQsYXJyYXk6Q2Qsb2JqZWN0OkFkLHVuaW9uOmdvLGludGVyc2VjdGlvbjpMZCx0dXBsZTpNZCxyZWNvcmQ6cWQsbnVsbGFibGU6RmQsbm9ub3B0aW9uYWw6SmQsZGVmYXVsdDpIZCxwcmVmYXVsdDpXZCxjYXRjaDpCZCxwaXBlOlZkLHJlYWRvbmx5OktkLHByb21pc2U6R2Qsb3B0aW9uYWw6dm8sbGF6eTpYZH07ZnVuY3Rpb24gaG8odCxuKXtpZigiX2lkbWFwImluIHQpe2NvbnN0IG89dCxlPUJlKHsuLi5uLHByb2Nlc3NvcnM6ZGl9KSxpPXt9O2Zvcihjb25zdCBjIG9mIG8uX2lkbWFwLmVudHJpZXMoKSl7Y29uc3RbdSxsXT1jO0MobCxlKX1jb25zdCBhPXt9LHM9e3JlZ2lzdHJ5Om8sdXJpOm4/LnVyaSxkZWZzOml9O2UuZXh0ZXJuYWw9cztmb3IoY29uc3QgYyBvZiBvLl9pZG1hcC5lbnRyaWVzKCkpe2NvbnN0W3UsbF09YztWZShlLGwpLGFbdV09S2UoZSxsKX1pZihPYmplY3Qua2V5cyhpKS5sZW5ndGg+MCl7Y29uc3QgYz1lLnRhcmdldD09PSJkcmFmdC0yMDIwLTEyIj8iJGRlZnMiOiJkZWZpbml0aW9ucyI7YS5fX3NoYXJlZD17W2NdOml9fXJldHVybntzY2hlbWFzOmF9fWNvbnN0IHI9QmUoey4uLm4scHJvY2Vzc29yczpkaX0pO3JldHVybiBDKHQsciksVmUocix0KSxLZShyLHQpfWNsYXNzIFFne2dldCBtZXRhZGF0YVJlZ2lzdHJ5KCl7cmV0dXJuIHRoaXMuY3R4Lm1ldGFkYXRhUmVnaXN0cnl9Z2V0IHRhcmdldCgpe3JldHVybiB0aGlzLmN0eC50YXJnZXR9Z2V0IHVucmVwcmVzZW50YWJsZSgpe3JldHVybiB0aGlzLmN0eC51bnJlcHJlc2VudGFibGV9Z2V0IG92ZXJyaWRlKCl7cmV0dXJuIHRoaXMuY3R4Lm92ZXJyaWRlfWdldCBpbygpe3JldHVybiB0aGlzLmN0eC5pb31nZXQgY291bnRlcigpe3JldHVybiB0aGlzLmN0eC5jb3VudGVyfXNldCBjb3VudGVyKG4pe3RoaXMuY3R4LmNvdW50ZXI9bn1nZXQgc2Vlbigpe3JldHVybiB0aGlzLmN0eC5zZWVufWNvbnN0cnVjdG9yKG4pe2xldCByPW4/LnRhcmdldD8/ImRyYWZ0LTIwMjAtMTIiO3I9PT0iZHJhZnQtNCImJihyPSJkcmFmdC0wNCIpLHI9PT0iZHJhZnQtNyImJihyPSJkcmFmdC0wNyIpLHRoaXMuY3R4PUJlKHtwcm9jZXNzb3JzOmRpLHRhcmdldDpyLC4uLm4/Lm1ldGFkYXRhJiZ7bWV0YWRhdGE6bi5tZXRhZGF0YX0sLi4ubj8udW5yZXByZXNlbnRhYmxlJiZ7dW5yZXByZXNlbnRhYmxlOm4udW5yZXByZXNlbnRhYmxlfSwuLi5uPy5vdmVycmlkZSYme292ZXJyaWRlOm4ub3ZlcnJpZGV9LC4uLm4/LmlvJiZ7aW86bi5pb319KX1wcm9jZXNzKG4scj17cGF0aDpbXSxzY2hlbWFQYXRoOltdfSl7cmV0dXJuIEMobix0aGlzLmN0eCxyKX1lbWl0KG4scil7ciYmKHIuY3ljbGVzJiYodGhpcy5jdHguY3ljbGVzPXIuY3ljbGVzKSxyLnJldXNlZCYmKHRoaXMuY3R4LnJldXNlZD1yLnJldXNlZCksci5leHRlcm5hbCYmKHRoaXMuY3R4LmV4dGVybmFsPXIuZXh0ZXJuYWwpKSxWZSh0aGlzLmN0eCxuKTtjb25zdCBvPUtlKHRoaXMuY3R4LG4pLHsifnN0YW5kYXJkIjplLC4uLml9PW87cmV0dXJuIGl9fWNvbnN0IGV2PU9iamVjdC5mcmVlemUoT2JqZWN0LmRlZmluZVByb3BlcnR5KHtfX3Byb3RvX186bnVsbH0sU3ltYm9sLnRvU3RyaW5nVGFnLHt2YWx1ZToiTW9kdWxlIn0pKSxZZD1PYmplY3QuZnJlZXplKE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7X19wcm90b19fOm51bGwsJFpvZEFueTpKdSwkWm9kQXJyYXk6S3UsJFpvZEFzeW5jRXJyb3I6UGUsJFpvZEJhc2U2NDpQdSwkWm9kQmFzZTY0VVJMOkR1LCRab2RCaWdJbnQ6QWksJFpvZEJpZ0ludEZvcm1hdDpMdSwkWm9kQm9vbGVhbjpDaSwkWm9kQ0lEUnY0Ok91LCRab2RDSURSdjY6VXUsJFpvZENVSUQ6JHUsJFpvZENVSUQyOl91LCRab2RDYXRjaDp2bCwkWm9kQ2hlY2s6SiwkWm9kQ2hlY2tCaWdJbnRGb3JtYXQ6VmMsJFpvZENoZWNrRW5kc1dpdGg6YXUsJFpvZENoZWNrR3JlYXRlclRoYW46RWksJFpvZENoZWNrSW5jbHVkZXM6aXUsJFpvZENoZWNrTGVuZ3RoRXF1YWxzOmV1LCRab2RDaGVja0xlc3NUaGFuOkRpLCRab2RDaGVja0xvd2VyQ2FzZTpudSwkWm9kQ2hlY2tNYXhMZW5ndGg6WWMsJFpvZENoZWNrTWF4U2l6ZTpLYywkWm9kQ2hlY2tNaW1lVHlwZTpjdSwkWm9kQ2hlY2tNaW5MZW5ndGg6UWMsJFpvZENoZWNrTWluU2l6ZTpHYywkWm9kQ2hlY2tNdWx0aXBsZU9mOldjLCRab2RDaGVja051bWJlckZvcm1hdDpCYywkWm9kQ2hlY2tPdmVyd3JpdGU6dXUsJFpvZENoZWNrUHJvcGVydHk6c3UsJFpvZENoZWNrUmVnZXg6dHUsJFpvZENoZWNrU2l6ZUVxdWFsczpYYywkWm9kQ2hlY2tTdGFydHNXaXRoOm91LCRab2RDaGVja1N0cmluZ0Zvcm1hdDpFdCwkWm9kQ2hlY2tVcHBlckNhc2U6cnUsJFpvZENvZGVjOkZpLCRab2RDdXN0b206d2wsJFpvZEN1c3RvbVN0cmluZ0Zvcm1hdDpDdSwkWm9kRGF0ZTpWdSwkWm9kRGVmYXVsdDptbCwkWm9kRGlzY3JpbWluYXRlZFVuaW9uOnRsLCRab2RFMTY0OkV1LCRab2RFbWFpbDpmdSwkWm9kRW1vamk6dnUsJFpvZEVuY29kZUVycm9yOlduLCRab2RFbnVtOmFsLCRab2RFcnJvcjpfaSwkWm9kRXhhY3RPcHRpb25hbDpsbCwkWm9kRmlsZTpjbCwkWm9kRnVuY3Rpb246eWwsJFpvZEdVSUQ6bXUsJFpvZElQdjQ6eHUsJFpvZElQdjY6VHUsJFpvZElTT0RhdGU6d3UsJFpvZElTT0RhdGVUaW1lOlN1LCRab2RJU09EdXJhdGlvbjp6dSwkWm9kSVNPVGltZTpJdSwkWm9kSW50ZXJzZWN0aW9uOm5sLCRab2RKV1Q6UnUsJFpvZEtTVUlEOmt1LCRab2RMYXp5OlNsLCRab2RMaXRlcmFsOnNsLCRab2RNQUM6anUsJFpvZE1hcDppbCwkWm9kTmFOOmhsLCRab2ROYW5vSUQ6aHUsJFpvZE5ldmVyOld1LCRab2ROb25PcHRpb25hbDpmbCwkWm9kTnVsbDpGdSwkWm9kTnVsbGFibGU6ZGwsJFpvZE51bWJlcjpSaSwkWm9kTnVtYmVyRm9ybWF0OkF1LCRab2RPYmplY3Q6WXUsJFpvZE9iamVjdEpJVDpRdSwkWm9kT3B0aW9uYWw6TWksJFpvZFBpcGU6cWksJFpvZFByZWZhdWx0OnBsLCRab2RQcmVwcm9jZXNzOiRsLCRab2RQcm9taXNlOmtsLCRab2RSZWFkb25seTpfbCwkWm9kUmVhbEVycm9yOm1lLCRab2RSZWNvcmQ6cmwsJFpvZFJlZ2lzdHJ5OlRsLCRab2RTZXQ6b2wsJFpvZFN0cmluZzpadCwkWm9kU3RyaW5nRm9ybWF0OkYsJFpvZFN1Y2Nlc3M6Z2wsJFpvZFN5bWJvbDpNdSwkWm9kVGVtcGxhdGVMaXRlcmFsOmJsLCRab2RUcmFuc2Zvcm06dWwsJFpvZFR1cGxlOkxpLCRab2RUeXBlOngsJFpvZFVMSUQ6YnUsJFpvZFVSTDpndSwkWm9kVVVJRDpwdSwkWm9kVW5kZWZpbmVkOnF1LCRab2RVbmlvbjplciwkWm9kVW5rbm93bjpIdSwkWm9kVm9pZDpCdSwkWm9kWElEOnl1LCRab2RYb3I6ZWwsJGJyYW5kOmdpLCRjb25zdHJ1Y3RvcjpkLCRpbnB1dDpXaSwkb3V0cHV0OkhpLERvYzpsdSxKU09OU2NoZW1hOmV2LEpTT05TY2hlbWFHZW5lcmF0b3I6UWcsTkVWRVI6ZmksVGltZVByZWNpc2lvbjpmbyxfYW55OllsLF9hcnJheTpvZCxfYmFzZTY0OnVvLF9iYXNlNjR1cmw6bG8sX2JpZ2ludDpIbCxfYm9vbGVhbjpGbCxfY2F0Y2g6V2csX2NoZWNrOmxkLF9jaWRydjQ6c28sX2NpZHJ2NjpjbyxfY29lcmNlZEJpZ2ludDpXbCxfY29lcmNlZEJvb2xlYW46SmwsX2NvZXJjZWREYXRlOnJkLF9jb2VyY2VkTnVtYmVyOlJsLF9jb2VyY2VkU3RyaW5nOk9sLF9jdWlkOmVvLF9jdWlkMjp0byxfY3VzdG9tOnNkLF9kYXRlOm5kLF9kZWNvZGU6d2ksX2RlY29kZUFzeW5jOnppLF9kZWZhdWx0OkZnLF9kaXNjcmltaW5hdGVkVW5pb246VWcsX2UxNjQ6bW8sX2VtYWlsOkJpLF9lbW9qaTpZaSxfZW5jb2RlOlNpLF9lbmNvZGVBc3luYzpJaSxfZW5kc1dpdGg6cXQsX2VudW06UmcsX2ZpbGU6YWQsX2Zsb2F0MzI6QWwsX2Zsb2F0NjQ6TGwsX2d0OmtlLF9ndGU6aWUsX2d1aWQ6TG4sX2luY2x1ZGVzOkx0LF9pbnQ6Q2wsX2ludDMyOk1sLF9pbnQ2NDpCbCxfaW50ZXJzZWN0aW9uOlBnLF9pcHY0Om9vLF9pcHY2OmFvLF9pc29EYXRlOk5sLF9pc29EYXRlVGltZTpQbCxfaXNvRHVyYXRpb246RWwsX2lzb1RpbWU6RGwsX2p3dDpwbyxfa3N1aWQ6aW8sX2xhenk6R2csX2xlbmd0aDpydCxfbGl0ZXJhbDpBZyxfbG93ZXJjYXNlOkN0LF9sdDp5ZSxfbHRlOnVlLF9tYWM6VWwsX21hcDpFZyxfbWF4OnVlLF9tYXhMZW5ndGg6bnQsX21heFNpemU6QWUsX21pbWU6RnQsX21pbjppZSxfbWluTGVuZ3RoOndlLF9taW5TaXplOlNlLF9tdWx0aXBsZU9mOkRlLF9uYW46aWQsX25hbm9pZDpRaSxfbmF0aXZlRW51bTpDZyxfbmVnYXRpdmU6aXIsX25ldmVyOmVkLF9ub25uZWdhdGl2ZTphcixfbm9ub3B0aW9uYWw6SmcsX25vbnBvc2l0aXZlOm9yLF9ub3JtYWxpemU6SnQsX251bGw6WGwsX251bGxhYmxlOnFnLF9udW1iZXI6WmwsX29wdGlvbmFsOk1nLF9vdmVyd3JpdGU6X2UsX3BhcnNlOmp0LF9wYXJzZUFzeW5jOk90LF9waXBlOkJnLF9wb3NpdGl2ZTpycixfcHJvbWlzZTpYZyxfcHJvcGVydHk6c3IsX3JlYWRvbmx5OlZnLF9yZWNvcmQ6RGcsX3JlZmluZTpjZCxfcmVnZXg6UnQsX3NhZmVEZWNvZGU6VGksX3NhZmVEZWNvZGVBc3luYzpPaSxfc2FmZUVuY29kZTp4aSxfc2FmZUVuY29kZUFzeW5jOmppLF9zYWZlUGFyc2U6VXQsX3NhZmVQYXJzZUFzeW5jOlB0LF9zZXQ6WmcsX3NpemU6dHQsX3NsdWdpZnk6VnQsX3N0YXJ0c1dpdGg6TXQsX3N0cmluZzpqbCxfc3RyaW5nRm9ybWF0Okt0LF9zdHJpbmdib29sOnBkLF9zdWNjZXNzOkhnLF9zdXBlclJlZmluZTp1ZCxfc3ltYm9sOktsLF90ZW1wbGF0ZUxpdGVyYWw6S2csX3RvTG93ZXJDYXNlOld0LF90b1VwcGVyQ2FzZTpCdCxfdHJhbnNmb3JtOkxnLF90cmltOkh0LF90dXBsZTpOZyxfdWludDMyOnFsLF91aW50NjQ6VmwsX3VsaWQ6bm8sX3VuZGVmaW5lZDpHbCxfdW5pb246amcsX3Vua25vd246UWwsX3VwcGVyY2FzZTpBdCxfdXJsOm5yLF91dWlkOlZpLF91dWlkdjQ6S2ksX3V1aWR2NjpHaSxfdXVpZHY3OlhpLF92b2lkOnRkLF94aWQ6cm8sX3hvcjpPZyxjbG9uZTpkZSxjb25maWc6VixjcmVhdGVTdGFuZGFyZEpTT05TY2hlbWFNZXRob2Q6a3QsY3JlYXRlVG9KU09OU2NoZW1hTWV0aG9kOmZkLGRlY29kZTphcCxkZWNvZGVBc3luYzpjcCxkZXNjcmliZTpkZCxlbmNvZGU6b3AsZW5jb2RlQXN5bmM6c3AsZXh0cmFjdERlZnM6VmUsZmluYWxpemU6S2UsZmxhdHRlbkVycm9yOlhuLGZvcm1hdEVycm9yOlluLGdsb2JhbENvbmZpZzp5dCxnbG9iYWxSZWdpc3RyeTpjZSxpbml0aWFsaXplQ29udGV4dDpCZSxpc1ZhbGlkQmFzZTY0OlppLGlzVmFsaWRCYXNlNjRVUkw6TnUsaXNWYWxpZEpXVDpadSxsb2NhbGVzOkppLG1ldGE6bWQscGFyc2U6Y2kscGFyc2VBc3luYzp1aSxwcmV0dGlmeUVycm9yOnlpLHByb2Nlc3M6QyxyZWdleGVzOlFuLHJlZ2lzdHJ5OnRyLHNhZmVEZWNvZGU6bHAsc2FmZURlY29kZUFzeW5jOm1wLHNhZmVFbmNvZGU6dXAsc2FmZUVuY29kZUFzeW5jOmRwLHNhZmVQYXJzZTpraSxzYWZlUGFyc2VBc3luYzpsYyx0b0RvdFBhdGg6dWMsdG9KU09OU2NoZW1hOmhvLHRyZWVpZnlFcnJvcjpiaSx1dGlsOiRpLHZlcnNpb246ZHV9LFN5bWJvbC50b1N0cmluZ1RhZyx7dmFsdWU6Ik1vZHVsZSJ9KSk7ZnVuY3Rpb24gJG8odCl7cmV0dXJuISF0Ll96b2R9ZnVuY3Rpb24gUWQodCxuKXtyZXR1cm4gJG8odCk/a2kodCxuKTp0LnNhZmVQYXJzZShuKX1mdW5jdGlvbiB0dih0KXtpZighdClyZXR1cm47bGV0IG47aWYoJG8odCk/bj10Ll96b2Q/LmRlZj8uc2hhcGU6bj10LnNoYXBlLCEhbil7aWYodHlwZW9mIG49PSJmdW5jdGlvbiIpdHJ5e3JldHVybiBuKCl9Y2F0Y2h7cmV0dXJufXJldHVybiBufX1mdW5jdGlvbiBudih0KXtpZigkbyh0KSl7Y29uc3QgaT10Ll96b2Q/LmRlZjtpZihpKXtpZihpLnZhbHVlIT09dm9pZCAwKXJldHVybiBpLnZhbHVlO2lmKEFycmF5LmlzQXJyYXkoaS52YWx1ZXMpJiZpLnZhbHVlcy5sZW5ndGg+MClyZXR1cm4gaS52YWx1ZXNbMF19fWNvbnN0IHI9dC5fZGVmO2lmKHIpe2lmKHIudmFsdWUhPT12b2lkIDApcmV0dXJuIHIudmFsdWU7aWYoQXJyYXkuaXNBcnJheShyLnZhbHVlcykmJnIudmFsdWVzLmxlbmd0aD4wKXJldHVybiByLnZhbHVlc1swXX1jb25zdCBvPXQudmFsdWU7aWYobyE9PXZvaWQgMClyZXR1cm4gb31jb25zdCBydj1PYmplY3QuZnJlZXplKE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7X19wcm90b19fOm51bGwsZW5kc1dpdGg6cXQsZ3Q6a2UsZ3RlOmllLGluY2x1ZGVzOkx0LGxlbmd0aDpydCxsb3dlcmNhc2U6Q3QsbHQ6eWUsbHRlOnVlLG1heExlbmd0aDpudCxtYXhTaXplOkFlLG1pbWU6RnQsbWluTGVuZ3RoOndlLG1pblNpemU6U2UsbXVsdGlwbGVPZjpEZSxuZWdhdGl2ZTppcixub25uZWdhdGl2ZTphcixub25wb3NpdGl2ZTpvcixub3JtYWxpemU6SnQsb3ZlcndyaXRlOl9lLHBvc2l0aXZlOnJyLHByb3BlcnR5OnNyLHJlZ2V4OlJ0LHNpemU6dHQsc2x1Z2lmeTpWdCxzdGFydHNXaXRoOk10LHRvTG93ZXJDYXNlOld0LHRvVXBwZXJDYXNlOkJ0LHRyaW06SHQsdXBwZXJjYXNlOkF0fSxTeW1ib2wudG9TdHJpbmdUYWcse3ZhbHVlOiJNb2R1bGUifSkpLGNyPWQoIlpvZElTT0RhdGVUaW1lIiwodCxuKT0+e1N1LmluaXQodCxuKSxBLmluaXQodCxuKX0pO2Z1bmN0aW9uIF9vKHQpe3JldHVybiBQbChjcix0KX1jb25zdCB1cj1kKCJab2RJU09EYXRlIiwodCxuKT0+e3d1LmluaXQodCxuKSxBLmluaXQodCxuKX0pO2Z1bmN0aW9uIGVtKHQpe3JldHVybiBObCh1cix0KX1jb25zdCBscj1kKCJab2RJU09UaW1lIiwodCxuKT0+e0l1LmluaXQodCxuKSxBLmluaXQodCxuKX0pO2Z1bmN0aW9uIHRtKHQpe3JldHVybiBEbChscix0KX1jb25zdCBkcj1kKCJab2RJU09EdXJhdGlvbiIsKHQsbik9Pnt6dS5pbml0KHQsbiksQS5pbml0KHQsbil9KTtmdW5jdGlvbiBubSh0KXtyZXR1cm4gRWwoZHIsdCl9Y29uc3QgYm89T2JqZWN0LmZyZWV6ZShPYmplY3QuZGVmaW5lUHJvcGVydHkoe19fcHJvdG9fXzpudWxsLFpvZElTT0RhdGU6dXIsWm9kSVNPRGF0ZVRpbWU6Y3IsWm9kSVNPRHVyYXRpb246ZHIsWm9kSVNPVGltZTpscixkYXRlOmVtLGRhdGV0aW1lOl9vLGR1cmF0aW9uOm5tLHRpbWU6dG19LFN5bWJvbC50b1N0cmluZ1RhZyx7dmFsdWU6Ik1vZHVsZSJ9KSkscm09KHQsbik9PntfaS5pbml0KHQsbiksdC5uYW1lPSJab2RFcnJvciIsT2JqZWN0LmRlZmluZVByb3BlcnRpZXModCx7Zm9ybWF0Ont2YWx1ZTpyPT5Zbih0LHIpfSxmbGF0dGVuOnt2YWx1ZTpyPT5Ybih0LHIpfSxhZGRJc3N1ZTp7dmFsdWU6cj0+e3QuaXNzdWVzLnB1c2gociksdC5tZXNzYWdlPUpTT04uc3RyaW5naWZ5KHQuaXNzdWVzLFJuLDIpfX0sYWRkSXNzdWVzOnt2YWx1ZTpyPT57dC5pc3N1ZXMucHVzaCguLi5yKSx0Lm1lc3NhZ2U9SlNPTi5zdHJpbmdpZnkodC5pc3N1ZXMsUm4sMil9fSxpc0VtcHR5OntnZXQoKXtyZXR1cm4gdC5pc3N1ZXMubGVuZ3RoPT09MH19fSl9LGltPWQoIlpvZEVycm9yIixybSksc2U9ZCgiWm9kRXJyb3IiLHJtLHtQYXJlbnQ6RXJyb3J9KSx5bz1qdChzZSksa289T3Qoc2UpLFNvPVV0KHNlKSx3bz1QdChzZSksSW89U2koc2UpLHpvPXdpKHNlKSx4bz1JaShzZSksVG89emkoc2UpLGpvPXhpKHNlKSxPbz1UaShzZSksVW89amkoc2UpLFBvPU9pKHNlKSxFcz1uZXcgV2Vha01hcDtmdW5jdGlvbiBHdCh0LG4scil7Y29uc3Qgbz1PYmplY3QuZ2V0UHJvdG90eXBlT2YodCk7bGV0IGU9RXMuZ2V0KG8pO2lmKGV8fChlPW5ldyBTZXQsRXMuc2V0KG8sZSkpLCFlLmhhcyhuKSl7ZS5hZGQobik7Zm9yKGNvbnN0IGkgaW4gcil7Y29uc3QgYT1yW2ldO09iamVjdC5kZWZpbmVQcm9wZXJ0eShvLGkse2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiExLGdldCgpe2NvbnN0IHM9YS5iaW5kKHRoaXMpO3JldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyxpLHtjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsZW51bWVyYWJsZTohMCx2YWx1ZTpzfSksc30sc2V0KHMpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLGkse2NvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCxlbnVtZXJhYmxlOiEwLHZhbHVlOnN9KX19KX19fWNvbnN0IGo9ZCgiWm9kVHlwZSIsKHQsbik9Pih4LmluaXQodCxuKSxPYmplY3QuYXNzaWduKHRbIn5zdGFuZGFyZCJdLHtqc29uU2NoZW1hOntpbnB1dDprdCh0LCJpbnB1dCIpLG91dHB1dDprdCh0LCJvdXRwdXQiKX19KSx0LnRvSlNPTlNjaGVtYT1mZCh0LHt9KSx0LmRlZj1uLHQudHlwZT1uLnR5cGUsT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9kZWYiLHt2YWx1ZTpufSksdC5wYXJzZT0ocixvKT0+eW8odCxyLG8se2NhbGxlZTp0LnBhcnNlfSksdC5zYWZlUGFyc2U9KHIsbyk9PlNvKHQscixvKSx0LnBhcnNlQXN5bmM9YXN5bmMocixvKT0+a28odCxyLG8se2NhbGxlZTp0LnBhcnNlQXN5bmN9KSx0LnNhZmVQYXJzZUFzeW5jPWFzeW5jKHIsbyk9PndvKHQscixvKSx0LnNwYT10LnNhZmVQYXJzZUFzeW5jLHQuZW5jb2RlPShyLG8pPT5Jbyh0LHIsbyksdC5kZWNvZGU9KHIsbyk9PnpvKHQscixvKSx0LmVuY29kZUFzeW5jPWFzeW5jKHIsbyk9PnhvKHQscixvKSx0LmRlY29kZUFzeW5jPWFzeW5jKHIsbyk9PlRvKHQscixvKSx0LnNhZmVFbmNvZGU9KHIsbyk9PmpvKHQscixvKSx0LnNhZmVEZWNvZGU9KHIsbyk9Pk9vKHQscixvKSx0LnNhZmVFbmNvZGVBc3luYz1hc3luYyhyLG8pPT5Vbyh0LHIsbyksdC5zYWZlRGVjb2RlQXN5bmM9YXN5bmMocixvKT0+UG8odCxyLG8pLEd0KHQsIlpvZFR5cGUiLHtjaGVjayguLi5yKXtjb25zdCBvPXRoaXMuZGVmO3JldHVybiB0aGlzLmNsb25lKCRlKG8se2NoZWNrczpbLi4uby5jaGVja3M/P1tdLC4uLnIubWFwKGU9PnR5cGVvZiBlPT0iZnVuY3Rpb24iP3tfem9kOntjaGVjazplLGRlZjp7Y2hlY2s6ImN1c3RvbSJ9LG9uYXR0YWNoOltdfX06ZSldfSkse3BhcmVudDohMH0pfSx3aXRoKC4uLnIpe3JldHVybiB0aGlzLmNoZWNrKC4uLnIpfSxjbG9uZShyLG8pe3JldHVybiBkZSh0aGlzLHIsbyl9LGJyYW5kKCl7cmV0dXJuIHRoaXN9LHJlZ2lzdGVyKHIsbyl7cmV0dXJuIHIuYWRkKHRoaXMsbyksdGhpc30scmVmaW5lKHIsbyl7cmV0dXJuIHRoaXMuY2hlY2soWXIocixvKSl9LHN1cGVyUmVmaW5lKHIsbyl7cmV0dXJuIHRoaXMuY2hlY2soUXIocixvKSl9LG92ZXJ3cml0ZShyKXtyZXR1cm4gdGhpcy5jaGVjayhfZShyKSl9LG9wdGlvbmFsKCl7cmV0dXJuIHEodGhpcyl9LGV4YWN0T3B0aW9uYWwoKXtyZXR1cm4gUHIodGhpcyl9LG51bGxhYmxlKCl7cmV0dXJuIFllKHRoaXMpfSxudWxsaXNoKCl7cmV0dXJuIHEoWWUodGhpcykpfSxub25vcHRpb25hbChyKXtyZXR1cm4gQ3IodGhpcyxyKX0sYXJyYXkoKXtyZXR1cm4gSSh0aGlzKX0sb3Iocil7cmV0dXJuIFUoW3RoaXMscl0pfSxhbmQocil7cmV0dXJuIGR0KHRoaXMscil9LHRyYW5zZm9ybShyKXtyZXR1cm4gd3QodGhpcyxibihyKSl9LGRlZmF1bHQocil7cmV0dXJuIEVyKHRoaXMscil9LHByZWZhdWx0KHIpe3JldHVybiBScih0aGlzLHIpfSxjYXRjaChyKXtyZXR1cm4gTXIodGhpcyxyKX0scGlwZShyKXtyZXR1cm4gd3QodGhpcyxyKX0scmVhZG9ubHkoKXtyZXR1cm4gSHIodGhpcyl9LGRlc2NyaWJlKHIpe2NvbnN0IG89dGhpcy5jbG9uZSgpO3JldHVybiBjZS5hZGQobyx7ZGVzY3JpcHRpb246cn0pLG99LG1ldGEoLi4ucil7aWYoci5sZW5ndGg9PT0wKXJldHVybiBjZS5nZXQodGhpcyk7Y29uc3Qgbz10aGlzLmNsb25lKCk7cmV0dXJuIGNlLmFkZChvLHJbMF0pLG99LGlzT3B0aW9uYWwoKXtyZXR1cm4gdGhpcy5zYWZlUGFyc2Uodm9pZCAwKS5zdWNjZXNzfSxpc051bGxhYmxlKCl7cmV0dXJuIHRoaXMuc2FmZVBhcnNlKG51bGwpLnN1Y2Nlc3N9LGFwcGx5KHIpe3JldHVybiByKHRoaXMpfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJkZXNjcmlwdGlvbiIse2dldCgpe3JldHVybiBjZS5nZXQodCk/LmRlc2NyaXB0aW9ufSxjb25maWd1cmFibGU6ITB9KSx0KSksWHQ9ZCgiX1pvZFN0cmluZyIsKHQsbik9PntadC5pbml0KHQsbiksai5pbml0KHQsbiksdC5fem9kLnByb2Nlc3NKU09OU2NoZW1hPShvLGUsaSk9PmdkKHQsbyxlKTtjb25zdCByPXQuX3pvZC5iYWc7dC5mb3JtYXQ9ci5mb3JtYXQ/P251bGwsdC5taW5MZW5ndGg9ci5taW5pbXVtPz9udWxsLHQubWF4TGVuZ3RoPXIubWF4aW11bT8/bnVsbCxHdCh0LCJfWm9kU3RyaW5nIix7cmVnZXgoLi4ubyl7cmV0dXJuIHRoaXMuY2hlY2soUnQoLi4ubykpfSxpbmNsdWRlcyguLi5vKXtyZXR1cm4gdGhpcy5jaGVjayhMdCguLi5vKSl9LHN0YXJ0c1dpdGgoLi4ubyl7cmV0dXJuIHRoaXMuY2hlY2soTXQoLi4ubykpfSxlbmRzV2l0aCguLi5vKXtyZXR1cm4gdGhpcy5jaGVjayhxdCguLi5vKSl9LG1pbiguLi5vKXtyZXR1cm4gdGhpcy5jaGVjayh3ZSguLi5vKSl9LG1heCguLi5vKXtyZXR1cm4gdGhpcy5jaGVjayhudCguLi5vKSl9LGxlbmd0aCguLi5vKXtyZXR1cm4gdGhpcy5jaGVjayhydCguLi5vKSl9LG5vbmVtcHR5KC4uLm8pe3JldHVybiB0aGlzLmNoZWNrKHdlKDEsLi4ubykpfSxsb3dlcmNhc2Uobyl7cmV0dXJuIHRoaXMuY2hlY2soQ3QobykpfSx1cHBlcmNhc2Uobyl7cmV0dXJuIHRoaXMuY2hlY2soQXQobykpfSx0cmltKCl7cmV0dXJuIHRoaXMuY2hlY2soSHQoKSl9LG5vcm1hbGl6ZSguLi5vKXtyZXR1cm4gdGhpcy5jaGVjayhKdCguLi5vKSl9LHRvTG93ZXJDYXNlKCl7cmV0dXJuIHRoaXMuY2hlY2soV3QoKSl9LHRvVXBwZXJDYXNlKCl7cmV0dXJuIHRoaXMuY2hlY2soQnQoKSl9LHNsdWdpZnkoKXtyZXR1cm4gdGhpcy5jaGVjayhWdCgpKX19KX0pLGl0PWQoIlpvZFN0cmluZyIsKHQsbik9PntadC5pbml0KHQsbiksWHQuaW5pdCh0LG4pLHQuZW1haWw9cj0+dC5jaGVjayhCaShZdCxyKSksdC51cmw9cj0+dC5jaGVjayhucihvdCxyKSksdC5qd3Q9cj0+dC5jaGVjayhwbyhmbixyKSksdC5lbW9qaT1yPT50LmNoZWNrKFlpKFF0LHIpKSx0Lmd1aWQ9cj0+dC5jaGVjayhMbihHZSxyKSksdC51dWlkPXI9PnQuY2hlY2soVmkoaGUscikpLHQudXVpZHY0PXI9PnQuY2hlY2soS2koaGUscikpLHQudXVpZHY2PXI9PnQuY2hlY2soR2koaGUscikpLHQudXVpZHY3PXI9PnQuY2hlY2soWGkoaGUscikpLHQubmFub2lkPXI9PnQuY2hlY2soUWkoZW4scikpLHQuZ3VpZD1yPT50LmNoZWNrKExuKEdlLHIpKSx0LmN1aWQ9cj0+dC5jaGVjayhlbyh0bixyKSksdC5jdWlkMj1yPT50LmNoZWNrKHRvKG5uLHIpKSx0LnVsaWQ9cj0+dC5jaGVjayhubyhybixyKSksdC5iYXNlNjQ9cj0+dC5jaGVjayh1byhkbixyKSksdC5iYXNlNjR1cmw9cj0+dC5jaGVjayhsbyhtbixyKSksdC54aWQ9cj0+dC5jaGVjayhybyhvbixyKSksdC5rc3VpZD1yPT50LmNoZWNrKGlvKGFuLHIpKSx0LmlwdjQ9cj0+dC5jaGVjayhvbyhzbixyKSksdC5pcHY2PXI9PnQuY2hlY2soYW8oY24scikpLHQuY2lkcnY0PXI9PnQuY2hlY2soc28odW4scikpLHQuY2lkcnY2PXI9PnQuY2hlY2soY28obG4scikpLHQuZTE2ND1yPT50LmNoZWNrKG1vKHBuLHIpKSx0LmRhdGV0aW1lPXI9PnQuY2hlY2soX28ocikpLHQuZGF0ZT1yPT50LmNoZWNrKGVtKHIpKSx0LnRpbWU9cj0+dC5jaGVjayh0bShyKSksdC5kdXJhdGlvbj1yPT50LmNoZWNrKG5tKHIpKX0pO2Z1bmN0aW9uIG0odCl7cmV0dXJuIGpsKGl0LHQpfWNvbnN0IEE9ZCgiWm9kU3RyaW5nRm9ybWF0IiwodCxuKT0+e0YuaW5pdCh0LG4pLFh0LmluaXQodCxuKX0pLFl0PWQoIlpvZEVtYWlsIiwodCxuKT0+e2Z1LmluaXQodCxuKSxBLmluaXQodCxuKX0pO2Z1bmN0aW9uIE5vKHQpe3JldHVybiBCaShZdCx0KX1jb25zdCBHZT1kKCJab2RHVUlEIiwodCxuKT0+e211LmluaXQodCxuKSxBLmluaXQodCxuKX0pO2Z1bmN0aW9uIERvKHQpe3JldHVybiBMbihHZSx0KX1jb25zdCBoZT1kKCJab2RVVUlEIiwodCxuKT0+e3B1LmluaXQodCxuKSxBLmluaXQodCxuKX0pO2Z1bmN0aW9uIEVvKHQpe3JldHVybiBWaShoZSx0KX1mdW5jdGlvbiBabyh0KXtyZXR1cm4gS2koaGUsdCl9ZnVuY3Rpb24gUm8odCl7cmV0dXJuIEdpKGhlLHQpfWZ1bmN0aW9uIENvKHQpe3JldHVybiBYaShoZSx0KX1jb25zdCBvdD1kKCJab2RVUkwiLCh0LG4pPT57Z3UuaW5pdCh0LG4pLEEuaW5pdCh0LG4pfSk7ZnVuY3Rpb24gQW8odCl7cmV0dXJuIG5yKG90LHQpfWZ1bmN0aW9uIExvKHQpe3JldHVybiBucihvdCx7cHJvdG9jb2w6UGksaG9zdG5hbWU6amMsLi4uaCh0KX0pfWNvbnN0IFF0PWQoIlpvZEVtb2ppIiwodCxuKT0+e3Z1LmluaXQodCxuKSxBLmluaXQodCxuKX0pO2Z1bmN0aW9uIE1vKHQpe3JldHVybiBZaShRdCx0KX1jb25zdCBlbj1kKCJab2ROYW5vSUQiLCh0LG4pPT57aHUuaW5pdCh0LG4pLEEuaW5pdCh0LG4pfSk7ZnVuY3Rpb24gcW8odCl7cmV0dXJuIFFpKGVuLHQpfWNvbnN0IHRuPWQoIlpvZENVSUQiLCh0LG4pPT57JHUuaW5pdCh0LG4pLEEuaW5pdCh0LG4pfSk7ZnVuY3Rpb24gRm8odCl7cmV0dXJuIGVvKHRuLHQpfWNvbnN0IG5uPWQoIlpvZENVSUQyIiwodCxuKT0+e191LmluaXQodCxuKSxBLmluaXQodCxuKX0pO2Z1bmN0aW9uIEpvKHQpe3JldHVybiB0byhubix0KX1jb25zdCBybj1kKCJab2RVTElEIiwodCxuKT0+e2J1LmluaXQodCxuKSxBLmluaXQodCxuKX0pO2Z1bmN0aW9uIEhvKHQpe3JldHVybiBubyhybix0KX1jb25zdCBvbj1kKCJab2RYSUQiLCh0LG4pPT57eXUuaW5pdCh0LG4pLEEuaW5pdCh0LG4pfSk7ZnVuY3Rpb24gV28odCl7cmV0dXJuIHJvKG9uLHQpfWNvbnN0IGFuPWQoIlpvZEtTVUlEIiwodCxuKT0+e2t1LmluaXQodCxuKSxBLmluaXQodCxuKX0pO2Z1bmN0aW9uIEJvKHQpe3JldHVybiBpbyhhbix0KX1jb25zdCBzbj1kKCJab2RJUHY0IiwodCxuKT0+e3h1LmluaXQodCxuKSxBLmluaXQodCxuKX0pO2Z1bmN0aW9uIFZvKHQpe3JldHVybiBvbyhzbix0KX1jb25zdCBtcj1kKCJab2RNQUMiLCh0LG4pPT57anUuaW5pdCh0LG4pLEEuaW5pdCh0LG4pfSk7ZnVuY3Rpb24gS28odCl7cmV0dXJuIFVsKG1yLHQpfWNvbnN0IGNuPWQoIlpvZElQdjYiLCh0LG4pPT57VHUuaW5pdCh0LG4pLEEuaW5pdCh0LG4pfSk7ZnVuY3Rpb24gR28odCl7cmV0dXJuIGFvKGNuLHQpfWNvbnN0IHVuPWQoIlpvZENJRFJ2NCIsKHQsbik9PntPdS5pbml0KHQsbiksQS5pbml0KHQsbil9KTtmdW5jdGlvbiBYbyh0KXtyZXR1cm4gc28odW4sdCl9Y29uc3QgbG49ZCgiWm9kQ0lEUnY2IiwodCxuKT0+e1V1LmluaXQodCxuKSxBLmluaXQodCxuKX0pO2Z1bmN0aW9uIFlvKHQpe3JldHVybiBjbyhsbix0KX1jb25zdCBkbj1kKCJab2RCYXNlNjQiLCh0LG4pPT57UHUuaW5pdCh0LG4pLEEuaW5pdCh0LG4pfSk7ZnVuY3Rpb24gUW8odCl7cmV0dXJuIHVvKGRuLHQpfWNvbnN0IG1uPWQoIlpvZEJhc2U2NFVSTCIsKHQsbik9PntEdS5pbml0KHQsbiksQS5pbml0KHQsbil9KTtmdW5jdGlvbiBlYSh0KXtyZXR1cm4gbG8obW4sdCl9Y29uc3QgcG49ZCgiWm9kRTE2NCIsKHQsbik9PntFdS5pbml0KHQsbiksQS5pbml0KHQsbil9KTtmdW5jdGlvbiB0YSh0KXtyZXR1cm4gbW8ocG4sdCl9Y29uc3QgZm49ZCgiWm9kSldUIiwodCxuKT0+e1J1LmluaXQodCxuKSxBLmluaXQodCxuKX0pO2Z1bmN0aW9uIG5hKHQpe3JldHVybiBwbyhmbix0KX1jb25zdCBMZT1kKCJab2RDdXN0b21TdHJpbmdGb3JtYXQiLCh0LG4pPT57Q3UuaW5pdCh0LG4pLEEuaW5pdCh0LG4pfSk7ZnVuY3Rpb24gcmEodCxuLHI9e30pe3JldHVybiBLdChMZSx0LG4scil9ZnVuY3Rpb24gaWEodCl7cmV0dXJuIEt0KExlLCJob3N0bmFtZSIsVGMsdCl9ZnVuY3Rpb24gb2EodCl7cmV0dXJuIEt0KExlLCJoZXgiLEpjLHQpfWZ1bmN0aW9uIGFhKHQsbil7Y29uc3Qgcj1uPy5lbmM/PyJoZXgiLG89YCR7dH1fJHtyfWAsZT1RbltvXTtpZighZSl0aHJvdyBuZXcgRXJyb3IoYFVucmVjb2duaXplZCBoYXNoIGZvcm1hdDogJHtvfWApO3JldHVybiBLdChMZSxvLGUsbil9Y29uc3QgYXQ9ZCgiWm9kTnVtYmVyIiwodCxuKT0+e1JpLmluaXQodCxuKSxqLmluaXQodCxuKSx0Ll96b2QucHJvY2Vzc0pTT05TY2hlbWE9KG8sZSxpKT0+dmQodCxvLGUpLEd0KHQsIlpvZE51bWJlciIse2d0KG8sZSl7cmV0dXJuIHRoaXMuY2hlY2soa2UobyxlKSl9LGd0ZShvLGUpe3JldHVybiB0aGlzLmNoZWNrKGllKG8sZSkpfSxtaW4obyxlKXtyZXR1cm4gdGhpcy5jaGVjayhpZShvLGUpKX0sbHQobyxlKXtyZXR1cm4gdGhpcy5jaGVjayh5ZShvLGUpKX0sbHRlKG8sZSl7cmV0dXJuIHRoaXMuY2hlY2sodWUobyxlKSl9LG1heChvLGUpe3JldHVybiB0aGlzLmNoZWNrKHVlKG8sZSkpfSxpbnQobyl7cmV0dXJuIHRoaXMuY2hlY2soU3QobykpfSxzYWZlKG8pe3JldHVybiB0aGlzLmNoZWNrKFN0KG8pKX0scG9zaXRpdmUobyl7cmV0dXJuIHRoaXMuY2hlY2soa2UoMCxvKSl9LG5vbm5lZ2F0aXZlKG8pe3JldHVybiB0aGlzLmNoZWNrKGllKDAsbykpfSxuZWdhdGl2ZShvKXtyZXR1cm4gdGhpcy5jaGVjayh5ZSgwLG8pKX0sbm9ucG9zaXRpdmUobyl7cmV0dXJuIHRoaXMuY2hlY2sodWUoMCxvKSl9LG11bHRpcGxlT2YobyxlKXtyZXR1cm4gdGhpcy5jaGVjayhEZShvLGUpKX0sc3RlcChvLGUpe3JldHVybiB0aGlzLmNoZWNrKERlKG8sZSkpfSxmaW5pdGUoKXtyZXR1cm4gdGhpc319KTtjb25zdCByPXQuX3pvZC5iYWc7dC5taW5WYWx1ZT1NYXRoLm1heChyLm1pbmltdW0/P051bWJlci5ORUdBVElWRV9JTkZJTklUWSxyLmV4Y2x1c2l2ZU1pbmltdW0/P051bWJlci5ORUdBVElWRV9JTkZJTklUWSk/P251bGwsdC5tYXhWYWx1ZT1NYXRoLm1pbihyLm1heGltdW0/P051bWJlci5QT1NJVElWRV9JTkZJTklUWSxyLmV4Y2x1c2l2ZU1heGltdW0/P051bWJlci5QT1NJVElWRV9JTkZJTklUWSk/P251bGwsdC5pc0ludD0oci5mb3JtYXQ/PyIiKS5pbmNsdWRlcygiaW50Iil8fE51bWJlci5pc1NhZmVJbnRlZ2VyKHIubXVsdGlwbGVPZj8/LjUpLHQuaXNGaW5pdGU9ITAsdC5mb3JtYXQ9ci5mb3JtYXQ/P251bGx9KTtmdW5jdGlvbiBUKHQpe3JldHVybiBabChhdCx0KX1jb25zdCB6ZT1kKCJab2ROdW1iZXJGb3JtYXQiLCh0LG4pPT57QXUuaW5pdCh0LG4pLGF0LmluaXQodCxuKX0pO2Z1bmN0aW9uIFN0KHQpe3JldHVybiBDbCh6ZSx0KX1mdW5jdGlvbiBzYSh0KXtyZXR1cm4gQWwoemUsdCl9ZnVuY3Rpb24gY2EodCl7cmV0dXJuIExsKHplLHQpfWZ1bmN0aW9uIHVhKHQpe3JldHVybiBNbCh6ZSx0KX1mdW5jdGlvbiBsYSh0KXtyZXR1cm4gcWwoemUsdCl9Y29uc3Qgc3Q9ZCgiWm9kQm9vbGVhbiIsKHQsbik9PntDaS5pbml0KHQsbiksai5pbml0KHQsbiksdC5fem9kLnByb2Nlc3NKU09OU2NoZW1hPShyLG8sZSk9PmhkKHQscixvKX0pO2Z1bmN0aW9uIFoodCl7cmV0dXJuIEZsKHN0LHQpfWNvbnN0IGN0PWQoIlpvZEJpZ0ludCIsKHQsbik9PntBaS5pbml0KHQsbiksai5pbml0KHQsbiksdC5fem9kLnByb2Nlc3NKU09OU2NoZW1hPShvLGUsaSk9PiRkKHQsbyksdC5ndGU9KG8sZSk9PnQuY2hlY2soaWUobyxlKSksdC5taW49KG8sZSk9PnQuY2hlY2soaWUobyxlKSksdC5ndD0obyxlKT0+dC5jaGVjayhrZShvLGUpKSx0Lmd0ZT0obyxlKT0+dC5jaGVjayhpZShvLGUpKSx0Lm1pbj0obyxlKT0+dC5jaGVjayhpZShvLGUpKSx0Lmx0PShvLGUpPT50LmNoZWNrKHllKG8sZSkpLHQubHRlPShvLGUpPT50LmNoZWNrKHVlKG8sZSkpLHQubWF4PShvLGUpPT50LmNoZWNrKHVlKG8sZSkpLHQucG9zaXRpdmU9bz0+dC5jaGVjayhrZShCaWdJbnQoMCksbykpLHQubmVnYXRpdmU9bz0+dC5jaGVjayh5ZShCaWdJbnQoMCksbykpLHQubm9ucG9zaXRpdmU9bz0+dC5jaGVjayh1ZShCaWdJbnQoMCksbykpLHQubm9ubmVnYXRpdmU9bz0+dC5jaGVjayhpZShCaWdJbnQoMCksbykpLHQubXVsdGlwbGVPZj0obyxlKT0+dC5jaGVjayhEZShvLGUpKTtjb25zdCByPXQuX3pvZC5iYWc7dC5taW5WYWx1ZT1yLm1pbmltdW0/P251bGwsdC5tYXhWYWx1ZT1yLm1heGltdW0/P251bGwsdC5mb3JtYXQ9ci5mb3JtYXQ/P251bGx9KTtmdW5jdGlvbiBkYSh0KXtyZXR1cm4gSGwoY3QsdCl9Y29uc3QgZ249ZCgiWm9kQmlnSW50Rm9ybWF0IiwodCxuKT0+e0x1LmluaXQodCxuKSxjdC5pbml0KHQsbil9KTtmdW5jdGlvbiBtYSh0KXtyZXR1cm4gQmwoZ24sdCl9ZnVuY3Rpb24gcGEodCl7cmV0dXJuIFZsKGduLHQpfWNvbnN0IHByPWQoIlpvZFN5bWJvbCIsKHQsbik9PntNdS5pbml0KHQsbiksai5pbml0KHQsbiksdC5fem9kLnByb2Nlc3NKU09OU2NoZW1hPShyLG8sZSk9Pl9kKHQscil9KTtmdW5jdGlvbiBmYSh0KXtyZXR1cm4gS2wocHIsdCl9Y29uc3QgZnI9ZCgiWm9kVW5kZWZpbmVkIiwodCxuKT0+e3F1LmluaXQodCxuKSxqLmluaXQodCxuKSx0Ll96b2QucHJvY2Vzc0pTT05TY2hlbWE9KHIsbyxlKT0+eWQodCxyKX0pO2Z1bmN0aW9uIFhlKHQpe3JldHVybiBHbChmcix0KX1jb25zdCBncj1kKCJab2ROdWxsIiwodCxuKT0+e0Z1LmluaXQodCxuKSxqLmluaXQodCxuKSx0Ll96b2QucHJvY2Vzc0pTT05TY2hlbWE9KHIsbyxlKT0+YmQodCxyLG8pfSk7ZnVuY3Rpb24gdm4odCl7cmV0dXJuIFhsKGdyLHQpfWNvbnN0IHZyPWQoIlpvZEFueSIsKHQsbik9PntKdS5pbml0KHQsbiksai5pbml0KHQsbiksdC5fem9kLnByb2Nlc3NKU09OU2NoZW1hPShyLG8sZSk9PndkKCl9KTtmdW5jdGlvbiBobigpe3JldHVybiBZbCh2cil9Y29uc3QgaHI9ZCgiWm9kVW5rbm93biIsKHQsbik9PntIdS5pbml0KHQsbiksai5pbml0KHQsbiksdC5fem9kLnByb2Nlc3NKU09OU2NoZW1hPShyLG8sZSk9PklkKCl9KTtmdW5jdGlvbiBFKCl7cmV0dXJuIFFsKGhyKX1jb25zdCAkcj1kKCJab2ROZXZlciIsKHQsbik9PntXdS5pbml0KHQsbiksai5pbml0KHQsbiksdC5fem9kLnByb2Nlc3NKU09OU2NoZW1hPShyLG8sZSk9PlNkKHQscixvKX0pO2Z1bmN0aW9uIEVlKHQpe3JldHVybiBlZCgkcix0KX1jb25zdCBfcj1kKCJab2RWb2lkIiwodCxuKT0+e0J1LmluaXQodCxuKSxqLmluaXQodCxuKSx0Ll96b2QucHJvY2Vzc0pTT05TY2hlbWE9KHIsbyxlKT0+a2QodCxyKX0pO2Z1bmN0aW9uIGdhKHQpe3JldHVybiB0ZChfcix0KX1jb25zdCAkbj1kKCJab2REYXRlIiwodCxuKT0+e1Z1LmluaXQodCxuKSxqLmluaXQodCxuKSx0Ll96b2QucHJvY2Vzc0pTT05TY2hlbWE9KG8sZSxpKT0+emQodCxvKSx0Lm1pbj0obyxlKT0+dC5jaGVjayhpZShvLGUpKSx0Lm1heD0obyxlKT0+dC5jaGVjayh1ZShvLGUpKTtjb25zdCByPXQuX3pvZC5iYWc7dC5taW5EYXRlPXIubWluaW11bT9uZXcgRGF0ZShyLm1pbmltdW0pOm51bGwsdC5tYXhEYXRlPXIubWF4aW11bT9uZXcgRGF0ZShyLm1heGltdW0pOm51bGx9KTtmdW5jdGlvbiB2YSh0KXtyZXR1cm4gbmQoJG4sdCl9Y29uc3QgYnI9ZCgiWm9kQXJyYXkiLCh0LG4pPT57S3UuaW5pdCh0LG4pLGouaW5pdCh0LG4pLHQuX3pvZC5wcm9jZXNzSlNPTlNjaGVtYT0ocixvLGUpPT5DZCh0LHIsbyxlKSx0LmVsZW1lbnQ9bi5lbGVtZW50LEd0KHQsIlpvZEFycmF5Iix7bWluKHIsbyl7cmV0dXJuIHRoaXMuY2hlY2sod2UocixvKSl9LG5vbmVtcHR5KHIpe3JldHVybiB0aGlzLmNoZWNrKHdlKDEscikpfSxtYXgocixvKXtyZXR1cm4gdGhpcy5jaGVjayhudChyLG8pKX0sbGVuZ3RoKHIsbyl7cmV0dXJuIHRoaXMuY2hlY2socnQocixvKSl9LHVud3JhcCgpe3JldHVybiB0aGlzLmVsZW1lbnR9fSl9KTtmdW5jdGlvbiBJKHQsbil7cmV0dXJuIG9kKGJyLHQsbil9ZnVuY3Rpb24gaGEodCl7Y29uc3Qgbj10Ll96b2QuZGVmLnNoYXBlO3JldHVybiBRKE9iamVjdC5rZXlzKG4pKX1jb25zdCB1dD1kKCJab2RPYmplY3QiLCh0LG4pPT57UXUuaW5pdCh0LG4pLGouaW5pdCh0LG4pLHQuX3pvZC5wcm9jZXNzSlNPTlNjaGVtYT0ocixvLGUpPT5BZCh0LHIsbyxlKSxPKHQsInNoYXBlIiwoKT0+bi5zaGFwZSksR3QodCwiWm9kT2JqZWN0Iix7a2V5b2YoKXtyZXR1cm4gUShPYmplY3Qua2V5cyh0aGlzLl96b2QuZGVmLnNoYXBlKSl9LGNhdGNoYWxsKHIpe3JldHVybiB0aGlzLmNsb25lKHsuLi50aGlzLl96b2QuZGVmLGNhdGNoYWxsOnJ9KX0scGFzc3Rocm91Z2goKXtyZXR1cm4gdGhpcy5jbG9uZSh7Li4udGhpcy5fem9kLmRlZixjYXRjaGFsbDpFKCl9KX0sbG9vc2UoKXtyZXR1cm4gdGhpcy5jbG9uZSh7Li4udGhpcy5fem9kLmRlZixjYXRjaGFsbDpFKCl9KX0sc3RyaWN0KCl7cmV0dXJuIHRoaXMuY2xvbmUoey4uLnRoaXMuX3pvZC5kZWYsY2F0Y2hhbGw6RWUoKX0pfSxzdHJpcCgpe3JldHVybiB0aGlzLmNsb25lKHsuLi50aGlzLl96b2QuZGVmLGNhdGNoYWxsOnZvaWQgMH0pfSxleHRlbmQocil7cmV0dXJuIGVjKHRoaXMscil9LHNhZmVFeHRlbmQocil7cmV0dXJuIHRjKHRoaXMscil9LG1lcmdlKHIpe3JldHVybiBuYyh0aGlzLHIpfSxwaWNrKHIpe3JldHVybiBZcyh0aGlzLHIpfSxvbWl0KHIpe3JldHVybiBRcyh0aGlzLHIpfSxwYXJ0aWFsKC4uLnIpe3JldHVybiByYyh5bix0aGlzLHJbMF0pfSxyZXF1aXJlZCguLi5yKXtyZXR1cm4gaWMoa24sdGhpcyxyWzBdKX19KX0pO2Z1bmN0aW9uIGYodCxuKXtjb25zdCByPXt0eXBlOiJvYmplY3QiLHNoYXBlOnQ/P3t9LC4uLmgobil9O3JldHVybiBuZXcgdXQocil9ZnVuY3Rpb24gJGEodCxuKXtyZXR1cm4gbmV3IHV0KHt0eXBlOiJvYmplY3QiLHNoYXBlOnQsY2F0Y2hhbGw6RWUoKSwuLi5oKG4pfSl9ZnVuY3Rpb24gWSh0LG4pe3JldHVybiBuZXcgdXQoe3R5cGU6Im9iamVjdCIsc2hhcGU6dCxjYXRjaGFsbDpFKCksLi4uaChuKX0pfWNvbnN0IGx0PWQoIlpvZFVuaW9uIiwodCxuKT0+e2VyLmluaXQodCxuKSxqLmluaXQodCxuKSx0Ll96b2QucHJvY2Vzc0pTT05TY2hlbWE9KHIsbyxlKT0+Z28odCxyLG8sZSksdC5vcHRpb25zPW4ub3B0aW9uc30pO2Z1bmN0aW9uIFUodCxuKXtyZXR1cm4gbmV3IGx0KHt0eXBlOiJ1bmlvbiIsb3B0aW9uczp0LC4uLmgobil9KX1jb25zdCB5cj1kKCJab2RYb3IiLCh0LG4pPT57bHQuaW5pdCh0LG4pLGVsLmluaXQodCxuKSx0Ll96b2QucHJvY2Vzc0pTT05TY2hlbWE9KHIsbyxlKT0+Z28odCxyLG8sZSksdC5vcHRpb25zPW4ub3B0aW9uc30pO2Z1bmN0aW9uIF9hKHQsbil7cmV0dXJuIG5ldyB5cih7dHlwZToidW5pb24iLG9wdGlvbnM6dCxpbmNsdXNpdmU6ITEsLi4uaChuKX0pfWNvbnN0IGtyPWQoIlpvZERpc2NyaW1pbmF0ZWRVbmlvbiIsKHQsbik9PntsdC5pbml0KHQsbiksdGwuaW5pdCh0LG4pfSk7ZnVuY3Rpb24gX24odCxuLHIpe3JldHVybiBuZXcga3Ioe3R5cGU6InVuaW9uIixvcHRpb25zOm4sZGlzY3JpbWluYXRvcjp0LC4uLmgocil9KX1jb25zdCBTcj1kKCJab2RJbnRlcnNlY3Rpb24iLCh0LG4pPT57bmwuaW5pdCh0LG4pLGouaW5pdCh0LG4pLHQuX3pvZC5wcm9jZXNzSlNPTlNjaGVtYT0ocixvLGUpPT5MZCh0LHIsbyxlKX0pO2Z1bmN0aW9uIGR0KHQsbil7cmV0dXJuIG5ldyBTcih7dHlwZToiaW50ZXJzZWN0aW9uIixsZWZ0OnQscmlnaHQ6bn0pfWNvbnN0IHdyPWQoIlpvZFR1cGxlIiwodCxuKT0+e0xpLmluaXQodCxuKSxqLmluaXQodCxuKSx0Ll96b2QucHJvY2Vzc0pTT05TY2hlbWE9KHIsbyxlKT0+TWQodCxyLG8sZSksdC5yZXN0PXI9PnQuY2xvbmUoey4uLnQuX3pvZC5kZWYscmVzdDpyfSl9KTtmdW5jdGlvbiBJcih0LG4scil7Y29uc3Qgbz1uIGluc3RhbmNlb2YgeCxlPW8/cjpuLGk9bz9uOm51bGw7cmV0dXJuIG5ldyB3cih7dHlwZToidHVwbGUiLGl0ZW1zOnQscmVzdDppLC4uLmgoZSl9KX1jb25zdCBaZT1kKCJab2RSZWNvcmQiLCh0LG4pPT57cmwuaW5pdCh0LG4pLGouaW5pdCh0LG4pLHQuX3pvZC5wcm9jZXNzSlNPTlNjaGVtYT0ocixvLGUpPT5xZCh0LHIsbyxlKSx0LmtleVR5cGU9bi5rZXlUeXBlLHQudmFsdWVUeXBlPW4udmFsdWVUeXBlfSk7ZnVuY3Rpb24gUCh0LG4scil7cmV0dXJuIW58fCFuLl96b2Q/bmV3IFplKHt0eXBlOiJyZWNvcmQiLGtleVR5cGU6bSgpLHZhbHVlVHlwZTp0LC4uLmgobil9KTpuZXcgWmUoe3R5cGU6InJlY29yZCIsa2V5VHlwZTp0LHZhbHVlVHlwZTpuLC4uLmgocil9KX1mdW5jdGlvbiBiYSh0LG4scil7Y29uc3Qgbz1kZSh0KTtyZXR1cm4gby5fem9kLnZhbHVlcz12b2lkIDAsbmV3IFplKHt0eXBlOiJyZWNvcmQiLGtleVR5cGU6byx2YWx1ZVR5cGU6biwuLi5oKHIpfSl9ZnVuY3Rpb24geWEodCxuLHIpe3JldHVybiBuZXcgWmUoe3R5cGU6InJlY29yZCIsa2V5VHlwZTp0LHZhbHVlVHlwZTpuLG1vZGU6Imxvb3NlIiwuLi5oKHIpfSl9Y29uc3QgenI9ZCgiWm9kTWFwIiwodCxuKT0+e2lsLmluaXQodCxuKSxqLmluaXQodCxuKSx0Ll96b2QucHJvY2Vzc0pTT05TY2hlbWE9KHIsbyxlKT0+WmQodCxyKSx0LmtleVR5cGU9bi5rZXlUeXBlLHQudmFsdWVUeXBlPW4udmFsdWVUeXBlLHQubWluPSguLi5yKT0+dC5jaGVjayhTZSguLi5yKSksdC5ub25lbXB0eT1yPT50LmNoZWNrKFNlKDEscikpLHQubWF4PSguLi5yKT0+dC5jaGVjayhBZSguLi5yKSksdC5zaXplPSguLi5yKT0+dC5jaGVjayh0dCguLi5yKSl9KTtmdW5jdGlvbiBrYSh0LG4scil7cmV0dXJuIG5ldyB6cih7dHlwZToibWFwIixrZXlUeXBlOnQsdmFsdWVUeXBlOm4sLi4uaChyKX0pfWNvbnN0IHhyPWQoIlpvZFNldCIsKHQsbik9PntvbC5pbml0KHQsbiksai5pbml0KHQsbiksdC5fem9kLnByb2Nlc3NKU09OU2NoZW1hPShyLG8sZSk9PlJkKHQsciksdC5taW49KC4uLnIpPT50LmNoZWNrKFNlKC4uLnIpKSx0Lm5vbmVtcHR5PXI9PnQuY2hlY2soU2UoMSxyKSksdC5tYXg9KC4uLnIpPT50LmNoZWNrKEFlKC4uLnIpKSx0LnNpemU9KC4uLnIpPT50LmNoZWNrKHR0KC4uLnIpKX0pO2Z1bmN0aW9uIFNhKHQsbil7cmV0dXJuIG5ldyB4cih7dHlwZToic2V0Iix2YWx1ZVR5cGU6dCwuLi5oKG4pfSl9Y29uc3QgUmU9ZCgiWm9kRW51bSIsKHQsbik9PnthbC5pbml0KHQsbiksai5pbml0KHQsbiksdC5fem9kLnByb2Nlc3NKU09OU2NoZW1hPShvLGUsaSk9PnhkKHQsbyxlKSx0LmVudW09bi5lbnRyaWVzLHQub3B0aW9ucz1PYmplY3QudmFsdWVzKG4uZW50cmllcyk7Y29uc3Qgcj1uZXcgU2V0KE9iamVjdC5rZXlzKG4uZW50cmllcykpO3QuZXh0cmFjdD0obyxlKT0+e2NvbnN0IGk9e307Zm9yKGNvbnN0IGEgb2YgbylpZihyLmhhcyhhKSlpW2FdPW4uZW50cmllc1thXTtlbHNlIHRocm93IG5ldyBFcnJvcihgS2V5ICR7YX0gbm90IGZvdW5kIGluIGVudW1gKTtyZXR1cm4gbmV3IFJlKHsuLi5uLGNoZWNrczpbXSwuLi5oKGUpLGVudHJpZXM6aX0pfSx0LmV4Y2x1ZGU9KG8sZSk9Pntjb25zdCBpPXsuLi5uLmVudHJpZXN9O2Zvcihjb25zdCBhIG9mIG8paWYoci5oYXMoYSkpZGVsZXRlIGlbYV07ZWxzZSB0aHJvdyBuZXcgRXJyb3IoYEtleSAke2F9IG5vdCBmb3VuZCBpbiBlbnVtYCk7cmV0dXJuIG5ldyBSZSh7Li4ubixjaGVja3M6W10sLi4uaChlKSxlbnRyaWVzOml9KX19KTtmdW5jdGlvbiBRKHQsbil7Y29uc3Qgcj1BcnJheS5pc0FycmF5KHQpP09iamVjdC5mcm9tRW50cmllcyh0Lm1hcChvPT5bbyxvXSkpOnQ7cmV0dXJuIG5ldyBSZSh7dHlwZToiZW51bSIsZW50cmllczpyLC4uLmgobil9KX1mdW5jdGlvbiB3YSh0LG4pe3JldHVybiBuZXcgUmUoe3R5cGU6ImVudW0iLGVudHJpZXM6dCwuLi5oKG4pfSl9Y29uc3QgVHI9ZCgiWm9kTGl0ZXJhbCIsKHQsbik9PntzbC5pbml0KHQsbiksai5pbml0KHQsbiksdC5fem9kLnByb2Nlc3NKU09OU2NoZW1hPShyLG8sZSk9PlRkKHQscixvKSx0LnZhbHVlcz1uZXcgU2V0KG4udmFsdWVzKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCwidmFsdWUiLHtnZXQoKXtpZihuLnZhbHVlcy5sZW5ndGg+MSl0aHJvdyBuZXcgRXJyb3IoIlRoaXMgc2NoZW1hIGNvbnRhaW5zIG11bHRpcGxlIHZhbGlkIGxpdGVyYWwgdmFsdWVzLiBVc2UgYC52YWx1ZXNgIGluc3RlYWQuIik7cmV0dXJuIG4udmFsdWVzWzBdfX0pfSk7ZnVuY3Rpb24gcCh0LG4pe3JldHVybiBuZXcgVHIoe3R5cGU6ImxpdGVyYWwiLHZhbHVlczpBcnJheS5pc0FycmF5KHQpP3Q6W3RdLC4uLmgobil9KX1jb25zdCBqcj1kKCJab2RGaWxlIiwodCxuKT0+e2NsLmluaXQodCxuKSxqLmluaXQodCxuKSx0Ll96b2QucHJvY2Vzc0pTT05TY2hlbWE9KHIsbyxlKT0+VWQodCxyLG8pLHQubWluPShyLG8pPT50LmNoZWNrKFNlKHIsbykpLHQubWF4PShyLG8pPT50LmNoZWNrKEFlKHIsbykpLHQubWltZT0ocixvKT0+dC5jaGVjayhGdChBcnJheS5pc0FycmF5KHIpP3I6W3JdLG8pKX0pO2Z1bmN0aW9uIElhKHQpe3JldHVybiBhZChqcix0KX1jb25zdCBPcj1kKCJab2RUcmFuc2Zvcm0iLCh0LG4pPT57dWwuaW5pdCh0LG4pLGouaW5pdCh0LG4pLHQuX3pvZC5wcm9jZXNzSlNPTlNjaGVtYT0ocixvLGUpPT5FZCh0LHIpLHQuX3pvZC5wYXJzZT0ocixvKT0+e2lmKG8uZGlyZWN0aW9uPT09ImJhY2t3YXJkIil0aHJvdyBuZXcgV24odC5jb25zdHJ1Y3Rvci5uYW1lKTtyLmFkZElzc3VlPWk9PntpZih0eXBlb2YgaT09InN0cmluZyIpci5pc3N1ZXMucHVzaChIZShpLHIudmFsdWUsbikpO2Vsc2V7Y29uc3QgYT1pO2EuZmF0YWwmJihhLmNvbnRpbnVlPSExKSxhLmNvZGU/PyhhLmNvZGU9ImN1c3RvbSIpLGEuaW5wdXQ/PyhhLmlucHV0PXIudmFsdWUpLGEuaW5zdD8/KGEuaW5zdD10KSxyLmlzc3Vlcy5wdXNoKEhlKGEpKX19O2NvbnN0IGU9bi50cmFuc2Zvcm0oci52YWx1ZSxyKTtyZXR1cm4gZSBpbnN0YW5jZW9mIFByb21pc2U/ZS50aGVuKGk9PihyLnZhbHVlPWksci5mYWxsYmFjaz0hMCxyKSk6KHIudmFsdWU9ZSxyLmZhbGxiYWNrPSEwLHIpfX0pO2Z1bmN0aW9uIGJuKHQpe3JldHVybiBuZXcgT3Ioe3R5cGU6InRyYW5zZm9ybSIsdHJhbnNmb3JtOnR9KX1jb25zdCB5bj1kKCJab2RPcHRpb25hbCIsKHQsbik9PntNaS5pbml0KHQsbiksai5pbml0KHQsbiksdC5fem9kLnByb2Nlc3NKU09OU2NoZW1hPShyLG8sZSk9PnZvKHQscixvLGUpLHQudW53cmFwPSgpPT50Ll96b2QuZGVmLmlubmVyVHlwZX0pO2Z1bmN0aW9uIHEodCl7cmV0dXJuIG5ldyB5bih7dHlwZToib3B0aW9uYWwiLGlubmVyVHlwZTp0fSl9Y29uc3QgVXI9ZCgiWm9kRXhhY3RPcHRpb25hbCIsKHQsbik9PntsbC5pbml0KHQsbiksai5pbml0KHQsbiksdC5fem9kLnByb2Nlc3NKU09OU2NoZW1hPShyLG8sZSk9PnZvKHQscixvLGUpLHQudW53cmFwPSgpPT50Ll96b2QuZGVmLmlubmVyVHlwZX0pO2Z1bmN0aW9uIFByKHQpe3JldHVybiBuZXcgVXIoe3R5cGU6Im9wdGlvbmFsIixpbm5lclR5cGU6dH0pfWNvbnN0IE5yPWQoIlpvZE51bGxhYmxlIiwodCxuKT0+e2RsLmluaXQodCxuKSxqLmluaXQodCxuKSx0Ll96b2QucHJvY2Vzc0pTT05TY2hlbWE9KHIsbyxlKT0+RmQodCxyLG8sZSksdC51bndyYXA9KCk9PnQuX3pvZC5kZWYuaW5uZXJUeXBlfSk7ZnVuY3Rpb24gWWUodCl7cmV0dXJuIG5ldyBOcih7dHlwZToibnVsbGFibGUiLGlubmVyVHlwZTp0fSl9ZnVuY3Rpb24gemEodCl7cmV0dXJuIHEoWWUodCkpfWNvbnN0IERyPWQoIlpvZERlZmF1bHQiLCh0LG4pPT57bWwuaW5pdCh0LG4pLGouaW5pdCh0LG4pLHQuX3pvZC5wcm9jZXNzSlNPTlNjaGVtYT0ocixvLGUpPT5IZCh0LHIsbyxlKSx0LnVud3JhcD0oKT0+dC5fem9kLmRlZi5pbm5lclR5cGUsdC5yZW1vdmVEZWZhdWx0PXQudW53cmFwfSk7ZnVuY3Rpb24gRXIodCxuKXtyZXR1cm4gbmV3IERyKHt0eXBlOiJkZWZhdWx0Iixpbm5lclR5cGU6dCxnZXQgZGVmYXVsdFZhbHVlKCl7cmV0dXJuIHR5cGVvZiBuPT0iZnVuY3Rpb24iP24oKTpWbihuKX19KX1jb25zdCBacj1kKCJab2RQcmVmYXVsdCIsKHQsbik9PntwbC5pbml0KHQsbiksai5pbml0KHQsbiksdC5fem9kLnByb2Nlc3NKU09OU2NoZW1hPShyLG8sZSk9PldkKHQscixvLGUpLHQudW53cmFwPSgpPT50Ll96b2QuZGVmLmlubmVyVHlwZX0pO2Z1bmN0aW9uIFJyKHQsbil7cmV0dXJuIG5ldyBacih7dHlwZToicHJlZmF1bHQiLGlubmVyVHlwZTp0LGdldCBkZWZhdWx0VmFsdWUoKXtyZXR1cm4gdHlwZW9mIG49PSJmdW5jdGlvbiI/bigpOlZuKG4pfX0pfWNvbnN0IGtuPWQoIlpvZE5vbk9wdGlvbmFsIiwodCxuKT0+e2ZsLmluaXQodCxuKSxqLmluaXQodCxuKSx0Ll96b2QucHJvY2Vzc0pTT05TY2hlbWE9KHIsbyxlKT0+SmQodCxyLG8sZSksdC51bndyYXA9KCk9PnQuX3pvZC5kZWYuaW5uZXJUeXBlfSk7ZnVuY3Rpb24gQ3IodCxuKXtyZXR1cm4gbmV3IGtuKHt0eXBlOiJub25vcHRpb25hbCIsaW5uZXJUeXBlOnQsLi4uaChuKX0pfWNvbnN0IEFyPWQoIlpvZFN1Y2Nlc3MiLCh0LG4pPT57Z2wuaW5pdCh0LG4pLGouaW5pdCh0LG4pLHQuX3pvZC5wcm9jZXNzSlNPTlNjaGVtYT0ocixvLGUpPT5QZCh0LHIsbyksdC51bndyYXA9KCk9PnQuX3pvZC5kZWYuaW5uZXJUeXBlfSk7ZnVuY3Rpb24geGEodCl7cmV0dXJuIG5ldyBBcih7dHlwZToic3VjY2VzcyIsaW5uZXJUeXBlOnR9KX1jb25zdCBMcj1kKCJab2RDYXRjaCIsKHQsbik9Pnt2bC5pbml0KHQsbiksai5pbml0KHQsbiksdC5fem9kLnByb2Nlc3NKU09OU2NoZW1hPShyLG8sZSk9PkJkKHQscixvLGUpLHQudW53cmFwPSgpPT50Ll96b2QuZGVmLmlubmVyVHlwZSx0LnJlbW92ZUNhdGNoPXQudW53cmFwfSk7ZnVuY3Rpb24gTXIodCxuKXtyZXR1cm4gbmV3IExyKHt0eXBlOiJjYXRjaCIsaW5uZXJUeXBlOnQsY2F0Y2hWYWx1ZTp0eXBlb2Ygbj09ImZ1bmN0aW9uIj9uOigpPT5ufSl9Y29uc3QgcXI9ZCgiWm9kTmFOIiwodCxuKT0+e2hsLmluaXQodCxuKSxqLmluaXQodCxuKSx0Ll96b2QucHJvY2Vzc0pTT05TY2hlbWE9KHIsbyxlKT0+amQodCxyKX0pO2Z1bmN0aW9uIFRhKHQpe3JldHVybiBpZChxcix0KX1jb25zdCBtdD1kKCJab2RQaXBlIiwodCxuKT0+e3FpLmluaXQodCxuKSxqLmluaXQodCxuKSx0Ll96b2QucHJvY2Vzc0pTT05TY2hlbWE9KHIsbyxlKT0+VmQodCxyLG8sZSksdC5pbj1uLmluLHQub3V0PW4ub3V0fSk7ZnVuY3Rpb24gd3QodCxuKXtyZXR1cm4gbmV3IG10KHt0eXBlOiJwaXBlIixpbjp0LG91dDpufSl9Y29uc3QgcHQ9ZCgiWm9kQ29kZWMiLCh0LG4pPT57bXQuaW5pdCh0LG4pLEZpLmluaXQodCxuKX0pO2Z1bmN0aW9uIGphKHQsbixyKXtyZXR1cm4gbmV3IHB0KHt0eXBlOiJwaXBlIixpbjp0LG91dDpuLHRyYW5zZm9ybTpyLmRlY29kZSxyZXZlcnNlVHJhbnNmb3JtOnIuZW5jb2RlfSl9ZnVuY3Rpb24gT2EodCl7Y29uc3Qgbj10Ll96b2QuZGVmO3JldHVybiBuZXcgcHQoe3R5cGU6InBpcGUiLGluOm4ub3V0LG91dDpuLmluLHRyYW5zZm9ybTpuLnJldmVyc2VUcmFuc2Zvcm0scmV2ZXJzZVRyYW5zZm9ybTpuLnRyYW5zZm9ybX0pfWNvbnN0IEZyPWQoIlpvZFByZXByb2Nlc3MiLCh0LG4pPT57bXQuaW5pdCh0LG4pLCRsLmluaXQodCxuKX0pLEpyPWQoIlpvZFJlYWRvbmx5IiwodCxuKT0+e19sLmluaXQodCxuKSxqLmluaXQodCxuKSx0Ll96b2QucHJvY2Vzc0pTT05TY2hlbWE9KHIsbyxlKT0+S2QodCxyLG8sZSksdC51bndyYXA9KCk9PnQuX3pvZC5kZWYuaW5uZXJUeXBlfSk7ZnVuY3Rpb24gSHIodCl7cmV0dXJuIG5ldyBKcih7dHlwZToicmVhZG9ubHkiLGlubmVyVHlwZTp0fSl9Y29uc3QgV3I9ZCgiWm9kVGVtcGxhdGVMaXRlcmFsIiwodCxuKT0+e2JsLmluaXQodCxuKSxqLmluaXQodCxuKSx0Ll96b2QucHJvY2Vzc0pTT05TY2hlbWE9KHIsbyxlKT0+T2QodCxyLG8pfSk7ZnVuY3Rpb24gVWEodCxuKXtyZXR1cm4gbmV3IFdyKHt0eXBlOiJ0ZW1wbGF0ZV9saXRlcmFsIixwYXJ0czp0LC4uLmgobil9KX1jb25zdCBCcj1kKCJab2RMYXp5IiwodCxuKT0+e1NsLmluaXQodCxuKSxqLmluaXQodCxuKSx0Ll96b2QucHJvY2Vzc0pTT05TY2hlbWE9KHIsbyxlKT0+WGQodCxyLG8sZSksdC51bndyYXA9KCk9PnQuX3pvZC5kZWYuZ2V0dGVyKCl9KTtmdW5jdGlvbiBWcih0KXtyZXR1cm4gbmV3IEJyKHt0eXBlOiJsYXp5IixnZXR0ZXI6dH0pfWNvbnN0IEtyPWQoIlpvZFByb21pc2UiLCh0LG4pPT57a2wuaW5pdCh0LG4pLGouaW5pdCh0LG4pLHQuX3pvZC5wcm9jZXNzSlNPTlNjaGVtYT0ocixvLGUpPT5HZCh0LHIsbyxlKSx0LnVud3JhcD0oKT0+dC5fem9kLmRlZi5pbm5lclR5cGV9KTtmdW5jdGlvbiBQYSh0KXtyZXR1cm4gbmV3IEtyKHt0eXBlOiJwcm9taXNlIixpbm5lclR5cGU6dH0pfWNvbnN0IEdyPWQoIlpvZEZ1bmN0aW9uIiwodCxuKT0+e3lsLmluaXQodCxuKSxqLmluaXQodCxuKSx0Ll96b2QucHJvY2Vzc0pTT05TY2hlbWE9KHIsbyxlKT0+RGQodCxyKX0pO2Z1bmN0aW9uIFFlKHQpe3JldHVybiBuZXcgR3Ioe3R5cGU6ImZ1bmN0aW9uIixpbnB1dDpBcnJheS5pc0FycmF5KHQ/LmlucHV0KT9Jcih0Py5pbnB1dCk6dD8uaW5wdXQ/P0koRSgpKSxvdXRwdXQ6dD8ub3V0cHV0Pz9FKCl9KX1jb25zdCBmdD1kKCJab2RDdXN0b20iLCh0LG4pPT57d2wuaW5pdCh0LG4pLGouaW5pdCh0LG4pLHQuX3pvZC5wcm9jZXNzSlNPTlNjaGVtYT0ocixvLGUpPT5OZCh0LHIpfSk7ZnVuY3Rpb24gTmEodCl7Y29uc3Qgbj1uZXcgSih7Y2hlY2s6ImN1c3RvbSJ9KTtyZXR1cm4gbi5fem9kLmNoZWNrPXQsbn1mdW5jdGlvbiBYcih0LG4pe3JldHVybiBzZChmdCx0Pz8oKCk9PiEwKSxuKX1mdW5jdGlvbiBZcih0LG49e30pe3JldHVybiBjZChmdCx0LG4pfWZ1bmN0aW9uIFFyKHQsbil7cmV0dXJuIHVkKHQsbil9Y29uc3QgRGE9ZGQsRWE9bWQ7ZnVuY3Rpb24gWmEodCxuPXt9KXtjb25zdCByPW5ldyBmdCh7dHlwZToiY3VzdG9tIixjaGVjazoiY3VzdG9tIixmbjpvPT5vIGluc3RhbmNlb2YgdCxhYm9ydDohMCwuLi5oKG4pfSk7cmV0dXJuIHIuX3pvZC5iYWcuQ2xhc3M9dCxyLl96b2QuY2hlY2s9bz0+e28udmFsdWUgaW5zdGFuY2VvZiB0fHxvLmlzc3Vlcy5wdXNoKHtjb2RlOiJpbnZhbGlkX3R5cGUiLGV4cGVjdGVkOnQubmFtZSxpbnB1dDpvLnZhbHVlLGluc3Q6cixwYXRoOlsuLi5yLl96b2QuZGVmLnBhdGg/P1tdXX0pfSxyfWNvbnN0IFJhPSguLi50KT0+cGQoe0NvZGVjOnB0LEJvb2xlYW46c3QsU3RyaW5nOml0fSwuLi50KTtmdW5jdGlvbiBDYSh0KXtjb25zdCBuPVZyKCgpPT5VKFttKHQpLFQoKSxaKCksdm4oKSxJKG4pLFAobSgpLG4pXSkpO3JldHVybiBufWZ1bmN0aW9uIFNuKHQsbil7cmV0dXJuIG5ldyBGcih7dHlwZToicGlwZSIsaW46Ym4odCksb3V0Om59KX1jb25zdCBpdj1PYmplY3QuZnJlZXplKE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7X19wcm90b19fOm51bGwsWm9kQW55OnZyLFpvZEFycmF5OmJyLFpvZEJhc2U2NDpkbixab2RCYXNlNjRVUkw6bW4sWm9kQmlnSW50OmN0LFpvZEJpZ0ludEZvcm1hdDpnbixab2RCb29sZWFuOnN0LFpvZENJRFJ2NDp1bixab2RDSURSdjY6bG4sWm9kQ1VJRDp0bixab2RDVUlEMjpubixab2RDYXRjaDpMcixab2RDb2RlYzpwdCxab2RDdXN0b206ZnQsWm9kQ3VzdG9tU3RyaW5nRm9ybWF0OkxlLFpvZERhdGU6JG4sWm9kRGVmYXVsdDpEcixab2REaXNjcmltaW5hdGVkVW5pb246a3IsWm9kRTE2NDpwbixab2RFbWFpbDpZdCxab2RFbW9qaTpRdCxab2RFbnVtOlJlLFpvZEV4YWN0T3B0aW9uYWw6VXIsWm9kRmlsZTpqcixab2RGdW5jdGlvbjpHcixab2RHVUlEOkdlLFpvZElQdjQ6c24sWm9kSVB2Njpjbixab2RJbnRlcnNlY3Rpb246U3IsWm9kSldUOmZuLFpvZEtTVUlEOmFuLFpvZExhenk6QnIsWm9kTGl0ZXJhbDpUcixab2RNQUM6bXIsWm9kTWFwOnpyLFpvZE5hTjpxcixab2ROYW5vSUQ6ZW4sWm9kTmV2ZXI6JHIsWm9kTm9uT3B0aW9uYWw6a24sWm9kTnVsbDpncixab2ROdWxsYWJsZTpOcixab2ROdW1iZXI6YXQsWm9kTnVtYmVyRm9ybWF0OnplLFpvZE9iamVjdDp1dCxab2RPcHRpb25hbDp5bixab2RQaXBlOm10LFpvZFByZWZhdWx0OlpyLFpvZFByZXByb2Nlc3M6RnIsWm9kUHJvbWlzZTpLcixab2RSZWFkb25seTpKcixab2RSZWNvcmQ6WmUsWm9kU2V0OnhyLFpvZFN0cmluZzppdCxab2RTdHJpbmdGb3JtYXQ6QSxab2RTdWNjZXNzOkFyLFpvZFN5bWJvbDpwcixab2RUZW1wbGF0ZUxpdGVyYWw6V3IsWm9kVHJhbnNmb3JtOk9yLFpvZFR1cGxlOndyLFpvZFR5cGU6aixab2RVTElEOnJuLFpvZFVSTDpvdCxab2RVVUlEOmhlLFpvZFVuZGVmaW5lZDpmcixab2RVbmlvbjpsdCxab2RVbmtub3duOmhyLFpvZFZvaWQ6X3IsWm9kWElEOm9uLFpvZFhvcjp5cixfWm9kU3RyaW5nOlh0LF9kZWZhdWx0OkVyLF9mdW5jdGlvbjpRZSxhbnk6aG4sYXJyYXk6SSxiYXNlNjQ6UW8sYmFzZTY0dXJsOmVhLGJpZ2ludDpkYSxib29sZWFuOlosY2F0Y2g6TXIsY2hlY2s6TmEsY2lkcnY0OlhvLGNpZHJ2NjpZbyxjb2RlYzpqYSxjdWlkOkZvLGN1aWQyOkpvLGN1c3RvbTpYcixkYXRlOnZhLGRlc2NyaWJlOkRhLGRpc2NyaW1pbmF0ZWRVbmlvbjpfbixlMTY0OnRhLGVtYWlsOk5vLGVtb2ppOk1vLGVudW06USxleGFjdE9wdGlvbmFsOlByLGZpbGU6SWEsZmxvYXQzMjpzYSxmbG9hdDY0OmNhLGZ1bmN0aW9uOlFlLGd1aWQ6RG8saGFzaDphYSxoZXg6b2EsaG9zdG5hbWU6aWEsaHR0cFVybDpMbyxpbnN0YW5jZW9mOlphLGludDpTdCxpbnQzMjp1YSxpbnQ2NDptYSxpbnRlcnNlY3Rpb246ZHQsaW52ZXJ0Q29kZWM6T2EsaXB2NDpWbyxpcHY2OkdvLGpzb246Q2Esand0Om5hLGtleW9mOmhhLGtzdWlkOkJvLGxhenk6VnIsbGl0ZXJhbDpwLGxvb3NlT2JqZWN0OlksbG9vc2VSZWNvcmQ6eWEsbWFjOktvLG1hcDprYSxtZXRhOkVhLG5hbjpUYSxuYW5vaWQ6cW8sbmF0aXZlRW51bTp3YSxuZXZlcjpFZSxub25vcHRpb25hbDpDcixudWxsOnZuLG51bGxhYmxlOlllLG51bGxpc2g6emEsbnVtYmVyOlQsb2JqZWN0OmYsb3B0aW9uYWw6cSxwYXJ0aWFsUmVjb3JkOmJhLHBpcGU6d3QscHJlZmF1bHQ6UnIscHJlcHJvY2VzczpTbixwcm9taXNlOlBhLHJlYWRvbmx5OkhyLHJlY29yZDpQLHJlZmluZTpZcixzZXQ6U2Esc3RyaWN0T2JqZWN0OiRhLHN0cmluZzptLHN0cmluZ0Zvcm1hdDpyYSxzdHJpbmdib29sOlJhLHN1Y2Nlc3M6eGEsc3VwZXJSZWZpbmU6UXIsc3ltYm9sOmZhLHRlbXBsYXRlTGl0ZXJhbDpVYSx0cmFuc2Zvcm06Ym4sdHVwbGU6SXIsdWludDMyOmxhLHVpbnQ2NDpwYSx1bGlkOkhvLHVuZGVmaW5lZDpYZSx1bmlvbjpVLHVua25vd246RSx1cmw6QW8sdXVpZDpFbyx1dWlkdjQ6Wm8sdXVpZHY2OlJvLHV1aWR2NzpDbyx2b2lkOmdhLHhpZDpXbyx4b3I6X2F9LFN5bWJvbC50b1N0cmluZ1RhZyx7dmFsdWU6Ik1vZHVsZSJ9KSksb209e2ludmFsaWRfdHlwZToiaW52YWxpZF90eXBlIix0b29fYmlnOiJ0b29fYmlnIix0b29fc21hbGw6InRvb19zbWFsbCIsaW52YWxpZF9mb3JtYXQ6ImludmFsaWRfZm9ybWF0Iixub3RfbXVsdGlwbGVfb2Y6Im5vdF9tdWx0aXBsZV9vZiIsdW5yZWNvZ25pemVkX2tleXM6InVucmVjb2duaXplZF9rZXlzIixpbnZhbGlkX3VuaW9uOiJpbnZhbGlkX3VuaW9uIixpbnZhbGlkX2tleToiaW52YWxpZF9rZXkiLGludmFsaWRfZWxlbWVudDoiaW52YWxpZF9lbGVtZW50IixpbnZhbGlkX3ZhbHVlOiJpbnZhbGlkX3ZhbHVlIixjdXN0b206ImN1c3RvbSJ9O2Z1bmN0aW9uIGFtKHQpe1Yoe2N1c3RvbUVycm9yOnR9KX1mdW5jdGlvbiBzbSgpe3JldHVybiBWKCkuY3VzdG9tRXJyb3J9dmFyIE1uO01ufHwoTW49e30pO2NvbnN0IGI9ey4uLml2LC4uLnJ2LGlzbzpib30sb3Y9bmV3IFNldChbIiRzY2hlbWEiLCIkcmVmIiwiJGRlZnMiLCJkZWZpbml0aW9ucyIsIiRpZCIsImlkIiwiJGNvbW1lbnQiLCIkYW5jaG9yIiwiJHZvY2FidWxhcnkiLCIkZHluYW1pY1JlZiIsIiRkeW5hbWljQW5jaG9yIiwidHlwZSIsImVudW0iLCJjb25zdCIsImFueU9mIiwib25lT2YiLCJhbGxPZiIsIm5vdCIsInByb3BlcnRpZXMiLCJyZXF1aXJlZCIsImFkZGl0aW9uYWxQcm9wZXJ0aWVzIiwicGF0dGVyblByb3BlcnRpZXMiLCJwcm9wZXJ0eU5hbWVzIiwibWluUHJvcGVydGllcyIsIm1heFByb3BlcnRpZXMiLCJpdGVtcyIsInByZWZpeEl0ZW1zIiwiYWRkaXRpb25hbEl0ZW1zIiwibWluSXRlbXMiLCJtYXhJdGVtcyIsInVuaXF1ZUl0ZW1zIiwiY29udGFpbnMiLCJtaW5Db250YWlucyIsIm1heENvbnRhaW5zIiwibWluTGVuZ3RoIiwibWF4TGVuZ3RoIiwicGF0dGVybiIsImZvcm1hdCIsIm1pbmltdW0iLCJtYXhpbXVtIiwiZXhjbHVzaXZlTWluaW11bSIsImV4Y2x1c2l2ZU1heGltdW0iLCJtdWx0aXBsZU9mIiwiZGVzY3JpcHRpb24iLCJkZWZhdWx0IiwiY29udGVudEVuY29kaW5nIiwiY29udGVudE1lZGlhVHlwZSIsImNvbnRlbnRTY2hlbWEiLCJ1bmV2YWx1YXRlZEl0ZW1zIiwidW5ldmFsdWF0ZWRQcm9wZXJ0aWVzIiwiaWYiLCJ0aGVuIiwiZWxzZSIsImRlcGVuZGVudFNjaGVtYXMiLCJkZXBlbmRlbnRSZXF1aXJlZCIsIm51bGxhYmxlIiwicmVhZE9ubHkiXSk7ZnVuY3Rpb24gYXYodCxuKXtjb25zdCByPXQuJHNjaGVtYTtyZXR1cm4gcj09PSJodHRwczovL2pzb24tc2NoZW1hLm9yZy9kcmFmdC8yMDIwLTEyL3NjaGVtYSI/ImRyYWZ0LTIwMjAtMTIiOnI9PT0iaHR0cDovL2pzb24tc2NoZW1hLm9yZy9kcmFmdC0wNy9zY2hlbWEjIj8iZHJhZnQtNyI6cj09PSJodHRwOi8vanNvbi1zY2hlbWEub3JnL2RyYWZ0LTA0L3NjaGVtYSMiPyJkcmFmdC00IjpuPz8iZHJhZnQtMjAyMC0xMiJ9ZnVuY3Rpb24gc3YodCxuKXtpZighdC5zdGFydHNXaXRoKCIjIikpdGhyb3cgbmV3IEVycm9yKCJFeHRlcm5hbCAkcmVmIGlzIG5vdCBzdXBwb3J0ZWQsIG9ubHkgbG9jYWwgcmVmcyAoIy8uLi4pIGFyZSBhbGxvd2VkIik7Y29uc3Qgcj10LnNsaWNlKDEpLnNwbGl0KCIvIikuZmlsdGVyKEJvb2xlYW4pO2lmKHIubGVuZ3RoPT09MClyZXR1cm4gbi5yb290U2NoZW1hO2NvbnN0IG89bi52ZXJzaW9uPT09ImRyYWZ0LTIwMjAtMTIiPyIkZGVmcyI6ImRlZmluaXRpb25zIjtpZihyWzBdPT09byl7Y29uc3QgZT1yWzFdO2lmKCFlfHwhbi5kZWZzW2VdKXRocm93IG5ldyBFcnJvcihgUmVmZXJlbmNlIG5vdCBmb3VuZDogJHt0fWApO3JldHVybiBuLmRlZnNbZV19dGhyb3cgbmV3IEVycm9yKGBSZWZlcmVuY2Ugbm90IGZvdW5kOiAke3R9YCl9ZnVuY3Rpb24gY20odCxuKXtpZih0Lm5vdCE9PXZvaWQgMCl7aWYodHlwZW9mIHQubm90PT0ib2JqZWN0IiYmT2JqZWN0LmtleXModC5ub3QpLmxlbmd0aD09PTApcmV0dXJuIGIubmV2ZXIoKTt0aHJvdyBuZXcgRXJyb3IoIm5vdCBpcyBub3Qgc3VwcG9ydGVkIGluIFpvZCAoZXhjZXB0IHsgbm90OiB7fSB9IGZvciBuZXZlcikiKX1pZih0LnVuZXZhbHVhdGVkSXRlbXMhPT12b2lkIDApdGhyb3cgbmV3IEVycm9yKCJ1bmV2YWx1YXRlZEl0ZW1zIGlzIG5vdCBzdXBwb3J0ZWQiKTtpZih0LnVuZXZhbHVhdGVkUHJvcGVydGllcyE9PXZvaWQgMCl0aHJvdyBuZXcgRXJyb3IoInVuZXZhbHVhdGVkUHJvcGVydGllcyBpcyBub3Qgc3VwcG9ydGVkIik7aWYodC5pZiE9PXZvaWQgMHx8dC50aGVuIT09dm9pZCAwfHx0LmVsc2UhPT12b2lkIDApdGhyb3cgbmV3IEVycm9yKCJDb25kaXRpb25hbCBzY2hlbWFzIChpZi90aGVuL2Vsc2UpIGFyZSBub3Qgc3VwcG9ydGVkIik7aWYodC5kZXBlbmRlbnRTY2hlbWFzIT09dm9pZCAwfHx0LmRlcGVuZGVudFJlcXVpcmVkIT09dm9pZCAwKXRocm93IG5ldyBFcnJvcigiZGVwZW5kZW50U2NoZW1hcyBhbmQgZGVwZW5kZW50UmVxdWlyZWQgYXJlIG5vdCBzdXBwb3J0ZWQiKTtpZih0LiRyZWYpe2NvbnN0IGU9dC4kcmVmO2lmKG4ucmVmcy5oYXMoZSkpcmV0dXJuIG4ucmVmcy5nZXQoZSk7aWYobi5wcm9jZXNzaW5nLmhhcyhlKSlyZXR1cm4gYi5sYXp5KCgpPT57aWYoIW4ucmVmcy5oYXMoZSkpdGhyb3cgbmV3IEVycm9yKGBDaXJjdWxhciByZWZlcmVuY2Ugbm90IHJlc29sdmVkOiAke2V9YCk7cmV0dXJuIG4ucmVmcy5nZXQoZSl9KTtuLnByb2Nlc3NpbmcuYWRkKGUpO2NvbnN0IGk9c3YoZSxuKSxhPW5lKGksbik7cmV0dXJuIG4ucmVmcy5zZXQoZSxhKSxuLnByb2Nlc3NpbmcuZGVsZXRlKGUpLGF9aWYodC5lbnVtIT09dm9pZCAwKXtjb25zdCBlPXQuZW51bTtpZihuLnZlcnNpb249PT0ib3BlbmFwaS0zLjAiJiZ0Lm51bGxhYmxlPT09ITAmJmUubGVuZ3RoPT09MSYmZVswXT09PW51bGwpcmV0dXJuIGIubnVsbCgpO2lmKGUubGVuZ3RoPT09MClyZXR1cm4gYi5uZXZlcigpO2lmKGUubGVuZ3RoPT09MSlyZXR1cm4gYi5saXRlcmFsKGVbMF0pO2lmKGUuZXZlcnkoYT0+dHlwZW9mIGE9PSJzdHJpbmciKSlyZXR1cm4gYi5lbnVtKGUpO2NvbnN0IGk9ZS5tYXAoYT0+Yi5saXRlcmFsKGEpKTtyZXR1cm4gaS5sZW5ndGg8Mj9pWzBdOmIudW5pb24oW2lbMF0saVsxXSwuLi5pLnNsaWNlKDIpXSl9aWYodC5jb25zdCE9PXZvaWQgMClyZXR1cm4gYi5saXRlcmFsKHQuY29uc3QpO2NvbnN0IHI9dC50eXBlO2lmKEFycmF5LmlzQXJyYXkocikpe2NvbnN0IGU9ci5tYXAoaT0+e2NvbnN0IGE9ey4uLnQsdHlwZTppfTtyZXR1cm4gY20oYSxuKX0pO3JldHVybiBlLmxlbmd0aD09PTA/Yi5uZXZlcigpOmUubGVuZ3RoPT09MT9lWzBdOmIudW5pb24oZSl9aWYoIXIpcmV0dXJuIGIuYW55KCk7bGV0IG87c3dpdGNoKHIpe2Nhc2Uic3RyaW5nIjp7bGV0IGU9Yi5zdHJpbmcoKTtpZih0LmZvcm1hdCl7Y29uc3QgaT10LmZvcm1hdDtpPT09ImVtYWlsIj9lPWUuY2hlY2soYi5lbWFpbCgpKTppPT09InVyaSJ8fGk9PT0idXJpLXJlZmVyZW5jZSI/ZT1lLmNoZWNrKGIudXJsKCkpOmk9PT0idXVpZCJ8fGk9PT0iZ3VpZCI/ZT1lLmNoZWNrKGIudXVpZCgpKTppPT09ImRhdGUtdGltZSI/ZT1lLmNoZWNrKGIuaXNvLmRhdGV0aW1lKCkpOmk9PT0iZGF0ZSI/ZT1lLmNoZWNrKGIuaXNvLmRhdGUoKSk6aT09PSJ0aW1lIj9lPWUuY2hlY2soYi5pc28udGltZSgpKTppPT09ImR1cmF0aW9uIj9lPWUuY2hlY2soYi5pc28uZHVyYXRpb24oKSk6aT09PSJpcHY0Ij9lPWUuY2hlY2soYi5pcHY0KCkpOmk9PT0iaXB2NiI/ZT1lLmNoZWNrKGIuaXB2NigpKTppPT09Im1hYyI/ZT1lLmNoZWNrKGIubWFjKCkpOmk9PT0iY2lkciI/ZT1lLmNoZWNrKGIuY2lkcnY0KCkpOmk9PT0iY2lkci12NiI/ZT1lLmNoZWNrKGIuY2lkcnY2KCkpOmk9PT0iYmFzZTY0Ij9lPWUuY2hlY2soYi5iYXNlNjQoKSk6aT09PSJiYXNlNjR1cmwiP2U9ZS5jaGVjayhiLmJhc2U2NHVybCgpKTppPT09ImUxNjQiP2U9ZS5jaGVjayhiLmUxNjQoKSk6aT09PSJqd3QiP2U9ZS5jaGVjayhiLmp3dCgpKTppPT09ImVtb2ppIj9lPWUuY2hlY2soYi5lbW9qaSgpKTppPT09Im5hbm9pZCI/ZT1lLmNoZWNrKGIubmFub2lkKCkpOmk9PT0iY3VpZCI/ZT1lLmNoZWNrKGIuY3VpZCgpKTppPT09ImN1aWQyIj9lPWUuY2hlY2soYi5jdWlkMigpKTppPT09InVsaWQiP2U9ZS5jaGVjayhiLnVsaWQoKSk6aT09PSJ4aWQiP2U9ZS5jaGVjayhiLnhpZCgpKTppPT09ImtzdWlkIiYmKGU9ZS5jaGVjayhiLmtzdWlkKCkpKX10eXBlb2YgdC5taW5MZW5ndGg9PSJudW1iZXIiJiYoZT1lLm1pbih0Lm1pbkxlbmd0aCkpLHR5cGVvZiB0Lm1heExlbmd0aD09Im51bWJlciImJihlPWUubWF4KHQubWF4TGVuZ3RoKSksdC5wYXR0ZXJuJiYoZT1lLnJlZ2V4KG5ldyBSZWdFeHAodC5wYXR0ZXJuKSkpLG89ZTticmVha31jYXNlIm51bWJlciI6Y2FzZSJpbnRlZ2VyIjp7bGV0IGU9cj09PSJpbnRlZ2VyIj9iLm51bWJlcigpLmludCgpOmIubnVtYmVyKCk7dHlwZW9mIHQubWluaW11bT09Im51bWJlciImJihlPWUubWluKHQubWluaW11bSkpLHR5cGVvZiB0Lm1heGltdW09PSJudW1iZXIiJiYoZT1lLm1heCh0Lm1heGltdW0pKSx0eXBlb2YgdC5leGNsdXNpdmVNaW5pbXVtPT0ibnVtYmVyIj9lPWUuZ3QodC5leGNsdXNpdmVNaW5pbXVtKTp0LmV4Y2x1c2l2ZU1pbmltdW09PT0hMCYmdHlwZW9mIHQubWluaW11bT09Im51bWJlciImJihlPWUuZ3QodC5taW5pbXVtKSksdHlwZW9mIHQuZXhjbHVzaXZlTWF4aW11bT09Im51bWJlciI/ZT1lLmx0KHQuZXhjbHVzaXZlTWF4aW11bSk6dC5leGNsdXNpdmVNYXhpbXVtPT09ITAmJnR5cGVvZiB0Lm1heGltdW09PSJudW1iZXIiJiYoZT1lLmx0KHQubWF4aW11bSkpLHR5cGVvZiB0Lm11bHRpcGxlT2Y9PSJudW1iZXIiJiYoZT1lLm11bHRpcGxlT2YodC5tdWx0aXBsZU9mKSksbz1lO2JyZWFrfWNhc2UiYm9vbGVhbiI6e289Yi5ib29sZWFuKCk7YnJlYWt9Y2FzZSJudWxsIjp7bz1iLm51bGwoKTticmVha31jYXNlIm9iamVjdCI6e2NvbnN0IGU9e30saT10LnByb3BlcnRpZXN8fHt9LGE9bmV3IFNldCh0LnJlcXVpcmVkfHxbXSk7Zm9yKGNvbnN0W2MsdV1vZiBPYmplY3QuZW50cmllcyhpKSl7Y29uc3QgbD1uZSh1LG4pO2VbY109YS5oYXMoYyk/bDpsLm9wdGlvbmFsKCl9aWYodC5wcm9wZXJ0eU5hbWVzKXtjb25zdCBjPW5lKHQucHJvcGVydHlOYW1lcyxuKSx1PXQuYWRkaXRpb25hbFByb3BlcnRpZXMmJnR5cGVvZiB0LmFkZGl0aW9uYWxQcm9wZXJ0aWVzPT0ib2JqZWN0Ij9uZSh0LmFkZGl0aW9uYWxQcm9wZXJ0aWVzLG4pOmIuYW55KCk7aWYoT2JqZWN0LmtleXMoZSkubGVuZ3RoPT09MCl7bz1iLnJlY29yZChjLHUpO2JyZWFrfWNvbnN0IGw9Yi5vYmplY3QoZSkucGFzc3Rocm91Z2goKSxnPWIubG9vc2VSZWNvcmQoYyx1KTtvPWIuaW50ZXJzZWN0aW9uKGwsZyk7YnJlYWt9aWYodC5wYXR0ZXJuUHJvcGVydGllcyl7Y29uc3QgYz10LnBhdHRlcm5Qcm9wZXJ0aWVzLHU9T2JqZWN0LmtleXMoYyksbD1bXTtmb3IoY29uc3QgdiBvZiB1KXtjb25zdCAkPW5lKGNbdl0sbikseT1iLnN0cmluZygpLnJlZ2V4KG5ldyBSZWdFeHAodikpO2wucHVzaChiLmxvb3NlUmVjb3JkKHksJCkpfWNvbnN0IGc9W107aWYoT2JqZWN0LmtleXMoZSkubGVuZ3RoPjAmJmcucHVzaChiLm9iamVjdChlKS5wYXNzdGhyb3VnaCgpKSxnLnB1c2goLi4ubCksZy5sZW5ndGg9PT0wKW89Yi5vYmplY3Qoe30pLnBhc3N0aHJvdWdoKCk7ZWxzZSBpZihnLmxlbmd0aD09PTEpbz1nWzBdO2Vsc2V7bGV0IHY9Yi5pbnRlcnNlY3Rpb24oZ1swXSxnWzFdKTtmb3IobGV0ICQ9MjskPGcubGVuZ3RoOyQrKyl2PWIuaW50ZXJzZWN0aW9uKHYsZ1skXSk7bz12fWJyZWFrfWNvbnN0IHM9Yi5vYmplY3QoZSk7dC5hZGRpdGlvbmFsUHJvcGVydGllcz09PSExP289cy5zdHJpY3QoKTp0eXBlb2YgdC5hZGRpdGlvbmFsUHJvcGVydGllcz09Im9iamVjdCI/bz1zLmNhdGNoYWxsKG5lKHQuYWRkaXRpb25hbFByb3BlcnRpZXMsbikpOm89cy5wYXNzdGhyb3VnaCgpO2JyZWFrfWNhc2UiYXJyYXkiOntjb25zdCBlPXQucHJlZml4SXRlbXMsaT10Lml0ZW1zO2lmKGUmJkFycmF5LmlzQXJyYXkoZSkpe2NvbnN0IGE9ZS5tYXAoYz0+bmUoYyxuKSkscz1pJiZ0eXBlb2YgaT09Im9iamVjdCImJiFBcnJheS5pc0FycmF5KGkpP25lKGksbik6dm9pZCAwO3M/bz1iLnR1cGxlKGEpLnJlc3Qocyk6bz1iLnR1cGxlKGEpLHR5cGVvZiB0Lm1pbkl0ZW1zPT0ibnVtYmVyIiYmKG89by5jaGVjayhiLm1pbkxlbmd0aCh0Lm1pbkl0ZW1zKSkpLHR5cGVvZiB0Lm1heEl0ZW1zPT0ibnVtYmVyIiYmKG89by5jaGVjayhiLm1heExlbmd0aCh0Lm1heEl0ZW1zKSkpfWVsc2UgaWYoQXJyYXkuaXNBcnJheShpKSl7Y29uc3QgYT1pLm1hcChjPT5uZShjLG4pKSxzPXQuYWRkaXRpb25hbEl0ZW1zJiZ0eXBlb2YgdC5hZGRpdGlvbmFsSXRlbXM9PSJvYmplY3QiP25lKHQuYWRkaXRpb25hbEl0ZW1zLG4pOnZvaWQgMDtzP289Yi50dXBsZShhKS5yZXN0KHMpOm89Yi50dXBsZShhKSx0eXBlb2YgdC5taW5JdGVtcz09Im51bWJlciImJihvPW8uY2hlY2soYi5taW5MZW5ndGgodC5taW5JdGVtcykpKSx0eXBlb2YgdC5tYXhJdGVtcz09Im51bWJlciImJihvPW8uY2hlY2soYi5tYXhMZW5ndGgodC5tYXhJdGVtcykpKX1lbHNlIGlmKGkhPT12b2lkIDApe2NvbnN0IGE9bmUoaSxuKTtsZXQgcz1iLmFycmF5KGEpO3R5cGVvZiB0Lm1pbkl0ZW1zPT0ibnVtYmVyIiYmKHM9cy5taW4odC5taW5JdGVtcykpLHR5cGVvZiB0Lm1heEl0ZW1zPT0ibnVtYmVyIiYmKHM9cy5tYXgodC5tYXhJdGVtcykpLG89c31lbHNlIG89Yi5hcnJheShiLmFueSgpKTticmVha31kZWZhdWx0OnRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgdHlwZTogJHtyfWApfXJldHVybiBvfWZ1bmN0aW9uIG5lKHQsbil7aWYodHlwZW9mIHQ9PSJib29sZWFuIilyZXR1cm4gdD9iLmFueSgpOmIubmV2ZXIoKTtsZXQgcj1jbSh0LG4pO2NvbnN0IG89dC50eXBlfHx0LmVudW0hPT12b2lkIDB8fHQuY29uc3QhPT12b2lkIDA7aWYodC5hbnlPZiYmQXJyYXkuaXNBcnJheSh0LmFueU9mKSl7Y29uc3Qgcz10LmFueU9mLm1hcCh1PT5uZSh1LG4pKSxjPWIudW5pb24ocyk7cj1vP2IuaW50ZXJzZWN0aW9uKHIsYyk6Y31pZih0Lm9uZU9mJiZBcnJheS5pc0FycmF5KHQub25lT2YpKXtjb25zdCBzPXQub25lT2YubWFwKHU9Pm5lKHUsbikpLGM9Yi54b3Iocyk7cj1vP2IuaW50ZXJzZWN0aW9uKHIsYyk6Y31pZih0LmFsbE9mJiZBcnJheS5pc0FycmF5KHQuYWxsT2YpKWlmKHQuYWxsT2YubGVuZ3RoPT09MClyPW8/cjpiLmFueSgpO2Vsc2V7bGV0IHM9bz9yOm5lKHQuYWxsT2ZbMF0sbik7Y29uc3QgYz1vPzA6MTtmb3IobGV0IHU9Yzt1PHQuYWxsT2YubGVuZ3RoO3UrKylzPWIuaW50ZXJzZWN0aW9uKHMsbmUodC5hbGxPZlt1XSxuKSk7cj1zfXQubnVsbGFibGU9PT0hMCYmbi52ZXJzaW9uPT09Im9wZW5hcGktMy4wIiYmKHI9Yi5udWxsYWJsZShyKSksdC5yZWFkT25seT09PSEwJiYocj1iLnJlYWRvbmx5KHIpKSx0LmRlZmF1bHQhPT12b2lkIDAmJihyPXIuZGVmYXVsdCh0LmRlZmF1bHQpKTtjb25zdCBlPXt9LGk9WyIkaWQiLCJpZCIsIiRjb21tZW50IiwiJGFuY2hvciIsIiR2b2NhYnVsYXJ5IiwiJGR5bmFtaWNSZWYiLCIkZHluYW1pY0FuY2hvciJdO2Zvcihjb25zdCBzIG9mIGkpcyBpbiB0JiYoZVtzXT10W3NdKTtjb25zdCBhPVsiY29udGVudEVuY29kaW5nIiwiY29udGVudE1lZGlhVHlwZSIsImNvbnRlbnRTY2hlbWEiXTtmb3IoY29uc3QgcyBvZiBhKXMgaW4gdCYmKGVbc109dFtzXSk7Zm9yKGNvbnN0IHMgb2YgT2JqZWN0LmtleXModCkpb3YuaGFzKHMpfHwoZVtzXT10W3NdKTtyZXR1cm4gT2JqZWN0LmtleXMoZSkubGVuZ3RoPjAmJm4ucmVnaXN0cnkuYWRkKHIsZSksdC5kZXNjcmlwdGlvbiYmKHI9ci5kZXNjcmliZSh0LmRlc2NyaXB0aW9uKSkscn1mdW5jdGlvbiB1bSh0LG4pe2lmKHR5cGVvZiB0PT0iYm9vbGVhbiIpcmV0dXJuIHQ/Yi5hbnkoKTpiLm5ldmVyKCk7bGV0IHI7dHJ5e3I9SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0KSl9Y2F0Y2h7dGhyb3cgbmV3IEVycm9yKCJmcm9tSlNPTlNjaGVtYSBpbnB1dCBpcyBub3QgdmFsaWQgSlNPTiAocG9zc2libHkgY3ljbGljKTsgdXNlICRkZWZzLyRyZWYgZm9yIHJlY3Vyc2l2ZSBzY2hlbWFzIil9Y29uc3Qgbz1hdihyLG4/LmRlZmF1bHRUYXJnZXQpLGU9ci4kZGVmc3x8ci5kZWZpbml0aW9uc3x8e30saT17dmVyc2lvbjpvLGRlZnM6ZSxyZWZzOm5ldyBNYXAscHJvY2Vzc2luZzpuZXcgU2V0LHJvb3RTY2hlbWE6cixyZWdpc3RyeTpuPy5yZWdpc3RyeT8/Y2V9O3JldHVybiBuZShyLGkpfWZ1bmN0aW9uIGN2KHQpe3JldHVybiBPbChpdCx0KX1mdW5jdGlvbiB1dih0KXtyZXR1cm4gUmwoYXQsdCl9ZnVuY3Rpb24gbHYodCl7cmV0dXJuIEpsKHN0LHQpfWZ1bmN0aW9uIGR2KHQpe3JldHVybiBXbChjdCx0KX1mdW5jdGlvbiBtdih0KXtyZXR1cm4gcmQoJG4sdCl9Y29uc3QgbG09T2JqZWN0LmZyZWV6ZShPYmplY3QuZGVmaW5lUHJvcGVydHkoe19fcHJvdG9fXzpudWxsLGJpZ2ludDpkdixib29sZWFuOmx2LGRhdGU6bXYsbnVtYmVyOnV2LHN0cmluZzpjdn0sU3ltYm9sLnRvU3RyaW5nVGFnLHt2YWx1ZToiTW9kdWxlIn0pKTtWKElsKCkpO2NvbnN0IFpzPU9iamVjdC5mcmVlemUoT2JqZWN0LmRlZmluZVByb3BlcnR5KHtfX3Byb3RvX186bnVsbCwkYnJhbmQ6Z2ksJGlucHV0OldpLCRvdXRwdXQ6SGksTkVWRVI6ZmksVGltZVByZWNpc2lvbjpmbyxab2RBbnk6dnIsWm9kQXJyYXk6YnIsWm9kQmFzZTY0OmRuLFpvZEJhc2U2NFVSTDptbixab2RCaWdJbnQ6Y3QsWm9kQmlnSW50Rm9ybWF0OmduLFpvZEJvb2xlYW46c3QsWm9kQ0lEUnY0OnVuLFpvZENJRFJ2Njpsbixab2RDVUlEOnRuLFpvZENVSUQyOm5uLFpvZENhdGNoOkxyLFpvZENvZGVjOnB0LFpvZEN1c3RvbTpmdCxab2RDdXN0b21TdHJpbmdGb3JtYXQ6TGUsWm9kRGF0ZTokbixab2REZWZhdWx0OkRyLFpvZERpc2NyaW1pbmF0ZWRVbmlvbjprcixab2RFMTY0OnBuLFpvZEVtYWlsOll0LFpvZEVtb2ppOlF0LFpvZEVudW06UmUsWm9kRXJyb3I6aW0sWm9kRXhhY3RPcHRpb25hbDpVcixab2RGaWxlOmpyLGdldCBab2RGaXJzdFBhcnR5VHlwZUtpbmQoKXtyZXR1cm4gTW59LFpvZEZ1bmN0aW9uOkdyLFpvZEdVSUQ6R2UsWm9kSVB2NDpzbixab2RJUHY2OmNuLFpvZElTT0RhdGU6dXIsWm9kSVNPRGF0ZVRpbWU6Y3IsWm9kSVNPRHVyYXRpb246ZHIsWm9kSVNPVGltZTpscixab2RJbnRlcnNlY3Rpb246U3IsWm9kSXNzdWVDb2RlOm9tLFpvZEpXVDpmbixab2RLU1VJRDphbixab2RMYXp5OkJyLFpvZExpdGVyYWw6VHIsWm9kTUFDOm1yLFpvZE1hcDp6cixab2ROYU46cXIsWm9kTmFub0lEOmVuLFpvZE5ldmVyOiRyLFpvZE5vbk9wdGlvbmFsOmtuLFpvZE51bGw6Z3IsWm9kTnVsbGFibGU6TnIsWm9kTnVtYmVyOmF0LFpvZE51bWJlckZvcm1hdDp6ZSxab2RPYmplY3Q6dXQsWm9kT3B0aW9uYWw6eW4sWm9kUGlwZTptdCxab2RQcmVmYXVsdDpacixab2RQcmVwcm9jZXNzOkZyLFpvZFByb21pc2U6S3IsWm9kUmVhZG9ubHk6SnIsWm9kUmVhbEVycm9yOnNlLFpvZFJlY29yZDpaZSxab2RTZXQ6eHIsWm9kU3RyaW5nOml0LFpvZFN0cmluZ0Zvcm1hdDpBLFpvZFN1Y2Nlc3M6QXIsWm9kU3ltYm9sOnByLFpvZFRlbXBsYXRlTGl0ZXJhbDpXcixab2RUcmFuc2Zvcm06T3IsWm9kVHVwbGU6d3IsWm9kVHlwZTpqLFpvZFVMSUQ6cm4sWm9kVVJMOm90LFpvZFVVSUQ6aGUsWm9kVW5kZWZpbmVkOmZyLFpvZFVuaW9uOmx0LFpvZFVua25vd246aHIsWm9kVm9pZDpfcixab2RYSUQ6b24sWm9kWG9yOnlyLF9ab2RTdHJpbmc6WHQsX2RlZmF1bHQ6RXIsX2Z1bmN0aW9uOlFlLGFueTpobixhcnJheTpJLGJhc2U2NDpRbyxiYXNlNjR1cmw6ZWEsYmlnaW50OmRhLGJvb2xlYW46WixjYXRjaDpNcixjaGVjazpOYSxjaWRydjQ6WG8sY2lkcnY2OllvLGNsb25lOmRlLGNvZGVjOmphLGNvZXJjZTpsbSxjb25maWc6Vixjb3JlOllkLGN1aWQ6Rm8sY3VpZDI6Sm8sY3VzdG9tOlhyLGRhdGU6dmEsZGVjb2RlOnpvLGRlY29kZUFzeW5jOlRvLGRlc2NyaWJlOkRhLGRpc2NyaW1pbmF0ZWRVbmlvbjpfbixlMTY0OnRhLGVtYWlsOk5vLGVtb2ppOk1vLGVuY29kZTpJbyxlbmNvZGVBc3luYzp4byxlbmRzV2l0aDpxdCxlbnVtOlEsZXhhY3RPcHRpb25hbDpQcixmaWxlOklhLGZsYXR0ZW5FcnJvcjpYbixmbG9hdDMyOnNhLGZsb2F0NjQ6Y2EsZm9ybWF0RXJyb3I6WW4sZnJvbUpTT05TY2hlbWE6dW0sZnVuY3Rpb246UWUsZ2V0RXJyb3JNYXA6c20sZ2xvYmFsUmVnaXN0cnk6Y2UsZ3Q6a2UsZ3RlOmllLGd1aWQ6RG8saGFzaDphYSxoZXg6b2EsaG9zdG5hbWU6aWEsaHR0cFVybDpMbyxpbmNsdWRlczpMdCxpbnN0YW5jZW9mOlphLGludDpTdCxpbnQzMjp1YSxpbnQ2NDptYSxpbnRlcnNlY3Rpb246ZHQsaW52ZXJ0Q29kZWM6T2EsaXB2NDpWbyxpcHY2OkdvLGlzbzpibyxqc29uOkNhLGp3dDpuYSxrZXlvZjpoYSxrc3VpZDpCbyxsYXp5OlZyLGxlbmd0aDpydCxsaXRlcmFsOnAsbG9jYWxlczpKaSxsb29zZU9iamVjdDpZLGxvb3NlUmVjb3JkOnlhLGxvd2VyY2FzZTpDdCxsdDp5ZSxsdGU6dWUsbWFjOktvLG1hcDprYSxtYXhMZW5ndGg6bnQsbWF4U2l6ZTpBZSxtZXRhOkVhLG1pbWU6RnQsbWluTGVuZ3RoOndlLG1pblNpemU6U2UsbXVsdGlwbGVPZjpEZSxuYW46VGEsbmFub2lkOnFvLG5hdGl2ZUVudW06d2EsbmVnYXRpdmU6aXIsbmV2ZXI6RWUsbm9ubmVnYXRpdmU6YXIsbm9ub3B0aW9uYWw6Q3Isbm9ucG9zaXRpdmU6b3Isbm9ybWFsaXplOkp0LG51bGw6dm4sbnVsbGFibGU6WWUsbnVsbGlzaDp6YSxudW1iZXI6VCxvYmplY3Q6ZixvcHRpb25hbDpxLG92ZXJ3cml0ZTpfZSxwYXJzZTp5byxwYXJzZUFzeW5jOmtvLHBhcnRpYWxSZWNvcmQ6YmEscGlwZTp3dCxwb3NpdGl2ZTpycixwcmVmYXVsdDpScixwcmVwcm9jZXNzOlNuLHByZXR0aWZ5RXJyb3I6eWkscHJvbWlzZTpQYSxwcm9wZXJ0eTpzcixyZWFkb25seTpIcixyZWNvcmQ6UCxyZWZpbmU6WXIscmVnZXg6UnQscmVnZXhlczpRbixyZWdpc3RyeTp0cixzYWZlRGVjb2RlOk9vLHNhZmVEZWNvZGVBc3luYzpQbyxzYWZlRW5jb2RlOmpvLHNhZmVFbmNvZGVBc3luYzpVbyxzYWZlUGFyc2U6U28sc2FmZVBhcnNlQXN5bmM6d28sc2V0OlNhLHNldEVycm9yTWFwOmFtLHNpemU6dHQsc2x1Z2lmeTpWdCxzdGFydHNXaXRoOk10LHN0cmljdE9iamVjdDokYSxzdHJpbmc6bSxzdHJpbmdGb3JtYXQ6cmEsc3RyaW5nYm9vbDpSYSxzdWNjZXNzOnhhLHN1cGVyUmVmaW5lOlFyLHN5bWJvbDpmYSx0ZW1wbGF0ZUxpdGVyYWw6VWEsdG9KU09OU2NoZW1hOmhvLHRvTG93ZXJDYXNlOld0LHRvVXBwZXJDYXNlOkJ0LHRyYW5zZm9ybTpibix0cmVlaWZ5RXJyb3I6YmksdHJpbTpIdCx0dXBsZTpJcix1aW50MzI6bGEsdWludDY0OnBhLHVsaWQ6SG8sdW5kZWZpbmVkOlhlLHVuaW9uOlUsdW5rbm93bjpFLHVwcGVyY2FzZTpBdCx1cmw6QW8sdXRpbDokaSx1dWlkOkVvLHV1aWR2NDpabyx1dWlkdjY6Um8sdXVpZHY3OkNvLHZvaWQ6Z2EseGlkOldvLHhvcjpfYX0sU3ltYm9sLnRvU3RyaW5nVGFnLHt2YWx1ZToiTW9kdWxlIn0pKSxwdj1PYmplY3QuZnJlZXplKE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7X19wcm90b19fOm51bGwsJGJyYW5kOmdpLCRpbnB1dDpXaSwkb3V0cHV0OkhpLE5FVkVSOmZpLFRpbWVQcmVjaXNpb246Zm8sWm9kQW55OnZyLFpvZEFycmF5OmJyLFpvZEJhc2U2NDpkbixab2RCYXNlNjRVUkw6bW4sWm9kQmlnSW50OmN0LFpvZEJpZ0ludEZvcm1hdDpnbixab2RCb29sZWFuOnN0LFpvZENJRFJ2NDp1bixab2RDSURSdjY6bG4sWm9kQ1VJRDp0bixab2RDVUlEMjpubixab2RDYXRjaDpMcixab2RDb2RlYzpwdCxab2RDdXN0b206ZnQsWm9kQ3VzdG9tU3RyaW5nRm9ybWF0OkxlLFpvZERhdGU6JG4sWm9kRGVmYXVsdDpEcixab2REaXNjcmltaW5hdGVkVW5pb246a3IsWm9kRTE2NDpwbixab2RFbWFpbDpZdCxab2RFbW9qaTpRdCxab2RFbnVtOlJlLFpvZEVycm9yOmltLFpvZEV4YWN0T3B0aW9uYWw6VXIsWm9kRmlsZTpqcixnZXQgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kKCl7cmV0dXJuIE1ufSxab2RGdW5jdGlvbjpHcixab2RHVUlEOkdlLFpvZElQdjQ6c24sWm9kSVB2Njpjbixab2RJU09EYXRlOnVyLFpvZElTT0RhdGVUaW1lOmNyLFpvZElTT0R1cmF0aW9uOmRyLFpvZElTT1RpbWU6bHIsWm9kSW50ZXJzZWN0aW9uOlNyLFpvZElzc3VlQ29kZTpvbSxab2RKV1Q6Zm4sWm9kS1NVSUQ6YW4sWm9kTGF6eTpCcixab2RMaXRlcmFsOlRyLFpvZE1BQzptcixab2RNYXA6enIsWm9kTmFOOnFyLFpvZE5hbm9JRDplbixab2ROZXZlcjokcixab2ROb25PcHRpb25hbDprbixab2ROdWxsOmdyLFpvZE51bGxhYmxlOk5yLFpvZE51bWJlcjphdCxab2ROdW1iZXJGb3JtYXQ6emUsWm9kT2JqZWN0OnV0LFpvZE9wdGlvbmFsOnluLFpvZFBpcGU6bXQsWm9kUHJlZmF1bHQ6WnIsWm9kUHJlcHJvY2VzczpGcixab2RQcm9taXNlOktyLFpvZFJlYWRvbmx5OkpyLFpvZFJlYWxFcnJvcjpzZSxab2RSZWNvcmQ6WmUsWm9kU2V0OnhyLFpvZFN0cmluZzppdCxab2RTdHJpbmdGb3JtYXQ6QSxab2RTdWNjZXNzOkFyLFpvZFN5bWJvbDpwcixab2RUZW1wbGF0ZUxpdGVyYWw6V3IsWm9kVHJhbnNmb3JtOk9yLFpvZFR1cGxlOndyLFpvZFR5cGU6aixab2RVTElEOnJuLFpvZFVSTDpvdCxab2RVVUlEOmhlLFpvZFVuZGVmaW5lZDpmcixab2RVbmlvbjpsdCxab2RVbmtub3duOmhyLFpvZFZvaWQ6X3IsWm9kWElEOm9uLFpvZFhvcjp5cixfWm9kU3RyaW5nOlh0LF9kZWZhdWx0OkVyLF9mdW5jdGlvbjpRZSxhbnk6aG4sYXJyYXk6SSxiYXNlNjQ6UW8sYmFzZTY0dXJsOmVhLGJpZ2ludDpkYSxib29sZWFuOlosY2F0Y2g6TXIsY2hlY2s6TmEsY2lkcnY0OlhvLGNpZHJ2NjpZbyxjbG9uZTpkZSxjb2RlYzpqYSxjb2VyY2U6bG0sY29uZmlnOlYsY29yZTpZZCxjdWlkOkZvLGN1aWQyOkpvLGN1c3RvbTpYcixkYXRlOnZhLGRlY29kZTp6byxkZWNvZGVBc3luYzpUbyxkZWZhdWx0OlpzLGRlc2NyaWJlOkRhLGRpc2NyaW1pbmF0ZWRVbmlvbjpfbixlMTY0OnRhLGVtYWlsOk5vLGVtb2ppOk1vLGVuY29kZTpJbyxlbmNvZGVBc3luYzp4byxlbmRzV2l0aDpxdCxlbnVtOlEsZXhhY3RPcHRpb25hbDpQcixmaWxlOklhLGZsYXR0ZW5FcnJvcjpYbixmbG9hdDMyOnNhLGZsb2F0NjQ6Y2EsZm9ybWF0RXJyb3I6WW4sZnJvbUpTT05TY2hlbWE6dW0sZnVuY3Rpb246UWUsZ2V0RXJyb3JNYXA6c20sZ2xvYmFsUmVnaXN0cnk6Y2UsZ3Q6a2UsZ3RlOmllLGd1aWQ6RG8saGFzaDphYSxoZXg6b2EsaG9zdG5hbWU6aWEsaHR0cFVybDpMbyxpbmNsdWRlczpMdCxpbnN0YW5jZW9mOlphLGludDpTdCxpbnQzMjp1YSxpbnQ2NDptYSxpbnRlcnNlY3Rpb246ZHQsaW52ZXJ0Q29kZWM6T2EsaXB2NDpWbyxpcHY2OkdvLGlzbzpibyxqc29uOkNhLGp3dDpuYSxrZXlvZjpoYSxrc3VpZDpCbyxsYXp5OlZyLGxlbmd0aDpydCxsaXRlcmFsOnAsbG9jYWxlczpKaSxsb29zZU9iamVjdDpZLGxvb3NlUmVjb3JkOnlhLGxvd2VyY2FzZTpDdCxsdDp5ZSxsdGU6dWUsbWFjOktvLG1hcDprYSxtYXhMZW5ndGg6bnQsbWF4U2l6ZTpBZSxtZXRhOkVhLG1pbWU6RnQsbWluTGVuZ3RoOndlLG1pblNpemU6U2UsbXVsdGlwbGVPZjpEZSxuYW46VGEsbmFub2lkOnFvLG5hdGl2ZUVudW06d2EsbmVnYXRpdmU6aXIsbmV2ZXI6RWUsbm9ubmVnYXRpdmU6YXIsbm9ub3B0aW9uYWw6Q3Isbm9ucG9zaXRpdmU6b3Isbm9ybWFsaXplOkp0LG51bGw6dm4sbnVsbGFibGU6WWUsbnVsbGlzaDp6YSxudW1iZXI6VCxvYmplY3Q6ZixvcHRpb25hbDpxLG92ZXJ3cml0ZTpfZSxwYXJzZTp5byxwYXJzZUFzeW5jOmtvLHBhcnRpYWxSZWNvcmQ6YmEscGlwZTp3dCxwb3NpdGl2ZTpycixwcmVmYXVsdDpScixwcmVwcm9jZXNzOlNuLHByZXR0aWZ5RXJyb3I6eWkscHJvbWlzZTpQYSxwcm9wZXJ0eTpzcixyZWFkb25seTpIcixyZWNvcmQ6UCxyZWZpbmU6WXIscmVnZXg6UnQscmVnZXhlczpRbixyZWdpc3RyeTp0cixzYWZlRGVjb2RlOk9vLHNhZmVEZWNvZGVBc3luYzpQbyxzYWZlRW5jb2RlOmpvLHNhZmVFbmNvZGVBc3luYzpVbyxzYWZlUGFyc2U6U28sc2FmZVBhcnNlQXN5bmM6d28sc2V0OlNhLHNldEVycm9yTWFwOmFtLHNpemU6dHQsc2x1Z2lmeTpWdCxzdGFydHNXaXRoOk10LHN0cmljdE9iamVjdDokYSxzdHJpbmc6bSxzdHJpbmdGb3JtYXQ6cmEsc3RyaW5nYm9vbDpSYSxzdWNjZXNzOnhhLHN1cGVyUmVmaW5lOlFyLHN5bWJvbDpmYSx0ZW1wbGF0ZUxpdGVyYWw6VWEsdG9KU09OU2NoZW1hOmhvLHRvTG93ZXJDYXNlOld0LHRvVXBwZXJDYXNlOkJ0LHRyYW5zZm9ybTpibix0cmVlaWZ5RXJyb3I6YmksdHJpbTpIdCx0dXBsZTpJcix1aW50MzI6bGEsdWludDY0OnBhLHVsaWQ6SG8sdW5kZWZpbmVkOlhlLHVuaW9uOlUsdW5rbm93bjpFLHVwcGVyY2FzZTpBdCx1cmw6QW8sdXRpbDokaSx1dWlkOkVvLHV1aWR2NDpabyx1dWlkdjY6Um8sdXVpZHY3OkNvLHZvaWQ6Z2EseGlkOldvLHhvcjpfYSx6OlpzfSxTeW1ib2wudG9TdHJpbmdUYWcse3ZhbHVlOiJNb2R1bGUifSkpLFRlPSJpby5tb2RlbGNvbnRleHRwcm90b2NvbC9yZWxhdGVkLXRhc2siLGVpPSIyLjAiLEI9WHIodD0+dCE9PW51bGwmJih0eXBlb2YgdD09Im9iamVjdCJ8fHR5cGVvZiB0PT0iZnVuY3Rpb24iKSksZG09VShbbSgpLFQoKS5pbnQoKV0pLG1tPW0oKTtZKHt0dGw6VCgpLm9wdGlvbmFsKCkscG9sbEludGVydmFsOlQoKS5vcHRpb25hbCgpfSk7Y29uc3QgZnY9Zih7dHRsOlQoKS5vcHRpb25hbCgpfSksZ3Y9Zih7dGFza0lkOm0oKX0pLEFhPVkoe3Byb2dyZXNzVG9rZW46ZG0ub3B0aW9uYWwoKSxbVGVdOmd2Lm9wdGlvbmFsKCl9KSxwZT1mKHtfbWV0YTpBYS5vcHRpb25hbCgpfSksd249cGUuZXh0ZW5kKHt0YXNrOmZ2Lm9wdGlvbmFsKCl9KSx2dj10PT53bi5zYWZlUGFyc2UodCkuc3VjY2VzcyxlZT1mKHttZXRob2Q6bSgpLHBhcmFtczpwZS5sb29zZSgpLm9wdGlvbmFsKCl9KSxnZT1mKHtfbWV0YTpBYS5vcHRpb25hbCgpfSksdmU9Zih7bWV0aG9kOm0oKSxwYXJhbXM6Z2UubG9vc2UoKS5vcHRpb25hbCgpfSksdGU9WSh7X21ldGE6QWEub3B0aW9uYWwoKX0pLEluPVUoW20oKSxUKCkuaW50KCldKSxwbT1mKHtqc29ucnBjOnAoZWkpLGlkOkluLC4uLmVlLnNoYXBlfSkuc3RyaWN0KCksUnM9dD0+cG0uc2FmZVBhcnNlKHQpLnN1Y2Nlc3MsZm09Zih7anNvbnJwYzpwKGVpKSwuLi52ZS5zaGFwZX0pLnN0cmljdCgpLGh2PXQ9PmZtLnNhZmVQYXJzZSh0KS5zdWNjZXNzLExhPWYoe2pzb25ycGM6cChlaSksaWQ6SW4scmVzdWx0OnRlfSkuc3RyaWN0KCksWm49dD0+TGEuc2FmZVBhcnNlKHQpLnN1Y2Nlc3M7dmFyIFI7KGZ1bmN0aW9uKHQpe3RbdC5Db25uZWN0aW9uQ2xvc2VkPS0zMmUzXT0iQ29ubmVjdGlvbkNsb3NlZCIsdFt0LlJlcXVlc3RUaW1lb3V0PS0zMjAwMV09IlJlcXVlc3RUaW1lb3V0Iix0W3QuUGFyc2VFcnJvcj0tMzI3MDBdPSJQYXJzZUVycm9yIix0W3QuSW52YWxpZFJlcXVlc3Q9LTMyNjAwXT0iSW52YWxpZFJlcXVlc3QiLHRbdC5NZXRob2ROb3RGb3VuZD0tMzI2MDFdPSJNZXRob2ROb3RGb3VuZCIsdFt0LkludmFsaWRQYXJhbXM9LTMyNjAyXT0iSW52YWxpZFBhcmFtcyIsdFt0LkludGVybmFsRXJyb3I9LTMyNjAzXT0iSW50ZXJuYWxFcnJvciIsdFt0LlVybEVsaWNpdGF0aW9uUmVxdWlyZWQ9LTMyMDQyXT0iVXJsRWxpY2l0YXRpb25SZXF1aXJlZCJ9KShSfHwoUj17fSkpO2NvbnN0IE1hPWYoe2pzb25ycGM6cChlaSksaWQ6SW4ub3B0aW9uYWwoKSxlcnJvcjpmKHtjb2RlOlQoKS5pbnQoKSxtZXNzYWdlOm0oKSxkYXRhOkUoKS5vcHRpb25hbCgpfSl9KS5zdHJpY3QoKSwkdj10PT5NYS5zYWZlUGFyc2UodCkuc3VjY2Vzcyxfdj1VKFtwbSxmbSxMYSxNYV0pO1UoW0xhLE1hXSk7Y29uc3QgcWE9dGUuc3RyaWN0KCksYnY9Z2UuZXh0ZW5kKHtyZXF1ZXN0SWQ6SW4ub3B0aW9uYWwoKSxyZWFzb246bSgpLm9wdGlvbmFsKCl9KSxGYT12ZS5leHRlbmQoe21ldGhvZDpwKCJub3RpZmljYXRpb25zL2NhbmNlbGxlZCIpLHBhcmFtczpidn0pLHl2PWYoe3NyYzptKCksbWltZVR5cGU6bSgpLm9wdGlvbmFsKCksc2l6ZXM6SShtKCkpLm9wdGlvbmFsKCksdGhlbWU6UShbImxpZ2h0IiwiZGFyayJdKS5vcHRpb25hbCgpfSksem49Zih7aWNvbnM6SSh5dikub3B0aW9uYWwoKX0pLGV0PWYoe25hbWU6bSgpLHRpdGxlOm0oKS5vcHRpb25hbCgpfSksdGk9ZXQuZXh0ZW5kKHsuLi5ldC5zaGFwZSwuLi56bi5zaGFwZSx2ZXJzaW9uOm0oKSx3ZWJzaXRlVXJsOm0oKS5vcHRpb25hbCgpLGRlc2NyaXB0aW9uOm0oKS5vcHRpb25hbCgpfSksa3Y9ZHQoZih7YXBwbHlEZWZhdWx0czpaKCkub3B0aW9uYWwoKX0pLFAobSgpLEUoKSkpLFN2PVNuKHQ9PnQmJnR5cGVvZiB0PT0ib2JqZWN0IiYmIUFycmF5LmlzQXJyYXkodCkmJk9iamVjdC5rZXlzKHQpLmxlbmd0aD09PTA/e2Zvcm06e319OnQsZHQoZih7Zm9ybTprdi5vcHRpb25hbCgpLHVybDpCLm9wdGlvbmFsKCl9KSxQKG0oKSxFKCkpLm9wdGlvbmFsKCkpKSx3dj1ZKHtsaXN0OkIub3B0aW9uYWwoKSxjYW5jZWw6Qi5vcHRpb25hbCgpLHJlcXVlc3RzOlkoe3NhbXBsaW5nOlkoe2NyZWF0ZU1lc3NhZ2U6Qi5vcHRpb25hbCgpfSkub3B0aW9uYWwoKSxlbGljaXRhdGlvbjpZKHtjcmVhdGU6Qi5vcHRpb25hbCgpfSkub3B0aW9uYWwoKX0pLm9wdGlvbmFsKCl9KSxJdj1ZKHtsaXN0OkIub3B0aW9uYWwoKSxjYW5jZWw6Qi5vcHRpb25hbCgpLHJlcXVlc3RzOlkoe3Rvb2xzOlkoe2NhbGw6Qi5vcHRpb25hbCgpfSkub3B0aW9uYWwoKX0pLm9wdGlvbmFsKCl9KSx6dj1mKHtleHBlcmltZW50YWw6UChtKCksQikub3B0aW9uYWwoKSxzYW1wbGluZzpmKHtjb250ZXh0OkIub3B0aW9uYWwoKSx0b29sczpCLm9wdGlvbmFsKCl9KS5vcHRpb25hbCgpLGVsaWNpdGF0aW9uOlN2Lm9wdGlvbmFsKCkscm9vdHM6Zih7bGlzdENoYW5nZWQ6WigpLm9wdGlvbmFsKCl9KS5vcHRpb25hbCgpLHRhc2tzOnd2Lm9wdGlvbmFsKCksZXh0ZW5zaW9uczpQKG0oKSxCKS5vcHRpb25hbCgpfSkseHY9cGUuZXh0ZW5kKHtwcm90b2NvbFZlcnNpb246bSgpLGNhcGFiaWxpdGllczp6dixjbGllbnRJbmZvOnRpfSksVHY9ZWUuZXh0ZW5kKHttZXRob2Q6cCgiaW5pdGlhbGl6ZSIpLHBhcmFtczp4dn0pLGp2PWYoe2V4cGVyaW1lbnRhbDpQKG0oKSxCKS5vcHRpb25hbCgpLGxvZ2dpbmc6Qi5vcHRpb25hbCgpLGNvbXBsZXRpb25zOkIub3B0aW9uYWwoKSxwcm9tcHRzOmYoe2xpc3RDaGFuZ2VkOlooKS5vcHRpb25hbCgpfSkub3B0aW9uYWwoKSxyZXNvdXJjZXM6Zih7c3Vic2NyaWJlOlooKS5vcHRpb25hbCgpLGxpc3RDaGFuZ2VkOlooKS5vcHRpb25hbCgpfSkub3B0aW9uYWwoKSx0b29sczpmKHtsaXN0Q2hhbmdlZDpaKCkub3B0aW9uYWwoKX0pLm9wdGlvbmFsKCksdGFza3M6SXYub3B0aW9uYWwoKSxleHRlbnNpb25zOlAobSgpLEIpLm9wdGlvbmFsKCl9KSxPdj10ZS5leHRlbmQoe3Byb3RvY29sVmVyc2lvbjptKCksY2FwYWJpbGl0aWVzOmp2LHNlcnZlckluZm86dGksaW5zdHJ1Y3Rpb25zOm0oKS5vcHRpb25hbCgpfSksVXY9dmUuZXh0ZW5kKHttZXRob2Q6cCgibm90aWZpY2F0aW9ucy9pbml0aWFsaXplZCIpLHBhcmFtczpnZS5vcHRpb25hbCgpfSksbmk9ZWUuZXh0ZW5kKHttZXRob2Q6cCgicGluZyIpLHBhcmFtczpwZS5vcHRpb25hbCgpfSksUHY9Zih7cHJvZ3Jlc3M6VCgpLHRvdGFsOnEoVCgpKSxtZXNzYWdlOnEobSgpKX0pLE52PWYoey4uLmdlLnNoYXBlLC4uLlB2LnNoYXBlLHByb2dyZXNzVG9rZW46ZG19KSxKYT12ZS5leHRlbmQoe21ldGhvZDpwKCJub3RpZmljYXRpb25zL3Byb2dyZXNzIikscGFyYW1zOk52fSksRHY9cGUuZXh0ZW5kKHtjdXJzb3I6bW0ub3B0aW9uYWwoKX0pLHhuPWVlLmV4dGVuZCh7cGFyYW1zOkR2Lm9wdGlvbmFsKCl9KSxUbj10ZS5leHRlbmQoe25leHRDdXJzb3I6bW0ub3B0aW9uYWwoKX0pLEV2PVEoWyJ3b3JraW5nIiwiaW5wdXRfcmVxdWlyZWQiLCJjb21wbGV0ZWQiLCJmYWlsZWQiLCJjYW5jZWxsZWQiXSksam49Zih7dGFza0lkOm0oKSxzdGF0dXM6RXYsdHRsOlUoW1QoKSx2bigpXSksY3JlYXRlZEF0Om0oKSxsYXN0VXBkYXRlZEF0Om0oKSxwb2xsSW50ZXJ2YWw6cShUKCkpLHN0YXR1c01lc3NhZ2U6cShtKCkpfSksSGE9dGUuZXh0ZW5kKHt0YXNrOmpufSksWnY9Z2UubWVyZ2Uoam4pLHFuPXZlLmV4dGVuZCh7bWV0aG9kOnAoIm5vdGlmaWNhdGlvbnMvdGFza3Mvc3RhdHVzIikscGFyYW1zOlp2fSksV2E9ZWUuZXh0ZW5kKHttZXRob2Q6cCgidGFza3MvZ2V0IikscGFyYW1zOnBlLmV4dGVuZCh7dGFza0lkOm0oKX0pfSksQmE9dGUubWVyZ2Uoam4pLFZhPWVlLmV4dGVuZCh7bWV0aG9kOnAoInRhc2tzL3Jlc3VsdCIpLHBhcmFtczpwZS5leHRlbmQoe3Rhc2tJZDptKCl9KX0pO3RlLmxvb3NlKCk7Y29uc3QgS2E9eG4uZXh0ZW5kKHttZXRob2Q6cCgidGFza3MvbGlzdCIpfSksR2E9VG4uZXh0ZW5kKHt0YXNrczpJKGpuKX0pLFhhPWVlLmV4dGVuZCh7bWV0aG9kOnAoInRhc2tzL2NhbmNlbCIpLHBhcmFtczpwZS5leHRlbmQoe3Rhc2tJZDptKCl9KX0pLFJ2PXRlLm1lcmdlKGpuKSxnbT1mKHt1cmk6bSgpLG1pbWVUeXBlOnEobSgpKSxfbWV0YTpQKG0oKSxFKCkpLm9wdGlvbmFsKCl9KSx2bT1nbS5leHRlbmQoe3RleHQ6bSgpfSksWWE9bSgpLnJlZmluZSh0PT57dHJ5e3JldHVybiBhdG9iKHQpLCEwfWNhdGNoe3JldHVybiExfX0se21lc3NhZ2U6IkludmFsaWQgQmFzZTY0IHN0cmluZyJ9KSxobT1nbS5leHRlbmQoe2Jsb2I6WWF9KSxPbj1RKFsidXNlciIsImFzc2lzdGFudCJdKSxndD1mKHthdWRpZW5jZTpJKE9uKS5vcHRpb25hbCgpLHByaW9yaXR5OlQoKS5taW4oMCkubWF4KDEpLm9wdGlvbmFsKCksbGFzdE1vZGlmaWVkOl9vKHtvZmZzZXQ6ITB9KS5vcHRpb25hbCgpfSksJG09Zih7Li4uZXQuc2hhcGUsLi4uem4uc2hhcGUsdXJpOm0oKSxkZXNjcmlwdGlvbjpxKG0oKSksbWltZVR5cGU6cShtKCkpLHNpemU6cShUKCkpLGFubm90YXRpb25zOmd0Lm9wdGlvbmFsKCksX21ldGE6cShZKHt9KSl9KSxDdj1mKHsuLi5ldC5zaGFwZSwuLi56bi5zaGFwZSx1cmlUZW1wbGF0ZTptKCksZGVzY3JpcHRpb246cShtKCkpLG1pbWVUeXBlOnEobSgpKSxhbm5vdGF0aW9uczpndC5vcHRpb25hbCgpLF9tZXRhOnEoWSh7fSkpfSksQXY9eG4uZXh0ZW5kKHttZXRob2Q6cCgicmVzb3VyY2VzL2xpc3QiKX0pLF9tPVRuLmV4dGVuZCh7cmVzb3VyY2VzOkkoJG0pfSksTHY9eG4uZXh0ZW5kKHttZXRob2Q6cCgicmVzb3VyY2VzL3RlbXBsYXRlcy9saXN0Iil9KSxNdj1Ubi5leHRlbmQoe3Jlc291cmNlVGVtcGxhdGVzOkkoQ3YpfSksUWE9cGUuZXh0ZW5kKHt1cmk6bSgpfSkscXY9UWEsRnY9ZWUuZXh0ZW5kKHttZXRob2Q6cCgicmVzb3VyY2VzL3JlYWQiKSxwYXJhbXM6cXZ9KSxibT10ZS5leHRlbmQoe2NvbnRlbnRzOkkoVShbdm0saG1dKSl9KSxKdj12ZS5leHRlbmQoe21ldGhvZDpwKCJub3RpZmljYXRpb25zL3Jlc291cmNlcy9saXN0X2NoYW5nZWQiKSxwYXJhbXM6Z2Uub3B0aW9uYWwoKX0pLEh2PVFhLFd2PWVlLmV4dGVuZCh7bWV0aG9kOnAoInJlc291cmNlcy9zdWJzY3JpYmUiKSxwYXJhbXM6SHZ9KSxCdj1RYSxWdj1lZS5leHRlbmQoe21ldGhvZDpwKCJyZXNvdXJjZXMvdW5zdWJzY3JpYmUiKSxwYXJhbXM6QnZ9KSxLdj1nZS5leHRlbmQoe3VyaTptKCl9KSxHdj12ZS5leHRlbmQoe21ldGhvZDpwKCJub3RpZmljYXRpb25zL3Jlc291cmNlcy91cGRhdGVkIikscGFyYW1zOkt2fSksWHY9Zih7bmFtZTptKCksZGVzY3JpcHRpb246cShtKCkpLHJlcXVpcmVkOnEoWigpKX0pLFl2PWYoey4uLmV0LnNoYXBlLC4uLnpuLnNoYXBlLGRlc2NyaXB0aW9uOnEobSgpKSxhcmd1bWVudHM6cShJKFh2KSksX21ldGE6cShZKHt9KSl9KSxRdj14bi5leHRlbmQoe21ldGhvZDpwKCJwcm9tcHRzL2xpc3QiKX0pLGVoPVRuLmV4dGVuZCh7cHJvbXB0czpJKFl2KX0pLHRoPXBlLmV4dGVuZCh7bmFtZTptKCksYXJndW1lbnRzOlAobSgpLG0oKSkub3B0aW9uYWwoKX0pLG5oPWVlLmV4dGVuZCh7bWV0aG9kOnAoInByb21wdHMvZ2V0IikscGFyYW1zOnRofSksZXM9Zih7dHlwZTpwKCJ0ZXh0IiksdGV4dDptKCksYW5ub3RhdGlvbnM6Z3Qub3B0aW9uYWwoKSxfbWV0YTpQKG0oKSxFKCkpLm9wdGlvbmFsKCl9KSx0cz1mKHt0eXBlOnAoImltYWdlIiksZGF0YTpZYSxtaW1lVHlwZTptKCksYW5ub3RhdGlvbnM6Z3Qub3B0aW9uYWwoKSxfbWV0YTpQKG0oKSxFKCkpLm9wdGlvbmFsKCl9KSxucz1mKHt0eXBlOnAoImF1ZGlvIiksZGF0YTpZYSxtaW1lVHlwZTptKCksYW5ub3RhdGlvbnM6Z3Qub3B0aW9uYWwoKSxfbWV0YTpQKG0oKSxFKCkpLm9wdGlvbmFsKCl9KSxyaD1mKHt0eXBlOnAoInRvb2xfdXNlIiksbmFtZTptKCksaWQ6bSgpLGlucHV0OlAobSgpLEUoKSksX21ldGE6UChtKCksRSgpKS5vcHRpb25hbCgpfSkseW09Zih7dHlwZTpwKCJyZXNvdXJjZSIpLHJlc291cmNlOlUoW3ZtLGhtXSksYW5ub3RhdGlvbnM6Z3Qub3B0aW9uYWwoKSxfbWV0YTpQKG0oKSxFKCkpLm9wdGlvbmFsKCl9KSxrbT0kbS5leHRlbmQoe3R5cGU6cCgicmVzb3VyY2VfbGluayIpfSksVW49VShbZXMsdHMsbnMsa20seW1dKSxpaD1mKHtyb2xlOk9uLGNvbnRlbnQ6VW59KSxvaD10ZS5leHRlbmQoe2Rlc2NyaXB0aW9uOm0oKS5vcHRpb25hbCgpLG1lc3NhZ2VzOkkoaWgpfSksYWg9dmUuZXh0ZW5kKHttZXRob2Q6cCgibm90aWZpY2F0aW9ucy9wcm9tcHRzL2xpc3RfY2hhbmdlZCIpLHBhcmFtczpnZS5vcHRpb25hbCgpfSksc2g9Zih7dGl0bGU6bSgpLm9wdGlvbmFsKCkscmVhZE9ubHlIaW50OlooKS5vcHRpb25hbCgpLGRlc3RydWN0aXZlSGludDpaKCkub3B0aW9uYWwoKSxpZGVtcG90ZW50SGludDpaKCkub3B0aW9uYWwoKSxvcGVuV29ybGRIaW50OlooKS5vcHRpb25hbCgpfSksY2g9Zih7dGFza1N1cHBvcnQ6UShbInJlcXVpcmVkIiwib3B0aW9uYWwiLCJmb3JiaWRkZW4iXSkub3B0aW9uYWwoKX0pLHJzPWYoey4uLmV0LnNoYXBlLC4uLnpuLnNoYXBlLGRlc2NyaXB0aW9uOm0oKS5vcHRpb25hbCgpLGlucHV0U2NoZW1hOmYoe3R5cGU6cCgib2JqZWN0IikscHJvcGVydGllczpQKG0oKSxCKS5vcHRpb25hbCgpLHJlcXVpcmVkOkkobSgpKS5vcHRpb25hbCgpfSkuY2F0Y2hhbGwoRSgpKSxvdXRwdXRTY2hlbWE6Zih7dHlwZTpwKCJvYmplY3QiKSxwcm9wZXJ0aWVzOlAobSgpLEIpLm9wdGlvbmFsKCkscmVxdWlyZWQ6SShtKCkpLm9wdGlvbmFsKCl9KS5jYXRjaGFsbChFKCkpLm9wdGlvbmFsKCksYW5ub3RhdGlvbnM6c2gub3B0aW9uYWwoKSxleGVjdXRpb246Y2gub3B0aW9uYWwoKSxfbWV0YTpQKG0oKSxFKCkpLm9wdGlvbmFsKCl9KSxTbT14bi5leHRlbmQoe21ldGhvZDpwKCJ0b29scy9saXN0Iil9KSx1aD1Ubi5leHRlbmQoe3Rvb2xzOkkocnMpfSkscmk9dGUuZXh0ZW5kKHtjb250ZW50OkkoVW4pLmRlZmF1bHQoW10pLHN0cnVjdHVyZWRDb250ZW50OlAobSgpLEUoKSkub3B0aW9uYWwoKSxpc0Vycm9yOlooKS5vcHRpb25hbCgpfSk7cmkub3IodGUuZXh0ZW5kKHt0b29sUmVzdWx0OkUoKX0pKTtjb25zdCBsaD13bi5leHRlbmQoe25hbWU6bSgpLGFyZ3VtZW50czpQKG0oKSxFKCkpLm9wdGlvbmFsKCl9KSx3bT1lZS5leHRlbmQoe21ldGhvZDpwKCJ0b29scy9jYWxsIikscGFyYW1zOmxofSksZGg9dmUuZXh0ZW5kKHttZXRob2Q6cCgibm90aWZpY2F0aW9ucy90b29scy9saXN0X2NoYW5nZWQiKSxwYXJhbXM6Z2Uub3B0aW9uYWwoKX0pO2Yoe2F1dG9SZWZyZXNoOlooKS5kZWZhdWx0KCEwKSxkZWJvdW5jZU1zOlQoKS5pbnQoKS5ub25uZWdhdGl2ZSgpLmRlZmF1bHQoMzAwKX0pO2NvbnN0IEltPVEoWyJkZWJ1ZyIsImluZm8iLCJub3RpY2UiLCJ3YXJuaW5nIiwiZXJyb3IiLCJjcml0aWNhbCIsImFsZXJ0IiwiZW1lcmdlbmN5Il0pLG1oPXBlLmV4dGVuZCh7bGV2ZWw6SW19KSxwaD1lZS5leHRlbmQoe21ldGhvZDpwKCJsb2dnaW5nL3NldExldmVsIikscGFyYW1zOm1ofSksZmg9Z2UuZXh0ZW5kKHtsZXZlbDpJbSxsb2dnZXI6bSgpLm9wdGlvbmFsKCksZGF0YTpFKCl9KSxnaD12ZS5leHRlbmQoe21ldGhvZDpwKCJub3RpZmljYXRpb25zL21lc3NhZ2UiKSxwYXJhbXM6Zmh9KSx2aD1mKHtuYW1lOm0oKS5vcHRpb25hbCgpfSksaGg9Zih7aGludHM6SSh2aCkub3B0aW9uYWwoKSxjb3N0UHJpb3JpdHk6VCgpLm1pbigwKS5tYXgoMSkub3B0aW9uYWwoKSxzcGVlZFByaW9yaXR5OlQoKS5taW4oMCkubWF4KDEpLm9wdGlvbmFsKCksaW50ZWxsaWdlbmNlUHJpb3JpdHk6VCgpLm1pbigwKS5tYXgoMSkub3B0aW9uYWwoKX0pLCRoPWYoe21vZGU6UShbImF1dG8iLCJyZXF1aXJlZCIsIm5vbmUiXSkub3B0aW9uYWwoKX0pLF9oPWYoe3R5cGU6cCgidG9vbF9yZXN1bHQiKSx0b29sVXNlSWQ6bSgpLmRlc2NyaWJlKCJUaGUgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBjb3JyZXNwb25kaW5nIHRvb2wgY2FsbC4iKSxjb250ZW50OkkoVW4pLmRlZmF1bHQoW10pLHN0cnVjdHVyZWRDb250ZW50OmYoe30pLmxvb3NlKCkub3B0aW9uYWwoKSxpc0Vycm9yOlooKS5vcHRpb25hbCgpLF9tZXRhOlAobSgpLEUoKSkub3B0aW9uYWwoKX0pLGJoPV9uKCJ0eXBlIixbZXMsdHMsbnNdKSxGbj1fbigidHlwZSIsW2VzLHRzLG5zLHJoLF9oXSkseWg9Zih7cm9sZTpPbixjb250ZW50OlUoW0ZuLEkoRm4pXSksX21ldGE6UChtKCksRSgpKS5vcHRpb25hbCgpfSksa2g9d24uZXh0ZW5kKHttZXNzYWdlczpJKHloKSxtb2RlbFByZWZlcmVuY2VzOmhoLm9wdGlvbmFsKCksc3lzdGVtUHJvbXB0Om0oKS5vcHRpb25hbCgpLGluY2x1ZGVDb250ZXh0OlEoWyJub25lIiwidGhpc1NlcnZlciIsImFsbFNlcnZlcnMiXSkub3B0aW9uYWwoKSx0ZW1wZXJhdHVyZTpUKCkub3B0aW9uYWwoKSxtYXhUb2tlbnM6VCgpLmludCgpLHN0b3BTZXF1ZW5jZXM6SShtKCkpLm9wdGlvbmFsKCksbWV0YWRhdGE6Qi5vcHRpb25hbCgpLHRvb2xzOkkocnMpLm9wdGlvbmFsKCksdG9vbENob2ljZTokaC5vcHRpb25hbCgpfSksU2g9ZWUuZXh0ZW5kKHttZXRob2Q6cCgic2FtcGxpbmcvY3JlYXRlTWVzc2FnZSIpLHBhcmFtczpraH0pLHptPXRlLmV4dGVuZCh7bW9kZWw6bSgpLHN0b3BSZWFzb246cShRKFsiZW5kVHVybiIsInN0b3BTZXF1ZW5jZSIsIm1heFRva2VucyJdKS5vcihtKCkpKSxyb2xlOk9uLGNvbnRlbnQ6Ymh9KSx4bT10ZS5leHRlbmQoe21vZGVsOm0oKSxzdG9wUmVhc29uOnEoUShbImVuZFR1cm4iLCJzdG9wU2VxdWVuY2UiLCJtYXhUb2tlbnMiLCJ0b29sVXNlIl0pLm9yKG0oKSkpLHJvbGU6T24sY29udGVudDpVKFtGbixJKEZuKV0pfSksd2g9Zih7dHlwZTpwKCJib29sZWFuIiksdGl0bGU6bSgpLm9wdGlvbmFsKCksZGVzY3JpcHRpb246bSgpLm9wdGlvbmFsKCksZGVmYXVsdDpaKCkub3B0aW9uYWwoKX0pLEloPWYoe3R5cGU6cCgic3RyaW5nIiksdGl0bGU6bSgpLm9wdGlvbmFsKCksZGVzY3JpcHRpb246bSgpLm9wdGlvbmFsKCksbWluTGVuZ3RoOlQoKS5vcHRpb25hbCgpLG1heExlbmd0aDpUKCkub3B0aW9uYWwoKSxmb3JtYXQ6UShbImVtYWlsIiwidXJpIiwiZGF0ZSIsImRhdGUtdGltZSJdKS5vcHRpb25hbCgpLGRlZmF1bHQ6bSgpLm9wdGlvbmFsKCl9KSx6aD1mKHt0eXBlOlEoWyJudW1iZXIiLCJpbnRlZ2VyIl0pLHRpdGxlOm0oKS5vcHRpb25hbCgpLGRlc2NyaXB0aW9uOm0oKS5vcHRpb25hbCgpLG1pbmltdW06VCgpLm9wdGlvbmFsKCksbWF4aW11bTpUKCkub3B0aW9uYWwoKSxkZWZhdWx0OlQoKS5vcHRpb25hbCgpfSkseGg9Zih7dHlwZTpwKCJzdHJpbmciKSx0aXRsZTptKCkub3B0aW9uYWwoKSxkZXNjcmlwdGlvbjptKCkub3B0aW9uYWwoKSxlbnVtOkkobSgpKSxkZWZhdWx0Om0oKS5vcHRpb25hbCgpfSksVGg9Zih7dHlwZTpwKCJzdHJpbmciKSx0aXRsZTptKCkub3B0aW9uYWwoKSxkZXNjcmlwdGlvbjptKCkub3B0aW9uYWwoKSxvbmVPZjpJKGYoe2NvbnN0Om0oKSx0aXRsZTptKCl9KSksZGVmYXVsdDptKCkub3B0aW9uYWwoKX0pLGpoPWYoe3R5cGU6cCgic3RyaW5nIiksdGl0bGU6bSgpLm9wdGlvbmFsKCksZGVzY3JpcHRpb246bSgpLm9wdGlvbmFsKCksZW51bTpJKG0oKSksZW51bU5hbWVzOkkobSgpKS5vcHRpb25hbCgpLGRlZmF1bHQ6bSgpLm9wdGlvbmFsKCl9KSxPaD1VKFt4aCxUaF0pLFVoPWYoe3R5cGU6cCgiYXJyYXkiKSx0aXRsZTptKCkub3B0aW9uYWwoKSxkZXNjcmlwdGlvbjptKCkub3B0aW9uYWwoKSxtaW5JdGVtczpUKCkub3B0aW9uYWwoKSxtYXhJdGVtczpUKCkub3B0aW9uYWwoKSxpdGVtczpmKHt0eXBlOnAoInN0cmluZyIpLGVudW06SShtKCkpfSksZGVmYXVsdDpJKG0oKSkub3B0aW9uYWwoKX0pLFBoPWYoe3R5cGU6cCgiYXJyYXkiKSx0aXRsZTptKCkub3B0aW9uYWwoKSxkZXNjcmlwdGlvbjptKCkub3B0aW9uYWwoKSxtaW5JdGVtczpUKCkub3B0aW9uYWwoKSxtYXhJdGVtczpUKCkub3B0aW9uYWwoKSxpdGVtczpmKHthbnlPZjpJKGYoe2NvbnN0Om0oKSx0aXRsZTptKCl9KSl9KSxkZWZhdWx0OkkobSgpKS5vcHRpb25hbCgpfSksTmg9VShbVWgsUGhdKSxEaD1VKFtqaCxPaCxOaF0pLEVoPVUoW0RoLHdoLEloLHpoXSksWmg9d24uZXh0ZW5kKHttb2RlOnAoImZvcm0iKS5vcHRpb25hbCgpLG1lc3NhZ2U6bSgpLHJlcXVlc3RlZFNjaGVtYTpmKHt0eXBlOnAoIm9iamVjdCIpLHByb3BlcnRpZXM6UChtKCksRWgpLHJlcXVpcmVkOkkobSgpKS5vcHRpb25hbCgpfSl9KSxSaD13bi5leHRlbmQoe21vZGU6cCgidXJsIiksbWVzc2FnZTptKCksZWxpY2l0YXRpb25JZDptKCksdXJsOm0oKS51cmwoKX0pLENoPVUoW1poLFJoXSksQWg9ZWUuZXh0ZW5kKHttZXRob2Q6cCgiZWxpY2l0YXRpb24vY3JlYXRlIikscGFyYW1zOkNofSksTGg9Z2UuZXh0ZW5kKHtlbGljaXRhdGlvbklkOm0oKX0pLE1oPXZlLmV4dGVuZCh7bWV0aG9kOnAoIm5vdGlmaWNhdGlvbnMvZWxpY2l0YXRpb24vY29tcGxldGUiKSxwYXJhbXM6TGh9KSxxaD10ZS5leHRlbmQoe2FjdGlvbjpRKFsiYWNjZXB0IiwiZGVjbGluZSIsImNhbmNlbCJdKSxjb250ZW50OlNuKHQ9PnQ9PT1udWxsP3ZvaWQgMDp0LFAobSgpLFUoW20oKSxUKCksWigpLEkobSgpKV0pKS5vcHRpb25hbCgpKX0pLEZoPWYoe3R5cGU6cCgicmVmL3Jlc291cmNlIiksdXJpOm0oKX0pLEpoPWYoe3R5cGU6cCgicmVmL3Byb21wdCIpLG5hbWU6bSgpfSksSGg9cGUuZXh0ZW5kKHtyZWY6VShbSmgsRmhdKSxhcmd1bWVudDpmKHtuYW1lOm0oKSx2YWx1ZTptKCl9KSxjb250ZXh0OmYoe2FyZ3VtZW50czpQKG0oKSxtKCkpLm9wdGlvbmFsKCl9KS5vcHRpb25hbCgpfSksV2g9ZWUuZXh0ZW5kKHttZXRob2Q6cCgiY29tcGxldGlvbi9jb21wbGV0ZSIpLHBhcmFtczpIaH0pLEJoPXRlLmV4dGVuZCh7Y29tcGxldGlvbjpZKHt2YWx1ZXM6SShtKCkpLm1heCgxMDApLHRvdGFsOnEoVCgpLmludCgpKSxoYXNNb3JlOnEoWigpKX0pfSksVmg9Zih7dXJpOm0oKS5zdGFydHNXaXRoKCJmaWxlOi8vIiksbmFtZTptKCkub3B0aW9uYWwoKSxfbWV0YTpQKG0oKSxFKCkpLm9wdGlvbmFsKCl9KSxLaD1lZS5leHRlbmQoe21ldGhvZDpwKCJyb290cy9saXN0IikscGFyYW1zOnBlLm9wdGlvbmFsKCl9KSxHaD10ZS5leHRlbmQoe3Jvb3RzOkkoVmgpfSksWGg9dmUuZXh0ZW5kKHttZXRob2Q6cCgibm90aWZpY2F0aW9ucy9yb290cy9saXN0X2NoYW5nZWQiKSxwYXJhbXM6Z2Uub3B0aW9uYWwoKX0pO1UoW25pLFR2LFdoLHBoLG5oLFF2LEF2LEx2LEZ2LFd2LFZ2LHdtLFNtLFdhLFZhLEthLFhhXSk7VShbRmEsSmEsVXYsWGgscW5dKTtVKFtxYSx6bSx4bSxxaCxHaCxCYSxHYSxIYV0pO1UoW25pLFNoLEFoLEtoLFdhLFZhLEthLFhhXSk7VShbRmEsSmEsZ2gsR3YsSnYsZGgsYWgscW4sTWhdKTtVKFtxYSxPdixCaCxvaCxlaCxfbSxNdixibSxyaSx1aCxCYSxHYSxIYV0pO2NsYXNzIE4gZXh0ZW5kcyBFcnJvcntjb25zdHJ1Y3RvcihuLHIsbyl7c3VwZXIoYE1DUCBlcnJvciAke259OiAke3J9YCksdGhpcy5jb2RlPW4sdGhpcy5kYXRhPW8sdGhpcy5uYW1lPSJNY3BFcnJvciJ9c3RhdGljIGZyb21FcnJvcihuLHIsbyl7aWYobj09PVIuVXJsRWxpY2l0YXRpb25SZXF1aXJlZCYmbyl7Y29uc3QgZT1vO2lmKGUuZWxpY2l0YXRpb25zKXJldHVybiBuZXcgWWgoZS5lbGljaXRhdGlvbnMscil9cmV0dXJuIG5ldyBOKG4scixvKX19Y2xhc3MgWWggZXh0ZW5kcyBOe2NvbnN0cnVjdG9yKG4scj1gVVJMIGVsaWNpdGF0aW9uJHtuLmxlbmd0aD4xPyJzIjoiIn0gcmVxdWlyZWRgKXtzdXBlcihSLlVybEVsaWNpdGF0aW9uUmVxdWlyZWQscix7ZWxpY2l0YXRpb25zOm59KX1nZXQgZWxpY2l0YXRpb25zKCl7cmV0dXJuIHRoaXMuZGF0YT8uZWxpY2l0YXRpb25zPz9bXX19ZnVuY3Rpb24geGUodCl7cmV0dXJuIHQ9PT0iY29tcGxldGVkInx8dD09PSJmYWlsZWQifHx0PT09ImNhbmNlbGxlZCJ9bmV3IFNldCgiQUJDREVGR0hJSktMTU5PUFFSU1RVVlhZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ4eXowMTIzNDU2Nzg5Iik7ZnVuY3Rpb24gQ3ModCl7Y29uc3Qgcj10dih0KT8ubWV0aG9kO2lmKCFyKXRocm93IG5ldyBFcnJvcigiU2NoZW1hIGlzIG1pc3NpbmcgYSBtZXRob2QgbGl0ZXJhbCIpO2NvbnN0IG89bnYocik7aWYodHlwZW9mIG8hPSJzdHJpbmciKXRocm93IG5ldyBFcnJvcigiU2NoZW1hIG1ldGhvZCBsaXRlcmFsIG11c3QgYmUgYSBzdHJpbmciKTtyZXR1cm4gb31mdW5jdGlvbiBBcyh0LG4pe2NvbnN0IHI9UWQodCxuKTtpZighci5zdWNjZXNzKXRocm93IHIuZXJyb3I7cmV0dXJuIHIuZGF0YX1jb25zdCBRaD02ZTQ7Y2xhc3MgZSR7Y29uc3RydWN0b3Iobil7dGhpcy5fb3B0aW9ucz1uLHRoaXMuX3JlcXVlc3RNZXNzYWdlSWQ9MCx0aGlzLl9yZXF1ZXN0SGFuZGxlcnM9bmV3IE1hcCx0aGlzLl9yZXF1ZXN0SGFuZGxlckFib3J0Q29udHJvbGxlcnM9bmV3IE1hcCx0aGlzLl9ub3RpZmljYXRpb25IYW5kbGVycz1uZXcgTWFwLHRoaXMuX3Jlc3BvbnNlSGFuZGxlcnM9bmV3IE1hcCx0aGlzLl9wcm9ncmVzc0hhbmRsZXJzPW5ldyBNYXAsdGhpcy5fdGltZW91dEluZm89bmV3IE1hcCx0aGlzLl9wZW5kaW5nRGVib3VuY2VkTm90aWZpY2F0aW9ucz1uZXcgU2V0LHRoaXMuX3Rhc2tQcm9ncmVzc1Rva2Vucz1uZXcgTWFwLHRoaXMuX3JlcXVlc3RSZXNvbHZlcnM9bmV3IE1hcCx0aGlzLnNldE5vdGlmaWNhdGlvbkhhbmRsZXIoRmEscj0+e3RoaXMuX29uY2FuY2VsKHIpfSksdGhpcy5zZXROb3RpZmljYXRpb25IYW5kbGVyKEphLHI9Pnt0aGlzLl9vbnByb2dyZXNzKHIpfSksdGhpcy5zZXRSZXF1ZXN0SGFuZGxlcihuaSxyPT4oe30pKSx0aGlzLl90YXNrU3RvcmU9bj8udGFza1N0b3JlLHRoaXMuX3Rhc2tNZXNzYWdlUXVldWU9bj8udGFza01lc3NhZ2VRdWV1ZSx0aGlzLl90YXNrU3RvcmUmJih0aGlzLnNldFJlcXVlc3RIYW5kbGVyKFdhLGFzeW5jKHIsbyk9Pntjb25zdCBlPWF3YWl0IHRoaXMuX3Rhc2tTdG9yZS5nZXRUYXNrKHIucGFyYW1zLnRhc2tJZCxvLnNlc3Npb25JZCk7aWYoIWUpdGhyb3cgbmV3IE4oUi5JbnZhbGlkUGFyYW1zLCJGYWlsZWQgdG8gcmV0cmlldmUgdGFzazogVGFzayBub3QgZm91bmQiKTtyZXR1cm57Li4uZX19KSx0aGlzLnNldFJlcXVlc3RIYW5kbGVyKFZhLGFzeW5jKHIsbyk9Pntjb25zdCBlPWFzeW5jKCk9Pntjb25zdCBpPXIucGFyYW1zLnRhc2tJZDtpZih0aGlzLl90YXNrTWVzc2FnZVF1ZXVlKXtsZXQgcztmb3IoO3M9YXdhaXQgdGhpcy5fdGFza01lc3NhZ2VRdWV1ZS5kZXF1ZXVlKGksby5zZXNzaW9uSWQpOyl7aWYocy50eXBlPT09InJlc3BvbnNlInx8cy50eXBlPT09ImVycm9yIil7Y29uc3QgYz1zLm1lc3NhZ2UsdT1jLmlkLGw9dGhpcy5fcmVxdWVzdFJlc29sdmVycy5nZXQodSk7aWYobClpZih0aGlzLl9yZXF1ZXN0UmVzb2x2ZXJzLmRlbGV0ZSh1KSxzLnR5cGU9PT0icmVzcG9uc2UiKWwoYyk7ZWxzZXtjb25zdCBnPWMsdj1uZXcgTihnLmVycm9yLmNvZGUsZy5lcnJvci5tZXNzYWdlLGcuZXJyb3IuZGF0YSk7bCh2KX1lbHNle2NvbnN0IGc9cy50eXBlPT09InJlc3BvbnNlIj8iUmVzcG9uc2UiOiJFcnJvciI7dGhpcy5fb25lcnJvcihuZXcgRXJyb3IoYCR7Z30gaGFuZGxlciBtaXNzaW5nIGZvciByZXF1ZXN0ICR7dX1gKSl9Y29udGludWV9YXdhaXQgdGhpcy5fdHJhbnNwb3J0Py5zZW5kKHMubWVzc2FnZSx7cmVsYXRlZFJlcXVlc3RJZDpvLnJlcXVlc3RJZH0pfX1jb25zdCBhPWF3YWl0IHRoaXMuX3Rhc2tTdG9yZS5nZXRUYXNrKGksby5zZXNzaW9uSWQpO2lmKCFhKXRocm93IG5ldyBOKFIuSW52YWxpZFBhcmFtcyxgVGFzayBub3QgZm91bmQ6ICR7aX1gKTtpZigheGUoYS5zdGF0dXMpKXJldHVybiBhd2FpdCB0aGlzLl93YWl0Rm9yVGFza1VwZGF0ZShpLG8uc2lnbmFsKSxhd2FpdCBlKCk7aWYoeGUoYS5zdGF0dXMpKXtjb25zdCBzPWF3YWl0IHRoaXMuX3Rhc2tTdG9yZS5nZXRUYXNrUmVzdWx0KGksby5zZXNzaW9uSWQpO3JldHVybiB0aGlzLl9jbGVhclRhc2tRdWV1ZShpKSx7Li4ucyxfbWV0YTp7Li4ucy5fbWV0YSxbVGVdOnt0YXNrSWQ6aX19fX1yZXR1cm4gYXdhaXQgZSgpfTtyZXR1cm4gYXdhaXQgZSgpfSksdGhpcy5zZXRSZXF1ZXN0SGFuZGxlcihLYSxhc3luYyhyLG8pPT57dHJ5e2NvbnN0e3Rhc2tzOmUsbmV4dEN1cnNvcjppfT1hd2FpdCB0aGlzLl90YXNrU3RvcmUubGlzdFRhc2tzKHIucGFyYW1zPy5jdXJzb3Isby5zZXNzaW9uSWQpO3JldHVybnt0YXNrczplLG5leHRDdXJzb3I6aSxfbWV0YTp7fX19Y2F0Y2goZSl7dGhyb3cgbmV3IE4oUi5JbnZhbGlkUGFyYW1zLGBGYWlsZWQgdG8gbGlzdCB0YXNrczogJHtlIGluc3RhbmNlb2YgRXJyb3I/ZS5tZXNzYWdlOlN0cmluZyhlKX1gKX19KSx0aGlzLnNldFJlcXVlc3RIYW5kbGVyKFhhLGFzeW5jKHIsbyk9Pnt0cnl7Y29uc3QgZT1hd2FpdCB0aGlzLl90YXNrU3RvcmUuZ2V0VGFzayhyLnBhcmFtcy50YXNrSWQsby5zZXNzaW9uSWQpO2lmKCFlKXRocm93IG5ldyBOKFIuSW52YWxpZFBhcmFtcyxgVGFzayBub3QgZm91bmQ6ICR7ci5wYXJhbXMudGFza0lkfWApO2lmKHhlKGUuc3RhdHVzKSl0aHJvdyBuZXcgTihSLkludmFsaWRQYXJhbXMsYENhbm5vdCBjYW5jZWwgdGFzayBpbiB0ZXJtaW5hbCBzdGF0dXM6ICR7ZS5zdGF0dXN9YCk7YXdhaXQgdGhpcy5fdGFza1N0b3JlLnVwZGF0ZVRhc2tTdGF0dXMoci5wYXJhbXMudGFza0lkLCJjYW5jZWxsZWQiLCJDbGllbnQgY2FuY2VsbGVkIHRhc2sgZXhlY3V0aW9uLiIsby5zZXNzaW9uSWQpLHRoaXMuX2NsZWFyVGFza1F1ZXVlKHIucGFyYW1zLnRhc2tJZCk7Y29uc3QgaT1hd2FpdCB0aGlzLl90YXNrU3RvcmUuZ2V0VGFzayhyLnBhcmFtcy50YXNrSWQsby5zZXNzaW9uSWQpO2lmKCFpKXRocm93IG5ldyBOKFIuSW52YWxpZFBhcmFtcyxgVGFzayBub3QgZm91bmQgYWZ0ZXIgY2FuY2VsbGF0aW9uOiAke3IucGFyYW1zLnRhc2tJZH1gKTtyZXR1cm57X21ldGE6e30sLi4uaX19Y2F0Y2goZSl7dGhyb3cgZSBpbnN0YW5jZW9mIE4/ZTpuZXcgTihSLkludmFsaWRSZXF1ZXN0LGBGYWlsZWQgdG8gY2FuY2VsIHRhc2s6ICR7ZSBpbnN0YW5jZW9mIEVycm9yP2UubWVzc2FnZTpTdHJpbmcoZSl9YCl9fSkpfWFzeW5jIF9vbmNhbmNlbChuKXtpZighbi5wYXJhbXMucmVxdWVzdElkKXJldHVybjt0aGlzLl9yZXF1ZXN0SGFuZGxlckFib3J0Q29udHJvbGxlcnMuZ2V0KG4ucGFyYW1zLnJlcXVlc3RJZCk/LmFib3J0KG4ucGFyYW1zLnJlYXNvbil9X3NldHVwVGltZW91dChuLHIsbyxlLGk9ITEpe3RoaXMuX3RpbWVvdXRJbmZvLnNldChuLHt0aW1lb3V0SWQ6c2V0VGltZW91dChlLHIpLHN0YXJ0VGltZTpEYXRlLm5vdygpLHRpbWVvdXQ6cixtYXhUb3RhbFRpbWVvdXQ6byxyZXNldFRpbWVvdXRPblByb2dyZXNzOmksb25UaW1lb3V0OmV9KX1fcmVzZXRUaW1lb3V0KG4pe2NvbnN0IHI9dGhpcy5fdGltZW91dEluZm8uZ2V0KG4pO2lmKCFyKXJldHVybiExO2NvbnN0IG89RGF0ZS5ub3coKS1yLnN0YXJ0VGltZTtpZihyLm1heFRvdGFsVGltZW91dCYmbz49ci5tYXhUb3RhbFRpbWVvdXQpdGhyb3cgdGhpcy5fdGltZW91dEluZm8uZGVsZXRlKG4pLE4uZnJvbUVycm9yKFIuUmVxdWVzdFRpbWVvdXQsIk1heGltdW0gdG90YWwgdGltZW91dCBleGNlZWRlZCIse21heFRvdGFsVGltZW91dDpyLm1heFRvdGFsVGltZW91dCx0b3RhbEVsYXBzZWQ6b30pO3JldHVybiBjbGVhclRpbWVvdXQoci50aW1lb3V0SWQpLHIudGltZW91dElkPXNldFRpbWVvdXQoci5vblRpbWVvdXQsci50aW1lb3V0KSwhMH1fY2xlYW51cFRpbWVvdXQobil7Y29uc3Qgcj10aGlzLl90aW1lb3V0SW5mby5nZXQobik7ciYmKGNsZWFyVGltZW91dChyLnRpbWVvdXRJZCksdGhpcy5fdGltZW91dEluZm8uZGVsZXRlKG4pKX1hc3luYyBjb25uZWN0KG4pe2lmKHRoaXMuX3RyYW5zcG9ydCl0aHJvdyBuZXcgRXJyb3IoIkFscmVhZHkgY29ubmVjdGVkIHRvIGEgdHJhbnNwb3J0LiBDYWxsIGNsb3NlKCkgYmVmb3JlIGNvbm5lY3RpbmcgdG8gYSBuZXcgdHJhbnNwb3J0LCBvciB1c2UgYSBzZXBhcmF0ZSBQcm90b2NvbCBpbnN0YW5jZSBwZXIgY29ubmVjdGlvbi4iKTt0aGlzLl90cmFuc3BvcnQ9bjtjb25zdCByPXRoaXMudHJhbnNwb3J0Py5vbmNsb3NlO3RoaXMuX3RyYW5zcG9ydC5vbmNsb3NlPSgpPT57cj8uKCksdGhpcy5fb25jbG9zZSgpfTtjb25zdCBvPXRoaXMudHJhbnNwb3J0Py5vbmVycm9yO3RoaXMuX3RyYW5zcG9ydC5vbmVycm9yPWk9PntvPy4oaSksdGhpcy5fb25lcnJvcihpKX07Y29uc3QgZT10aGlzLl90cmFuc3BvcnQ/Lm9ubWVzc2FnZTt0aGlzLl90cmFuc3BvcnQub25tZXNzYWdlPShpLGEpPT57ZT8uKGksYSksWm4oaSl8fCR2KGkpP3RoaXMuX29ucmVzcG9uc2UoaSk6UnMoaSk/dGhpcy5fb25yZXF1ZXN0KGksYSk6aHYoaSk/dGhpcy5fb25ub3RpZmljYXRpb24oaSk6dGhpcy5fb25lcnJvcihuZXcgRXJyb3IoYFVua25vd24gbWVzc2FnZSB0eXBlOiAke0pTT04uc3RyaW5naWZ5KGkpfWApKX0sYXdhaXQgdGhpcy5fdHJhbnNwb3J0LnN0YXJ0KCl9X29uY2xvc2UoKXtjb25zdCBuPXRoaXMuX3Jlc3BvbnNlSGFuZGxlcnM7dGhpcy5fcmVzcG9uc2VIYW5kbGVycz1uZXcgTWFwLHRoaXMuX3Byb2dyZXNzSGFuZGxlcnMuY2xlYXIoKSx0aGlzLl90YXNrUHJvZ3Jlc3NUb2tlbnMuY2xlYXIoKSx0aGlzLl9wZW5kaW5nRGVib3VuY2VkTm90aWZpY2F0aW9ucy5jbGVhcigpO2Zvcihjb25zdCBvIG9mIHRoaXMuX3RpbWVvdXRJbmZvLnZhbHVlcygpKWNsZWFyVGltZW91dChvLnRpbWVvdXRJZCk7dGhpcy5fdGltZW91dEluZm8uY2xlYXIoKTtmb3IoY29uc3QgbyBvZiB0aGlzLl9yZXF1ZXN0SGFuZGxlckFib3J0Q29udHJvbGxlcnMudmFsdWVzKCkpby5hYm9ydCgpO3RoaXMuX3JlcXVlc3RIYW5kbGVyQWJvcnRDb250cm9sbGVycy5jbGVhcigpO2NvbnN0IHI9Ti5mcm9tRXJyb3IoUi5Db25uZWN0aW9uQ2xvc2VkLCJDb25uZWN0aW9uIGNsb3NlZCIpO3RoaXMuX3RyYW5zcG9ydD12b2lkIDAsdGhpcy5vbmNsb3NlPy4oKTtmb3IoY29uc3QgbyBvZiBuLnZhbHVlcygpKW8ocil9X29uZXJyb3Iobil7dGhpcy5vbmVycm9yPy4obil9X29ubm90aWZpY2F0aW9uKG4pe2NvbnN0IHI9dGhpcy5fbm90aWZpY2F0aW9uSGFuZGxlcnMuZ2V0KG4ubWV0aG9kKT8/dGhpcy5mYWxsYmFja05vdGlmaWNhdGlvbkhhbmRsZXI7ciE9PXZvaWQgMCYmUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKT0+cihuKSkuY2F0Y2gobz0+dGhpcy5fb25lcnJvcihuZXcgRXJyb3IoYFVuY2F1Z2h0IGVycm9yIGluIG5vdGlmaWNhdGlvbiBoYW5kbGVyOiAke299YCkpKX1fb25yZXF1ZXN0KG4scil7Y29uc3Qgbz10aGlzLl9yZXF1ZXN0SGFuZGxlcnMuZ2V0KG4ubWV0aG9kKT8/dGhpcy5mYWxsYmFja1JlcXVlc3RIYW5kbGVyLGU9dGhpcy5fdHJhbnNwb3J0LGk9bi5wYXJhbXM/Ll9tZXRhPy5bVGVdPy50YXNrSWQ7aWYobz09PXZvaWQgMCl7Y29uc3QgbD17anNvbnJwYzoiMi4wIixpZDpuLmlkLGVycm9yOntjb2RlOlIuTWV0aG9kTm90Rm91bmQsbWVzc2FnZToiTWV0aG9kIG5vdCBmb3VuZCJ9fTtpJiZ0aGlzLl90YXNrTWVzc2FnZVF1ZXVlP3RoaXMuX2VucXVldWVUYXNrTWVzc2FnZShpLHt0eXBlOiJlcnJvciIsbWVzc2FnZTpsLHRpbWVzdGFtcDpEYXRlLm5vdygpfSxlPy5zZXNzaW9uSWQpLmNhdGNoKGc9PnRoaXMuX29uZXJyb3IobmV3IEVycm9yKGBGYWlsZWQgdG8gZW5xdWV1ZSBlcnJvciByZXNwb25zZTogJHtnfWApKSk6ZT8uc2VuZChsKS5jYXRjaChnPT50aGlzLl9vbmVycm9yKG5ldyBFcnJvcihgRmFpbGVkIHRvIHNlbmQgYW4gZXJyb3IgcmVzcG9uc2U6ICR7Z31gKSkpO3JldHVybn1jb25zdCBhPW5ldyBBYm9ydENvbnRyb2xsZXI7dGhpcy5fcmVxdWVzdEhhbmRsZXJBYm9ydENvbnRyb2xsZXJzLnNldChuLmlkLGEpO2NvbnN0IHM9dnYobi5wYXJhbXMpP24ucGFyYW1zLnRhc2s6dm9pZCAwLGM9dGhpcy5fdGFza1N0b3JlP3RoaXMucmVxdWVzdFRhc2tTdG9yZShuLGU/LnNlc3Npb25JZCk6dm9pZCAwLHU9e3NpZ25hbDphLnNpZ25hbCxzZXNzaW9uSWQ6ZT8uc2Vzc2lvbklkLF9tZXRhOm4ucGFyYW1zPy5fbWV0YSxzZW5kTm90aWZpY2F0aW9uOmFzeW5jIGw9PntpZihhLnNpZ25hbC5hYm9ydGVkKXJldHVybjtjb25zdCBnPXtyZWxhdGVkUmVxdWVzdElkOm4uaWR9O2kmJihnLnJlbGF0ZWRUYXNrPXt0YXNrSWQ6aX0pLGF3YWl0IHRoaXMubm90aWZpY2F0aW9uKGwsZyl9LHNlbmRSZXF1ZXN0OmFzeW5jKGwsZyx2KT0+e2lmKGEuc2lnbmFsLmFib3J0ZWQpdGhyb3cgbmV3IE4oUi5Db25uZWN0aW9uQ2xvc2VkLCJSZXF1ZXN0IHdhcyBjYW5jZWxsZWQiKTtjb25zdCAkPXsuLi52LHJlbGF0ZWRSZXF1ZXN0SWQ6bi5pZH07aSYmISQucmVsYXRlZFRhc2smJigkLnJlbGF0ZWRUYXNrPXt0YXNrSWQ6aX0pO2NvbnN0IHk9JC5yZWxhdGVkVGFzaz8udGFza0lkPz9pO3JldHVybiB5JiZjJiZhd2FpdCBjLnVwZGF0ZVRhc2tTdGF0dXMoeSwiaW5wdXRfcmVxdWlyZWQiKSxhd2FpdCB0aGlzLnJlcXVlc3QobCxnLCQpfSxhdXRoSW5mbzpyPy5hdXRoSW5mbyxyZXF1ZXN0SWQ6bi5pZCxyZXF1ZXN0SW5mbzpyPy5yZXF1ZXN0SW5mbyx0YXNrSWQ6aSx0YXNrU3RvcmU6Yyx0YXNrUmVxdWVzdGVkVHRsOnM/LnR0bCxjbG9zZVNTRVN0cmVhbTpyPy5jbG9zZVNTRVN0cmVhbSxjbG9zZVN0YW5kYWxvbmVTU0VTdHJlYW06cj8uY2xvc2VTdGFuZGFsb25lU1NFU3RyZWFtfTtQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpPT57cyYmdGhpcy5hc3NlcnRUYXNrSGFuZGxlckNhcGFiaWxpdHkobi5tZXRob2QpfSkudGhlbigoKT0+byhuLHUpKS50aGVuKGFzeW5jIGw9PntpZihhLnNpZ25hbC5hYm9ydGVkKXJldHVybjtjb25zdCBnPXtyZXN1bHQ6bCxqc29ucnBjOiIyLjAiLGlkOm4uaWR9O2kmJnRoaXMuX3Rhc2tNZXNzYWdlUXVldWU/YXdhaXQgdGhpcy5fZW5xdWV1ZVRhc2tNZXNzYWdlKGkse3R5cGU6InJlc3BvbnNlIixtZXNzYWdlOmcsdGltZXN0YW1wOkRhdGUubm93KCl9LGU/LnNlc3Npb25JZCk6YXdhaXQgZT8uc2VuZChnKX0sYXN5bmMgbD0+e2lmKGEuc2lnbmFsLmFib3J0ZWQpcmV0dXJuO2NvbnN0IGc9e2pzb25ycGM6IjIuMCIsaWQ6bi5pZCxlcnJvcjp7Y29kZTpOdW1iZXIuaXNTYWZlSW50ZWdlcihsLmNvZGUpP2wuY29kZTpSLkludGVybmFsRXJyb3IsbWVzc2FnZTpsLm1lc3NhZ2U/PyJJbnRlcm5hbCBlcnJvciIsLi4ubC5kYXRhIT09dm9pZCAwJiZ7ZGF0YTpsLmRhdGF9fX07aSYmdGhpcy5fdGFza01lc3NhZ2VRdWV1ZT9hd2FpdCB0aGlzLl9lbnF1ZXVlVGFza01lc3NhZ2UoaSx7dHlwZToiZXJyb3IiLG1lc3NhZ2U6Zyx0aW1lc3RhbXA6RGF0ZS5ub3coKX0sZT8uc2Vzc2lvbklkKTphd2FpdCBlPy5zZW5kKGcpfSkuY2F0Y2gobD0+dGhpcy5fb25lcnJvcihuZXcgRXJyb3IoYEZhaWxlZCB0byBzZW5kIHJlc3BvbnNlOiAke2x9YCkpKS5maW5hbGx5KCgpPT57dGhpcy5fcmVxdWVzdEhhbmRsZXJBYm9ydENvbnRyb2xsZXJzLmdldChuLmlkKT09PWEmJnRoaXMuX3JlcXVlc3RIYW5kbGVyQWJvcnRDb250cm9sbGVycy5kZWxldGUobi5pZCl9KX1fb25wcm9ncmVzcyhuKXtjb25zdHtwcm9ncmVzc1Rva2VuOnIsLi4ub309bi5wYXJhbXMsZT1OdW1iZXIociksaT10aGlzLl9wcm9ncmVzc0hhbmRsZXJzLmdldChlKTtpZighaSl7dGhpcy5fb25lcnJvcihuZXcgRXJyb3IoYFJlY2VpdmVkIGEgcHJvZ3Jlc3Mgbm90aWZpY2F0aW9uIGZvciBhbiB1bmtub3duIHRva2VuOiAke0pTT04uc3RyaW5naWZ5KG4pfWApKTtyZXR1cm59Y29uc3QgYT10aGlzLl9yZXNwb25zZUhhbmRsZXJzLmdldChlKSxzPXRoaXMuX3RpbWVvdXRJbmZvLmdldChlKTtpZihzJiZhJiZzLnJlc2V0VGltZW91dE9uUHJvZ3Jlc3MpdHJ5e3RoaXMuX3Jlc2V0VGltZW91dChlKX1jYXRjaChjKXt0aGlzLl9yZXNwb25zZUhhbmRsZXJzLmRlbGV0ZShlKSx0aGlzLl9wcm9ncmVzc0hhbmRsZXJzLmRlbGV0ZShlKSx0aGlzLl9jbGVhbnVwVGltZW91dChlKSxhKGMpO3JldHVybn1pKG8pfV9vbnJlc3BvbnNlKG4pe2NvbnN0IHI9TnVtYmVyKG4uaWQpLG89dGhpcy5fcmVxdWVzdFJlc29sdmVycy5nZXQocik7aWYobyl7aWYodGhpcy5fcmVxdWVzdFJlc29sdmVycy5kZWxldGUociksWm4obikpbyhuKTtlbHNle2NvbnN0IGE9bmV3IE4obi5lcnJvci5jb2RlLG4uZXJyb3IubWVzc2FnZSxuLmVycm9yLmRhdGEpO28oYSl9cmV0dXJufWNvbnN0IGU9dGhpcy5fcmVzcG9uc2VIYW5kbGVycy5nZXQocik7aWYoZT09PXZvaWQgMCl7dGhpcy5fb25lcnJvcihuZXcgRXJyb3IoYFJlY2VpdmVkIGEgcmVzcG9uc2UgZm9yIGFuIHVua25vd24gbWVzc2FnZSBJRDogJHtKU09OLnN0cmluZ2lmeShuKX1gKSk7cmV0dXJufXRoaXMuX3Jlc3BvbnNlSGFuZGxlcnMuZGVsZXRlKHIpLHRoaXMuX2NsZWFudXBUaW1lb3V0KHIpO2xldCBpPSExO2lmKFpuKG4pJiZuLnJlc3VsdCYmdHlwZW9mIG4ucmVzdWx0PT0ib2JqZWN0Iil7Y29uc3QgYT1uLnJlc3VsdDtpZihhLnRhc2smJnR5cGVvZiBhLnRhc2s9PSJvYmplY3QiKXtjb25zdCBzPWEudGFzazt0eXBlb2Ygcy50YXNrSWQ9PSJzdHJpbmciJiYoaT0hMCx0aGlzLl90YXNrUHJvZ3Jlc3NUb2tlbnMuc2V0KHMudGFza0lkLHIpKX19aWYoaXx8dGhpcy5fcHJvZ3Jlc3NIYW5kbGVycy5kZWxldGUociksWm4obikpZShuKTtlbHNle2NvbnN0IGE9Ti5mcm9tRXJyb3Iobi5lcnJvci5jb2RlLG4uZXJyb3IubWVzc2FnZSxuLmVycm9yLmRhdGEpO2UoYSl9fWdldCB0cmFuc3BvcnQoKXtyZXR1cm4gdGhpcy5fdHJhbnNwb3J0fWFzeW5jIGNsb3NlKCl7YXdhaXQgdGhpcy5fdHJhbnNwb3J0Py5jbG9zZSgpfWFzeW5jKnJlcXVlc3RTdHJlYW0obixyLG8pe2NvbnN0e3Rhc2s6ZX09bz8/e307aWYoIWUpe3RyeXt5aWVsZHt0eXBlOiJyZXN1bHQiLHJlc3VsdDphd2FpdCB0aGlzLnJlcXVlc3QobixyLG8pfX1jYXRjaChhKXt5aWVsZHt0eXBlOiJlcnJvciIsZXJyb3I6YSBpbnN0YW5jZW9mIE4/YTpuZXcgTihSLkludGVybmFsRXJyb3IsU3RyaW5nKGEpKX19cmV0dXJufWxldCBpO3RyeXtjb25zdCBhPWF3YWl0IHRoaXMucmVxdWVzdChuLEhhLG8pO2lmKGEudGFzaylpPWEudGFzay50YXNrSWQseWllbGR7dHlwZToidGFza0NyZWF0ZWQiLHRhc2s6YS50YXNrfTtlbHNlIHRocm93IG5ldyBOKFIuSW50ZXJuYWxFcnJvciwiVGFzayBjcmVhdGlvbiBkaWQgbm90IHJldHVybiBhIHRhc2siKTtmb3IoOzspe2NvbnN0IHM9YXdhaXQgdGhpcy5nZXRUYXNrKHt0YXNrSWQ6aX0sbyk7aWYoeWllbGR7dHlwZToidGFza1N0YXR1cyIsdGFzazpzfSx4ZShzLnN0YXR1cykpe3Muc3RhdHVzPT09ImNvbXBsZXRlZCI/eWllbGR7dHlwZToicmVzdWx0IixyZXN1bHQ6YXdhaXQgdGhpcy5nZXRUYXNrUmVzdWx0KHt0YXNrSWQ6aX0scixvKX06cy5zdGF0dXM9PT0iZmFpbGVkIj95aWVsZHt0eXBlOiJlcnJvciIsZXJyb3I6bmV3IE4oUi5JbnRlcm5hbEVycm9yLGBUYXNrICR7aX0gZmFpbGVkYCl9OnMuc3RhdHVzPT09ImNhbmNlbGxlZCImJih5aWVsZHt0eXBlOiJlcnJvciIsZXJyb3I6bmV3IE4oUi5JbnRlcm5hbEVycm9yLGBUYXNrICR7aX0gd2FzIGNhbmNlbGxlZGApfSk7cmV0dXJufWlmKHMuc3RhdHVzPT09ImlucHV0X3JlcXVpcmVkIil7eWllbGR7dHlwZToicmVzdWx0IixyZXN1bHQ6YXdhaXQgdGhpcy5nZXRUYXNrUmVzdWx0KHt0YXNrSWQ6aX0scixvKX07cmV0dXJufWNvbnN0IGM9cy5wb2xsSW50ZXJ2YWw/P3RoaXMuX29wdGlvbnM/LmRlZmF1bHRUYXNrUG9sbEludGVydmFsPz8xZTM7YXdhaXQgbmV3IFByb21pc2UodT0+c2V0VGltZW91dCh1LGMpKSxvPy5zaWduYWw/LnRocm93SWZBYm9ydGVkKCl9fWNhdGNoKGEpe3lpZWxke3R5cGU6ImVycm9yIixlcnJvcjphIGluc3RhbmNlb2YgTj9hOm5ldyBOKFIuSW50ZXJuYWxFcnJvcixTdHJpbmcoYSkpfX19cmVxdWVzdChuLHIsbyl7Y29uc3R7cmVsYXRlZFJlcXVlc3RJZDplLHJlc3VtcHRpb25Ub2tlbjppLG9ucmVzdW1wdGlvbnRva2VuOmEsdGFzazpzLHJlbGF0ZWRUYXNrOmN9PW8/P3t9O3JldHVybiBuZXcgUHJvbWlzZSgodSxsKT0+e2NvbnN0IGc9Sz0+e2woSyl9O2lmKCF0aGlzLl90cmFuc3BvcnQpe2cobmV3IEVycm9yKCJOb3QgY29ubmVjdGVkIikpO3JldHVybn1pZih0aGlzLl9vcHRpb25zPy5lbmZvcmNlU3RyaWN0Q2FwYWJpbGl0aWVzPT09ITApdHJ5e3RoaXMuYXNzZXJ0Q2FwYWJpbGl0eUZvck1ldGhvZChuLm1ldGhvZCkscyYmdGhpcy5hc3NlcnRUYXNrQ2FwYWJpbGl0eShuLm1ldGhvZCl9Y2F0Y2goSyl7ZyhLKTtyZXR1cm59bz8uc2lnbmFsPy50aHJvd0lmQWJvcnRlZCgpO2NvbnN0IHY9dGhpcy5fcmVxdWVzdE1lc3NhZ2VJZCsrLCQ9ey4uLm4sanNvbnJwYzoiMi4wIixpZDp2fTtvPy5vbnByb2dyZXNzJiYodGhpcy5fcHJvZ3Jlc3NIYW5kbGVycy5zZXQodixvLm9ucHJvZ3Jlc3MpLCQucGFyYW1zPXsuLi5uLnBhcmFtcyxfbWV0YTp7Li4ubi5wYXJhbXM/Ll9tZXRhfHx7fSxwcm9ncmVzc1Rva2VuOnZ9fSkscyYmKCQucGFyYW1zPXsuLi4kLnBhcmFtcyx0YXNrOnN9KSxjJiYoJC5wYXJhbXM9ey4uLiQucGFyYW1zLF9tZXRhOnsuLi4kLnBhcmFtcz8uX21ldGF8fHt9LFtUZV06Y319KTtjb25zdCB5PUs9Pnt0aGlzLl9yZXNwb25zZUhhbmRsZXJzLmRlbGV0ZSh2KSx0aGlzLl9wcm9ncmVzc0hhbmRsZXJzLmRlbGV0ZSh2KSx0aGlzLl9jbGVhbnVwVGltZW91dCh2KSx0aGlzLl90cmFuc3BvcnQ/LnNlbmQoe2pzb25ycGM6IjIuMCIsbWV0aG9kOiJub3RpZmljYXRpb25zL2NhbmNlbGxlZCIscGFyYW1zOntyZXF1ZXN0SWQ6dixyZWFzb246U3RyaW5nKEspfX0se3JlbGF0ZWRSZXF1ZXN0SWQ6ZSxyZXN1bXB0aW9uVG9rZW46aSxvbnJlc3VtcHRpb250b2tlbjphfSkuY2F0Y2goTT0+dGhpcy5fb25lcnJvcihuZXcgRXJyb3IoYEZhaWxlZCB0byBzZW5kIGNhbmNlbGxhdGlvbjogJHtNfWApKSk7Y29uc3QgVz1LIGluc3RhbmNlb2YgTj9LOm5ldyBOKFIuUmVxdWVzdFRpbWVvdXQsU3RyaW5nKEspKTtsKFcpfTt0aGlzLl9yZXNwb25zZUhhbmRsZXJzLnNldCh2LEs9PntpZighbz8uc2lnbmFsPy5hYm9ydGVkKXtpZihLIGluc3RhbmNlb2YgRXJyb3IpcmV0dXJuIGwoSyk7dHJ5e2NvbnN0IFc9UWQocixLLnJlc3VsdCk7Vy5zdWNjZXNzP3UoVy5kYXRhKTpsKFcuZXJyb3IpfWNhdGNoKFcpe2woVyl9fX0pLG8/LnNpZ25hbD8uYWRkRXZlbnRMaXN0ZW5lcigiYWJvcnQiLCgpPT57eShvPy5zaWduYWw/LnJlYXNvbil9KTtjb25zdCBIPW8/LnRpbWVvdXQ/P1FoLEw9KCk9PnkoTi5mcm9tRXJyb3IoUi5SZXF1ZXN0VGltZW91dCwiUmVxdWVzdCB0aW1lZCBvdXQiLHt0aW1lb3V0Okh9KSk7dGhpcy5fc2V0dXBUaW1lb3V0KHYsSCxvPy5tYXhUb3RhbFRpbWVvdXQsTCxvPy5yZXNldFRpbWVvdXRPblByb2dyZXNzPz8hMSk7Y29uc3QgTWU9Yz8udGFza0lkO2lmKE1lKXtjb25zdCBLPVc9Pntjb25zdCBNPXRoaXMuX3Jlc3BvbnNlSGFuZGxlcnMuZ2V0KHYpO00/TShXKTp0aGlzLl9vbmVycm9yKG5ldyBFcnJvcihgUmVzcG9uc2UgaGFuZGxlciBtaXNzaW5nIGZvciBzaWRlLWNoYW5uZWxlZCByZXF1ZXN0ICR7dn1gKSl9O3RoaXMuX3JlcXVlc3RSZXNvbHZlcnMuc2V0KHYsSyksdGhpcy5fZW5xdWV1ZVRhc2tNZXNzYWdlKE1lLHt0eXBlOiJyZXF1ZXN0IixtZXNzYWdlOiQsdGltZXN0YW1wOkRhdGUubm93KCl9KS5jYXRjaChXPT57dGhpcy5fY2xlYW51cFRpbWVvdXQodiksbChXKX0pfWVsc2UgdGhpcy5fdHJhbnNwb3J0LnNlbmQoJCx7cmVsYXRlZFJlcXVlc3RJZDplLHJlc3VtcHRpb25Ub2tlbjppLG9ucmVzdW1wdGlvbnRva2VuOmF9KS5jYXRjaChLPT57dGhpcy5fY2xlYW51cFRpbWVvdXQodiksbChLKX0pfSl9YXN5bmMgZ2V0VGFzayhuLHIpe3JldHVybiB0aGlzLnJlcXVlc3Qoe21ldGhvZDoidGFza3MvZ2V0IixwYXJhbXM6bn0sQmEscil9YXN5bmMgZ2V0VGFza1Jlc3VsdChuLHIsbyl7cmV0dXJuIHRoaXMucmVxdWVzdCh7bWV0aG9kOiJ0YXNrcy9yZXN1bHQiLHBhcmFtczpufSxyLG8pfWFzeW5jIGxpc3RUYXNrcyhuLHIpe3JldHVybiB0aGlzLnJlcXVlc3Qoe21ldGhvZDoidGFza3MvbGlzdCIscGFyYW1zOm59LEdhLHIpfWFzeW5jIGNhbmNlbFRhc2sobixyKXtyZXR1cm4gdGhpcy5yZXF1ZXN0KHttZXRob2Q6InRhc2tzL2NhbmNlbCIscGFyYW1zOm59LFJ2LHIpfWFzeW5jIG5vdGlmaWNhdGlvbihuLHIpe2lmKCF0aGlzLl90cmFuc3BvcnQpdGhyb3cgbmV3IEVycm9yKCJOb3QgY29ubmVjdGVkIik7dGhpcy5hc3NlcnROb3RpZmljYXRpb25DYXBhYmlsaXR5KG4ubWV0aG9kKTtjb25zdCBvPXI/LnJlbGF0ZWRUYXNrPy50YXNrSWQ7aWYobyl7Y29uc3Qgcz17Li4ubixqc29ucnBjOiIyLjAiLHBhcmFtczp7Li4ubi5wYXJhbXMsX21ldGE6ey4uLm4ucGFyYW1zPy5fbWV0YXx8e30sW1RlXTpyLnJlbGF0ZWRUYXNrfX19O2F3YWl0IHRoaXMuX2VucXVldWVUYXNrTWVzc2FnZShvLHt0eXBlOiJub3RpZmljYXRpb24iLG1lc3NhZ2U6cyx0aW1lc3RhbXA6RGF0ZS5ub3coKX0pO3JldHVybn1pZigodGhpcy5fb3B0aW9ucz8uZGVib3VuY2VkTm90aWZpY2F0aW9uTWV0aG9kcz8/W10pLmluY2x1ZGVzKG4ubWV0aG9kKSYmIW4ucGFyYW1zJiYhcj8ucmVsYXRlZFJlcXVlc3RJZCYmIXI/LnJlbGF0ZWRUYXNrKXtpZih0aGlzLl9wZW5kaW5nRGVib3VuY2VkTm90aWZpY2F0aW9ucy5oYXMobi5tZXRob2QpKXJldHVybjt0aGlzLl9wZW5kaW5nRGVib3VuY2VkTm90aWZpY2F0aW9ucy5hZGQobi5tZXRob2QpLFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCk9PntpZih0aGlzLl9wZW5kaW5nRGVib3VuY2VkTm90aWZpY2F0aW9ucy5kZWxldGUobi5tZXRob2QpLCF0aGlzLl90cmFuc3BvcnQpcmV0dXJuO2xldCBzPXsuLi5uLGpzb25ycGM6IjIuMCJ9O3I/LnJlbGF0ZWRUYXNrJiYocz17Li4ucyxwYXJhbXM6ey4uLnMucGFyYW1zLF9tZXRhOnsuLi5zLnBhcmFtcz8uX21ldGF8fHt9LFtUZV06ci5yZWxhdGVkVGFza319fSksdGhpcy5fdHJhbnNwb3J0Py5zZW5kKHMscikuY2F0Y2goYz0+dGhpcy5fb25lcnJvcihjKSl9KTtyZXR1cm59bGV0IGE9ey4uLm4sanNvbnJwYzoiMi4wIn07cj8ucmVsYXRlZFRhc2smJihhPXsuLi5hLHBhcmFtczp7Li4uYS5wYXJhbXMsX21ldGE6ey4uLmEucGFyYW1zPy5fbWV0YXx8e30sW1RlXTpyLnJlbGF0ZWRUYXNrfX19KSxhd2FpdCB0aGlzLl90cmFuc3BvcnQuc2VuZChhLHIpfXNldFJlcXVlc3RIYW5kbGVyKG4scil7Y29uc3Qgbz1DcyhuKTt0aGlzLmFzc2VydFJlcXVlc3RIYW5kbGVyQ2FwYWJpbGl0eShvKSx0aGlzLl9yZXF1ZXN0SGFuZGxlcnMuc2V0KG8sKGUsaSk9Pntjb25zdCBhPUFzKG4sZSk7cmV0dXJuIFByb21pc2UucmVzb2x2ZShyKGEsaSkpfSl9cmVtb3ZlUmVxdWVzdEhhbmRsZXIobil7dGhpcy5fcmVxdWVzdEhhbmRsZXJzLmRlbGV0ZShuKX1hc3NlcnRDYW5TZXRSZXF1ZXN0SGFuZGxlcihuKXtpZih0aGlzLl9yZXF1ZXN0SGFuZGxlcnMuaGFzKG4pKXRocm93IG5ldyBFcnJvcihgQSByZXF1ZXN0IGhhbmRsZXIgZm9yICR7bn0gYWxyZWFkeSBleGlzdHMsIHdoaWNoIHdvdWxkIGJlIG92ZXJyaWRkZW5gKX1zZXROb3RpZmljYXRpb25IYW5kbGVyKG4scil7Y29uc3Qgbz1DcyhuKTt0aGlzLl9ub3RpZmljYXRpb25IYW5kbGVycy5zZXQobyxlPT57Y29uc3QgaT1BcyhuLGUpO3JldHVybiBQcm9taXNlLnJlc29sdmUocihpKSl9KX1yZW1vdmVOb3RpZmljYXRpb25IYW5kbGVyKG4pe3RoaXMuX25vdGlmaWNhdGlvbkhhbmRsZXJzLmRlbGV0ZShuKX1fY2xlYW51cFRhc2tQcm9ncmVzc0hhbmRsZXIobil7Y29uc3Qgcj10aGlzLl90YXNrUHJvZ3Jlc3NUb2tlbnMuZ2V0KG4pO3IhPT12b2lkIDAmJih0aGlzLl9wcm9ncmVzc0hhbmRsZXJzLmRlbGV0ZShyKSx0aGlzLl90YXNrUHJvZ3Jlc3NUb2tlbnMuZGVsZXRlKG4pKX1hc3luYyBfZW5xdWV1ZVRhc2tNZXNzYWdlKG4scixvKXtpZighdGhpcy5fdGFza1N0b3JlfHwhdGhpcy5fdGFza01lc3NhZ2VRdWV1ZSl0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBlbnF1ZXVlIHRhc2sgbWVzc2FnZTogdGFza1N0b3JlIGFuZCB0YXNrTWVzc2FnZVF1ZXVlIGFyZSBub3QgY29uZmlndXJlZCIpO2NvbnN0IGU9dGhpcy5fb3B0aW9ucz8ubWF4VGFza1F1ZXVlU2l6ZTthd2FpdCB0aGlzLl90YXNrTWVzc2FnZVF1ZXVlLmVucXVldWUobixyLG8sZSl9YXN5bmMgX2NsZWFyVGFza1F1ZXVlKG4scil7aWYodGhpcy5fdGFza01lc3NhZ2VRdWV1ZSl7Y29uc3Qgbz1hd2FpdCB0aGlzLl90YXNrTWVzc2FnZVF1ZXVlLmRlcXVldWVBbGwobixyKTtmb3IoY29uc3QgZSBvZiBvKWlmKGUudHlwZT09PSJyZXF1ZXN0IiYmUnMoZS5tZXNzYWdlKSl7Y29uc3QgaT1lLm1lc3NhZ2UuaWQsYT10aGlzLl9yZXF1ZXN0UmVzb2x2ZXJzLmdldChpKTthPyhhKG5ldyBOKFIuSW50ZXJuYWxFcnJvciwiVGFzayBjYW5jZWxsZWQgb3IgY29tcGxldGVkIikpLHRoaXMuX3JlcXVlc3RSZXNvbHZlcnMuZGVsZXRlKGkpKTp0aGlzLl9vbmVycm9yKG5ldyBFcnJvcihgUmVzb2x2ZXIgbWlzc2luZyBmb3IgcmVxdWVzdCAke2l9IGR1cmluZyB0YXNrICR7bn0gY2xlYW51cGApKX19fWFzeW5jIF93YWl0Rm9yVGFza1VwZGF0ZShuLHIpe2xldCBvPXRoaXMuX29wdGlvbnM/LmRlZmF1bHRUYXNrUG9sbEludGVydmFsPz8xZTM7dHJ5e2NvbnN0IGU9YXdhaXQgdGhpcy5fdGFza1N0b3JlPy5nZXRUYXNrKG4pO2U/LnBvbGxJbnRlcnZhbCYmKG89ZS5wb2xsSW50ZXJ2YWwpfWNhdGNoe31yZXR1cm4gbmV3IFByb21pc2UoKGUsaSk9PntpZihyLmFib3J0ZWQpe2kobmV3IE4oUi5JbnZhbGlkUmVxdWVzdCwiUmVxdWVzdCBjYW5jZWxsZWQiKSk7cmV0dXJufWNvbnN0IGE9c2V0VGltZW91dChlLG8pO3IuYWRkRXZlbnRMaXN0ZW5lcigiYWJvcnQiLCgpPT57Y2xlYXJUaW1lb3V0KGEpLGkobmV3IE4oUi5JbnZhbGlkUmVxdWVzdCwiUmVxdWVzdCBjYW5jZWxsZWQiKSl9LHtvbmNlOiEwfSl9KX1yZXF1ZXN0VGFza1N0b3JlKG4scil7Y29uc3Qgbz10aGlzLl90YXNrU3RvcmU7aWYoIW8pdGhyb3cgbmV3IEVycm9yKCJObyB0YXNrIHN0b3JlIGNvbmZpZ3VyZWQiKTtyZXR1cm57Y3JlYXRlVGFzazphc3luYyBlPT57aWYoIW4pdGhyb3cgbmV3IEVycm9yKCJObyByZXF1ZXN0IHByb3ZpZGVkIik7cmV0dXJuIGF3YWl0IG8uY3JlYXRlVGFzayhlLG4uaWQse21ldGhvZDpuLm1ldGhvZCxwYXJhbXM6bi5wYXJhbXN9LHIpfSxnZXRUYXNrOmFzeW5jIGU9Pntjb25zdCBpPWF3YWl0IG8uZ2V0VGFzayhlLHIpO2lmKCFpKXRocm93IG5ldyBOKFIuSW52YWxpZFBhcmFtcywiRmFpbGVkIHRvIHJldHJpZXZlIHRhc2s6IFRhc2sgbm90IGZvdW5kIik7cmV0dXJuIGl9LHN0b3JlVGFza1Jlc3VsdDphc3luYyhlLGksYSk9Pnthd2FpdCBvLnN0b3JlVGFza1Jlc3VsdChlLGksYSxyKTtjb25zdCBzPWF3YWl0IG8uZ2V0VGFzayhlLHIpO2lmKHMpe2NvbnN0IGM9cW4ucGFyc2Uoe21ldGhvZDoibm90aWZpY2F0aW9ucy90YXNrcy9zdGF0dXMiLHBhcmFtczpzfSk7YXdhaXQgdGhpcy5ub3RpZmljYXRpb24oYykseGUocy5zdGF0dXMpJiZ0aGlzLl9jbGVhbnVwVGFza1Byb2dyZXNzSGFuZGxlcihlKX19LGdldFRhc2tSZXN1bHQ6ZT0+by5nZXRUYXNrUmVzdWx0KGUsciksdXBkYXRlVGFza1N0YXR1czphc3luYyhlLGksYSk9Pntjb25zdCBzPWF3YWl0IG8uZ2V0VGFzayhlLHIpO2lmKCFzKXRocm93IG5ldyBOKFIuSW52YWxpZFBhcmFtcyxgVGFzayAiJHtlfSIgbm90IGZvdW5kIC0gaXQgbWF5IGhhdmUgYmVlbiBjbGVhbmVkIHVwYCk7aWYoeGUocy5zdGF0dXMpKXRocm93IG5ldyBOKFIuSW52YWxpZFBhcmFtcyxgQ2Fubm90IHVwZGF0ZSB0YXNrICIke2V9IiBmcm9tIHRlcm1pbmFsIHN0YXR1cyAiJHtzLnN0YXR1c30iIHRvICIke2l9Ii4gVGVybWluYWwgc3RhdGVzIChjb21wbGV0ZWQsIGZhaWxlZCwgY2FuY2VsbGVkKSBjYW5ub3QgdHJhbnNpdGlvbiB0byBvdGhlciBzdGF0ZXMuYCk7YXdhaXQgby51cGRhdGVUYXNrU3RhdHVzKGUsaSxhLHIpO2NvbnN0IGM9YXdhaXQgby5nZXRUYXNrKGUscik7aWYoYyl7Y29uc3QgdT1xbi5wYXJzZSh7bWV0aG9kOiJub3RpZmljYXRpb25zL3Rhc2tzL3N0YXR1cyIscGFyYW1zOmN9KTthd2FpdCB0aGlzLm5vdGlmaWNhdGlvbih1KSx4ZShjLnN0YXR1cykmJnRoaXMuX2NsZWFudXBUYXNrUHJvZ3Jlc3NIYW5kbGVyKGUpfX0sbGlzdFRhc2tzOmU9Pm8ubGlzdFRhc2tzKGUscil9fX1mdW5jdGlvbiBMcyh0KXtyZXR1cm4gdCE9PW51bGwmJnR5cGVvZiB0PT0ib2JqZWN0IiYmIUFycmF5LmlzQXJyYXkodCl9ZnVuY3Rpb24gdCQodCxuKXtjb25zdCByPXsuLi50fTtmb3IoY29uc3QgbyBpbiBuKXtjb25zdCBlPW8saT1uW2VdO2lmKGk9PT12b2lkIDApY29udGludWU7Y29uc3QgYT1yW2VdO0xzKGEpJiZMcyhpKT9yW2VdPXsuLi5hLC4uLml9OnJbZV09aX1yZXR1cm4gcn0odD0+dHlwZW9mIHJlcXVpcmU8InUiP3JlcXVpcmU6dHlwZW9mIFByb3h5PCJ1Ij9uZXcgUHJveHkodCx7Z2V0OihuLHIpPT4odHlwZW9mIHJlcXVpcmU8InUiP3JlcXVpcmU6bilbcl19KTp0KShmdW5jdGlvbih0KXtpZih0eXBlb2YgcmVxdWlyZTwidSIpcmV0dXJuIHJlcXVpcmUuYXBwbHkodGhpcyxhcmd1bWVudHMpO3Rocm93IEVycm9yKCdEeW5hbWljIHJlcXVpcmUgb2YgIicrdCsnIiBpcyBub3Qgc3VwcG9ydGVkJyl9KTtjbGFzcyBuJCBleHRlbmRzIGUke19yZWdpc3RlcmVkTWV0aG9kcz1uZXcgU2V0O19ldmVudFNsb3RzPW5ldyBNYXA7b25FdmVudERpc3BhdGNoKG4scil7fV9lbnN1cmVFdmVudFNsb3Qobil7bGV0IHI9dGhpcy5fZXZlbnRTbG90cy5nZXQobik7aWYoIXIpe2xldCBvPXRoaXMuZXZlbnRTY2hlbWFzW25dO2lmKCFvKXRocm93IEVycm9yKGBVbmtub3duIGV2ZW50OiAke1N0cmluZyhuKX1gKTtyPXtsaXN0ZW5lcnM6W119LHRoaXMuX2V2ZW50U2xvdHMuc2V0KG4scik7bGV0IGU9by5zaGFwZS5tZXRob2QudmFsdWU7dGhpcy5fcmVnaXN0ZXJlZE1ldGhvZHMuYWRkKGUpO2xldCBpPXI7c3VwZXIuc2V0Tm90aWZpY2F0aW9uSGFuZGxlcihvLGE9PntsZXQgcz1hLnBhcmFtczt0aGlzLm9uRXZlbnREaXNwYXRjaChuLHMpLGkub25IYW5kbGVyPy4ocyk7Zm9yKGxldCBjIG9mWy4uLmkubGlzdGVuZXJzXSljKHMpfSl9cmV0dXJuIHJ9c2V0RXZlbnRIYW5kbGVyKG4scil7bGV0IG89dGhpcy5fZW5zdXJlRXZlbnRTbG90KG4pO28ub25IYW5kbGVyJiZyJiZjb25zb2xlLndhcm4oYFtNQ1AgQXBwc10gb24ke1N0cmluZyhuKX0gaGFuZGxlciByZXBsYWNlZC4gVXNlIGFkZEV2ZW50TGlzdGVuZXIoIiR7U3RyaW5nKG4pfSIsIOKApikgdG8gYWRkIG11bHRpcGxlIGxpc3RlbmVycyB3aXRob3V0IHJlcGxhY2luZy5gKSxvLm9uSGFuZGxlcj1yfWdldEV2ZW50SGFuZGxlcihuKXtyZXR1cm4gdGhpcy5fZXZlbnRTbG90cy5nZXQobik/Lm9uSGFuZGxlcn1hZGRFdmVudExpc3RlbmVyKG4scil7dGhpcy5fZW5zdXJlRXZlbnRTbG90KG4pLmxpc3RlbmVycy5wdXNoKHIpfXJlbW92ZUV2ZW50TGlzdGVuZXIobixyKXtsZXQgbz10aGlzLl9ldmVudFNsb3RzLmdldChuKTtpZighbylyZXR1cm47bGV0IGU9by5saXN0ZW5lcnMuaW5kZXhPZihyKTtlIT09LTEmJm8ubGlzdGVuZXJzLnNwbGljZShlLDEpfXNldFJlcXVlc3RIYW5kbGVyPShuLHIpPT57dGhpcy5fYXNzZXJ0TWV0aG9kTm90UmVnaXN0ZXJlZChuLCJzZXRSZXF1ZXN0SGFuZGxlciIpLHN1cGVyLnNldFJlcXVlc3RIYW5kbGVyKG4scil9O3NldE5vdGlmaWNhdGlvbkhhbmRsZXI9KG4scik9Pnt0aGlzLl9hc3NlcnRNZXRob2ROb3RSZWdpc3RlcmVkKG4sInNldE5vdGlmaWNhdGlvbkhhbmRsZXIiKSxzdXBlci5zZXROb3RpZmljYXRpb25IYW5kbGVyKG4scil9O3dhcm5JZlJlcXVlc3RIYW5kbGVyUmVwbGFjZWQobixyLG8pe3ImJm8mJmNvbnNvbGUud2FybihgW01DUCBBcHBzXSAke259IGhhbmRsZXIgcmVwbGFjZWQuIFByZXZpb3VzIGhhbmRsZXIgd2lsbCBubyBsb25nZXIgYmUgY2FsbGVkLmApfXJlcGxhY2VSZXF1ZXN0SGFuZGxlcj0obixyKT0+e2xldCBvPW4uc2hhcGUubWV0aG9kLnZhbHVlO3RoaXMuX3JlZ2lzdGVyZWRNZXRob2RzLmFkZChvKSxzdXBlci5zZXRSZXF1ZXN0SGFuZGxlcihuLHIpfTtfYXNzZXJ0TWV0aG9kTm90UmVnaXN0ZXJlZChuLHIpe2xldCBvPW4uc2hhcGUubWV0aG9kLnZhbHVlO2lmKHRoaXMuX3JlZ2lzdGVyZWRNZXRob2RzLmhhcyhvKSl0aHJvdyBFcnJvcihgSGFuZGxlciBmb3IgIiR7b30iIGFscmVhZHkgcmVnaXN0ZXJlZCAodmlhICR7cn0pLiBVc2UgYWRkRXZlbnRMaXN0ZW5lcigpIHRvIGF0dGFjaCBtdWx0aXBsZSBsaXN0ZW5lcnMsIG9yIHRoZSBvbiogc2V0dGVyIGZvciByZXBsYWNlIHNlbWFudGljcy5gKTt0aGlzLl9yZWdpc3RlcmVkTWV0aG9kcy5hZGQobyl9fXZhciByJD0iMjAyNi0wMS0yNiIsaSQ9InVpL25vdGlmaWNhdGlvbnMvdG9vbC1pbnB1dC1wYXJ0aWFsIjtjbGFzcyBvJHtldmVudFRhcmdldDtldmVudFNvdXJjZTttZXNzYWdlTGlzdGVuZXI7Y29uc3RydWN0b3Iobj13aW5kb3cucGFyZW50LHIpe3RoaXMuZXZlbnRUYXJnZXQ9bix0aGlzLmV2ZW50U291cmNlPXIsdGhpcy5tZXNzYWdlTGlzdGVuZXI9bz0+e2lmKHImJm8uc291cmNlIT09dGhpcy5ldmVudFNvdXJjZSl7Y29uc29sZS5kZWJ1ZygiSWdub3JpbmcgbWVzc2FnZSBmcm9tIHVua25vd24gc291cmNlIixvKTtyZXR1cm59bGV0IGU9X3Yuc2FmZVBhcnNlKG8uZGF0YSk7ZS5zdWNjZXNzPyhjb25zb2xlLmRlYnVnKCJQYXJzZWQgbWVzc2FnZSIsZS5kYXRhKSx0aGlzLm9ubWVzc2FnZT8uKGUuZGF0YSkpOm8uZGF0YT8uanNvbnJwYyE9PSIyLjAiP2NvbnNvbGUuZGVidWcoIklnbm9yaW5nIG5vbi1KU09OLVJQQyBtZXNzYWdlIixlLmVycm9yLm1lc3NhZ2Usbyk6KGNvbnNvbGUuZXJyb3IoIkZhaWxlZCB0byBwYXJzZSBtZXNzYWdlIixlLmVycm9yLm1lc3NhZ2UsbyksdGhpcy5vbmVycm9yPy4oRXJyb3IoIkludmFsaWQgSlNPTi1SUEMgbWVzc2FnZSByZWNlaXZlZDogIitlLmVycm9yLm1lc3NhZ2UpKSl9fWFzeW5jIHN0YXJ0KCl7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMubWVzc2FnZUxpc3RlbmVyKX1hc3luYyBzZW5kKG4scil7bi5tZXRob2QhPT1pJCYmY29uc29sZS5kZWJ1ZygiU2VuZGluZyBtZXNzYWdlIixuKSx0aGlzLmV2ZW50VGFyZ2V0LnBvc3RNZXNzYWdlKG4sIioiKX1hc3luYyBjbG9zZSgpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLm1lc3NhZ2VMaXN0ZW5lciksdGhpcy5vbmNsb3NlPy4oKX1vbmNsb3NlO29uZXJyb3I7b25tZXNzYWdlO3Nlc3Npb25JZDtzZXRQcm90b2NvbFZlcnNpb259dmFyIGEkPVUoW3AoImxpZ2h0IikscCgiZGFyayIpXSkuZGVzY3JpYmUoIkNvbG9yIHRoZW1lIHByZWZlcmVuY2UgZm9yIHRoZSBob3N0IGVudmlyb25tZW50LiIpLEl0PVUoW3AoImlubGluZSIpLHAoImZ1bGxzY3JlZW4iKSxwKCJwaXAiKV0pLmRlc2NyaWJlKCJEaXNwbGF5IG1vZGUgZm9yIFVJIHByZXNlbnRhdGlvbi4iKSxzJD1VKFtwKCItLWNvbG9yLWJhY2tncm91bmQtcHJpbWFyeSIpLHAoIi0tY29sb3ItYmFja2dyb3VuZC1zZWNvbmRhcnkiKSxwKCItLWNvbG9yLWJhY2tncm91bmQtdGVydGlhcnkiKSxwKCItLWNvbG9yLWJhY2tncm91bmQtaW52ZXJzZSIpLHAoIi0tY29sb3ItYmFja2dyb3VuZC1naG9zdCIpLHAoIi0tY29sb3ItYmFja2dyb3VuZC1pbmZvIikscCgiLS1jb2xvci1iYWNrZ3JvdW5kLWRhbmdlciIpLHAoIi0tY29sb3ItYmFja2dyb3VuZC1zdWNjZXNzIikscCgiLS1jb2xvci1iYWNrZ3JvdW5kLXdhcm5pbmciKSxwKCItLWNvbG9yLWJhY2tncm91bmQtZGlzYWJsZWQiKSxwKCItLWNvbG9yLXRleHQtcHJpbWFyeSIpLHAoIi0tY29sb3ItdGV4dC1zZWNvbmRhcnkiKSxwKCItLWNvbG9yLXRleHQtdGVydGlhcnkiKSxwKCItLWNvbG9yLXRleHQtaW52ZXJzZSIpLHAoIi0tY29sb3ItdGV4dC1naG9zdCIpLHAoIi0tY29sb3ItdGV4dC1pbmZvIikscCgiLS1jb2xvci10ZXh0LWRhbmdlciIpLHAoIi0tY29sb3ItdGV4dC1zdWNjZXNzIikscCgiLS1jb2xvci10ZXh0LXdhcm5pbmciKSxwKCItLWNvbG9yLXRleHQtZGlzYWJsZWQiKSxwKCItLWNvbG9yLWJvcmRlci1wcmltYXJ5IikscCgiLS1jb2xvci1ib3JkZXItc2Vjb25kYXJ5IikscCgiLS1jb2xvci1ib3JkZXItdGVydGlhcnkiKSxwKCItLWNvbG9yLWJvcmRlci1pbnZlcnNlIikscCgiLS1jb2xvci1ib3JkZXItZ2hvc3QiKSxwKCItLWNvbG9yLWJvcmRlci1pbmZvIikscCgiLS1jb2xvci1ib3JkZXItZGFuZ2VyIikscCgiLS1jb2xvci1ib3JkZXItc3VjY2VzcyIpLHAoIi0tY29sb3ItYm9yZGVyLXdhcm5pbmciKSxwKCItLWNvbG9yLWJvcmRlci1kaXNhYmxlZCIpLHAoIi0tY29sb3ItcmluZy1wcmltYXJ5IikscCgiLS1jb2xvci1yaW5nLXNlY29uZGFyeSIpLHAoIi0tY29sb3ItcmluZy1pbnZlcnNlIikscCgiLS1jb2xvci1yaW5nLWluZm8iKSxwKCItLWNvbG9yLXJpbmctZGFuZ2VyIikscCgiLS1jb2xvci1yaW5nLXN1Y2Nlc3MiKSxwKCItLWNvbG9yLXJpbmctd2FybmluZyIpLHAoIi0tZm9udC1zYW5zIikscCgiLS1mb250LW1vbm8iKSxwKCItLWZvbnQtd2VpZ2h0LW5vcm1hbCIpLHAoIi0tZm9udC13ZWlnaHQtbWVkaXVtIikscCgiLS1mb250LXdlaWdodC1zZW1pYm9sZCIpLHAoIi0tZm9udC13ZWlnaHQtYm9sZCIpLHAoIi0tZm9udC10ZXh0LXhzLXNpemUiKSxwKCItLWZvbnQtdGV4dC1zbS1zaXplIikscCgiLS1mb250LXRleHQtbWQtc2l6ZSIpLHAoIi0tZm9udC10ZXh0LWxnLXNpemUiKSxwKCItLWZvbnQtaGVhZGluZy14cy1zaXplIikscCgiLS1mb250LWhlYWRpbmctc20tc2l6ZSIpLHAoIi0tZm9udC1oZWFkaW5nLW1kLXNpemUiKSxwKCItLWZvbnQtaGVhZGluZy1sZy1zaXplIikscCgiLS1mb250LWhlYWRpbmcteGwtc2l6ZSIpLHAoIi0tZm9udC1oZWFkaW5nLTJ4bC1zaXplIikscCgiLS1mb250LWhlYWRpbmctM3hsLXNpemUiKSxwKCItLWZvbnQtdGV4dC14cy1saW5lLWhlaWdodCIpLHAoIi0tZm9udC10ZXh0LXNtLWxpbmUtaGVpZ2h0IikscCgiLS1mb250LXRleHQtbWQtbGluZS1oZWlnaHQiKSxwKCItLWZvbnQtdGV4dC1sZy1saW5lLWhlaWdodCIpLHAoIi0tZm9udC1oZWFkaW5nLXhzLWxpbmUtaGVpZ2h0IikscCgiLS1mb250LWhlYWRpbmctc20tbGluZS1oZWlnaHQiKSxwKCItLWZvbnQtaGVhZGluZy1tZC1saW5lLWhlaWdodCIpLHAoIi0tZm9udC1oZWFkaW5nLWxnLWxpbmUtaGVpZ2h0IikscCgiLS1mb250LWhlYWRpbmcteGwtbGluZS1oZWlnaHQiKSxwKCItLWZvbnQtaGVhZGluZy0yeGwtbGluZS1oZWlnaHQiKSxwKCItLWZvbnQtaGVhZGluZy0zeGwtbGluZS1oZWlnaHQiKSxwKCItLWJvcmRlci1yYWRpdXMteHMiKSxwKCItLWJvcmRlci1yYWRpdXMtc20iKSxwKCItLWJvcmRlci1yYWRpdXMtbWQiKSxwKCItLWJvcmRlci1yYWRpdXMtbGciKSxwKCItLWJvcmRlci1yYWRpdXMteGwiKSxwKCItLWJvcmRlci1yYWRpdXMtZnVsbCIpLHAoIi0tYm9yZGVyLXdpZHRoLXJlZ3VsYXIiKSxwKCItLXNoYWRvdy1oYWlybGluZSIpLHAoIi0tc2hhZG93LXNtIikscCgiLS1zaGFkb3ctbWQiKSxwKCItLXNoYWRvdy1sZyIpXSkuZGVzY3JpYmUoIkNTUyB2YXJpYWJsZSBrZXlzIGF2YWlsYWJsZSB0byBNQ1AgYXBwcyBmb3IgdGhlbWluZy4iKSxjJD1QKHMkLmRlc2NyaWJlKGBTdHlsZSB2YXJpYWJsZXMgZm9yIHRoZW1pbmcgTUNQIGFwcHMuCgpJbmRpdmlkdWFsIHN0eWxlIGtleXMgYXJlIG9wdGlvbmFsIC0gaG9zdHMgbWF5IHByb3ZpZGUgYW55IHN1YnNldCBvZiB0aGVzZSB2YWx1ZXMuClZhbHVlcyBhcmUgc3RyaW5ncyBjb250YWluaW5nIENTUyB2YWx1ZXMgKGNvbG9ycywgc2l6ZXMsIGZvbnQgc3RhY2tzLCBldGMuKS4KCk5vdGU6IFRoaXMgdHlwZSB1c2VzIFxgUmVjb3JkPEssIHN0cmluZyB8IHVuZGVmaW5lZD5cYCByYXRoZXIgdGhhbiBcYFBhcnRpYWw8UmVjb3JkPEssIHN0cmluZz4+XGAKZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBab2Qgc2NoZW1hIGdlbmVyYXRpb24uIEJvdGggYXJlIGZ1bmN0aW9uYWxseSBlcXVpdmFsZW50IGZvciB2YWxpZGF0aW9uLmApLFUoW20oKSxYZSgpXSkuZGVzY3JpYmUoYFN0eWxlIHZhcmlhYmxlcyBmb3IgdGhlbWluZyBNQ1AgYXBwcy4KCkluZGl2aWR1YWwgc3R5bGUga2V5cyBhcmUgb3B0aW9uYWwgLSBob3N0cyBtYXkgcHJvdmlkZSBhbnkgc3Vic2V0IG9mIHRoZXNlIHZhbHVlcy4KVmFsdWVzIGFyZSBzdHJpbmdzIGNvbnRhaW5pbmcgQ1NTIHZhbHVlcyAoY29sb3JzLCBzaXplcywgZm9udCBzdGFja3MsIGV0Yy4pLgoKTm90ZTogVGhpcyB0eXBlIHVzZXMgXGBSZWNvcmQ8Sywgc3RyaW5nIHwgdW5kZWZpbmVkPlxgIHJhdGhlciB0aGFuIFxgUGFydGlhbDxSZWNvcmQ8Sywgc3RyaW5nPj5cYApmb3IgY29tcGF0aWJpbGl0eSB3aXRoIFpvZCBzY2hlbWEgZ2VuZXJhdGlvbi4gQm90aCBhcmUgZnVuY3Rpb25hbGx5IGVxdWl2YWxlbnQgZm9yIHZhbGlkYXRpb24uYCkpLmRlc2NyaWJlKGBTdHlsZSB2YXJpYWJsZXMgZm9yIHRoZW1pbmcgTUNQIGFwcHMuCgpJbmRpdmlkdWFsIHN0eWxlIGtleXMgYXJlIG9wdGlvbmFsIC0gaG9zdHMgbWF5IHByb3ZpZGUgYW55IHN1YnNldCBvZiB0aGVzZSB2YWx1ZXMuClZhbHVlcyBhcmUgc3RyaW5ncyBjb250YWluaW5nIENTUyB2YWx1ZXMgKGNvbG9ycywgc2l6ZXMsIGZvbnQgc3RhY2tzLCBldGMuKS4KCk5vdGU6IFRoaXMgdHlwZSB1c2VzIFxgUmVjb3JkPEssIHN0cmluZyB8IHVuZGVmaW5lZD5cYCByYXRoZXIgdGhhbiBcYFBhcnRpYWw8UmVjb3JkPEssIHN0cmluZz4+XGAKZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBab2Qgc2NoZW1hIGdlbmVyYXRpb24uIEJvdGggYXJlIGZ1bmN0aW9uYWxseSBlcXVpdmFsZW50IGZvciB2YWxpZGF0aW9uLmApO2Yoe21ldGhvZDpwKCJ1aS9vcGVuLWxpbmsiKSxwYXJhbXM6Zih7dXJsOm0oKS5kZXNjcmliZSgiVVJMIHRvIG9wZW4gaW4gdGhlIGhvc3QncyBicm93c2VyIil9KX0pO3ZhciB1JD1mKHtpc0Vycm9yOlooKS5vcHRpb25hbCgpLmRlc2NyaWJlKCJUcnVlIGlmIHRoZSBob3N0IGZhaWxlZCB0byBvcGVuIHRoZSBVUkwgKGUuZy4sIGR1ZSB0byBzZWN1cml0eSBwb2xpY3kpLiIpfSkucGFzc3Rocm91Z2goKSxsJD1mKHtpc0Vycm9yOlooKS5vcHRpb25hbCgpLmRlc2NyaWJlKCJUcnVlIGlmIHRoZSBkb3dubG9hZCBmYWlsZWQgKGUuZy4sIHVzZXIgY2FuY2VsbGVkIG9yIGhvc3QgZGVuaWVkKS4iKX0pLnBhc3N0aHJvdWdoKCksZCQ9Zih7aXNFcnJvcjpaKCkub3B0aW9uYWwoKS5kZXNjcmliZSgiVHJ1ZSBpZiB0aGUgaG9zdCByZWplY3RlZCBvciBmYWlsZWQgdG8gZGVsaXZlciB0aGUgbWVzc2FnZS4iKX0pLnBhc3N0aHJvdWdoKCk7Zih7bWV0aG9kOnAoInVpL25vdGlmaWNhdGlvbnMvc2FuZGJveC1wcm94eS1yZWFkeSIpLHBhcmFtczpmKHt9KX0pO3ZhciBpcz1mKHtjb25uZWN0RG9tYWluczpJKG0oKSkub3B0aW9uYWwoKS5kZXNjcmliZShgT3JpZ2lucyBmb3IgbmV0d29yayByZXF1ZXN0cyAoZmV0Y2gvWEhSL1dlYlNvY2tldCkuCgotIE1hcHMgdG8gQ1NQIFxgY29ubmVjdC1zcmNcYCBkaXJlY3RpdmUKLSBFbXB0eSBvciBvbWl0dGVkIOKGkiBubyBuZXR3b3JrIGNvbm5lY3Rpb25zIChzZWN1cmUgZGVmYXVsdClgKSxyZXNvdXJjZURvbWFpbnM6SShtKCkpLm9wdGlvbmFsKCkuZGVzY3JpYmUoIk9yaWdpbnMgZm9yIHN0YXRpYyByZXNvdXJjZXMgKGltYWdlcywgc2NyaXB0cywgc3R5bGVzaGVldHMsIGZvbnRzLCBtZWRpYSkuXG5cbi0gTWFwcyB0byBDU1AgYGltZy1zcmNgLCBgc2NyaXB0LXNyY2AsIGBzdHlsZS1zcmNgLCBgZm9udC1zcmNgLCBgbWVkaWEtc3JjYCBkaXJlY3RpdmVzXG4tIFdpbGRjYXJkIHN1YmRvbWFpbnMgc3VwcG9ydGVkOiBgaHR0cHM6Ly8qLmV4YW1wbGUuY29tYFxuLSBFbXB0eSBvciBvbWl0dGVkIOKGkiBubyBuZXR3b3JrIHJlc291cmNlcyAoc2VjdXJlIGRlZmF1bHQpIiksZnJhbWVEb21haW5zOkkobSgpKS5vcHRpb25hbCgpLmRlc2NyaWJlKCJPcmlnaW5zIGZvciBuZXN0ZWQgaWZyYW1lcy5cblxuLSBNYXBzIHRvIENTUCBgZnJhbWUtc3JjYCBkaXJlY3RpdmVcbi0gRW1wdHkgb3Igb21pdHRlZCDihpIgbm8gbmVzdGVkIGlmcmFtZXMgYWxsb3dlZCAoYGZyYW1lLXNyYyAnbm9uZSdgKSIpLGJhc2VVcmlEb21haW5zOkkobSgpKS5vcHRpb25hbCgpLmRlc2NyaWJlKCJBbGxvd2VkIGJhc2UgVVJJcyBmb3IgdGhlIGRvY3VtZW50LlxuXG4tIE1hcHMgdG8gQ1NQIGBiYXNlLXVyaWAgZGlyZWN0aXZlXG4tIEVtcHR5IG9yIG9taXR0ZWQg4oaSIG9ubHkgc2FtZSBvcmlnaW4gYWxsb3dlZCAoYGJhc2UtdXJpICdzZWxmJ2ApIil9KSxvcz1mKHtjYW1lcmE6Zih7fSkub3B0aW9uYWwoKS5kZXNjcmliZSgiUmVxdWVzdCBjYW1lcmEgYWNjZXNzLlxuXG5NYXBzIHRvIFBlcm1pc3Npb24gUG9saWN5IGBjYW1lcmFgIGZlYXR1cmUuIiksbWljcm9waG9uZTpmKHt9KS5vcHRpb25hbCgpLmRlc2NyaWJlKCJSZXF1ZXN0IG1pY3JvcGhvbmUgYWNjZXNzLlxuXG5NYXBzIHRvIFBlcm1pc3Npb24gUG9saWN5IGBtaWNyb3Bob25lYCBmZWF0dXJlLiIpLGdlb2xvY2F0aW9uOmYoe30pLm9wdGlvbmFsKCkuZGVzY3JpYmUoIlJlcXVlc3QgZ2VvbG9jYXRpb24gYWNjZXNzLlxuXG5NYXBzIHRvIFBlcm1pc3Npb24gUG9saWN5IGBnZW9sb2NhdGlvbmAgZmVhdHVyZS4iKSxjbGlwYm9hcmRXcml0ZTpmKHt9KS5vcHRpb25hbCgpLmRlc2NyaWJlKCJSZXF1ZXN0IGNsaXBib2FyZCB3cml0ZSBhY2Nlc3MuXG5cbk1hcHMgdG8gUGVybWlzc2lvbiBQb2xpY3kgYGNsaXBib2FyZC13cml0ZWAgZmVhdHVyZS4iKX0pO2Yoe21ldGhvZDpwKCJ1aS9ub3RpZmljYXRpb25zL3NpemUtY2hhbmdlZCIpLHBhcmFtczpmKHt3aWR0aDpUKCkub3B0aW9uYWwoKS5kZXNjcmliZSgiTmV3IHdpZHRoIGluIHBpeGVscy4iKSxoZWlnaHQ6VCgpLm9wdGlvbmFsKCkuZGVzY3JpYmUoIk5ldyBoZWlnaHQgaW4gcGl4ZWxzLiIpfSl9KTt2YXIgbSQ9Zih7bWV0aG9kOnAoInVpL25vdGlmaWNhdGlvbnMvdG9vbC1pbnB1dCIpLHBhcmFtczpmKHthcmd1bWVudHM6UChtKCksRSgpLmRlc2NyaWJlKCJDb21wbGV0ZSB0b29sIGNhbGwgYXJndW1lbnRzIGFzIGtleS12YWx1ZSBwYWlycy4iKSkub3B0aW9uYWwoKS5kZXNjcmliZSgiQ29tcGxldGUgdG9vbCBjYWxsIGFyZ3VtZW50cyBhcyBrZXktdmFsdWUgcGFpcnMuIil9KX0pLHAkPWYoe21ldGhvZDpwKCJ1aS9ub3RpZmljYXRpb25zL3Rvb2wtaW5wdXQtcGFydGlhbCIpLHBhcmFtczpmKHthcmd1bWVudHM6UChtKCksRSgpLmRlc2NyaWJlKCJQYXJ0aWFsIHRvb2wgY2FsbCBhcmd1bWVudHMgKGluY29tcGxldGUsIG1heSBjaGFuZ2UpLiIpKS5vcHRpb25hbCgpLmRlc2NyaWJlKCJQYXJ0aWFsIHRvb2wgY2FsbCBhcmd1bWVudHMgKGluY29tcGxldGUsIG1heSBjaGFuZ2UpLiIpfSl9KSxmJD1mKHttZXRob2Q6cCgidWkvbm90aWZpY2F0aW9ucy90b29sLWNhbmNlbGxlZCIpLHBhcmFtczpmKHtyZWFzb246bSgpLm9wdGlvbmFsKCkuZGVzY3JpYmUoJ09wdGlvbmFsIHJlYXNvbiBmb3IgdGhlIGNhbmNlbGxhdGlvbiAoZS5nLiwgInVzZXIgYWN0aW9uIiwgInRpbWVvdXQiKS4nKX0pfSksZyQ9Zih7Zm9udHM6bSgpLm9wdGlvbmFsKCl9KSx2JD1mKHt2YXJpYWJsZXM6YyQub3B0aW9uYWwoKS5kZXNjcmliZSgiQ1NTIHZhcmlhYmxlcyBmb3IgdGhlbWluZyB0aGUgYXBwLiIpLGNzczpnJC5vcHRpb25hbCgpLmRlc2NyaWJlKCJDU1MgYmxvY2tzIHRoYXQgYXBwcyBjYW4gaW5qZWN0LiIpfSksaCQ9Zih7bWV0aG9kOnAoInVpL3Jlc291cmNlLXRlYXJkb3duIikscGFyYW1zOmYoe30pfSk7UChtKCksRSgpKTt2YXIgTXM9Zih7dGV4dDpmKHt9KS5vcHRpb25hbCgpLmRlc2NyaWJlKCJIb3N0IHN1cHBvcnRzIHRleHQgY29udGVudCBibG9ja3MuIiksaW1hZ2U6Zih7fSkub3B0aW9uYWwoKS5kZXNjcmliZSgiSG9zdCBzdXBwb3J0cyBpbWFnZSBjb250ZW50IGJsb2Nrcy4iKSxhdWRpbzpmKHt9KS5vcHRpb25hbCgpLmRlc2NyaWJlKCJIb3N0IHN1cHBvcnRzIGF1ZGlvIGNvbnRlbnQgYmxvY2tzLiIpLHJlc291cmNlOmYoe30pLm9wdGlvbmFsKCkuZGVzY3JpYmUoIkhvc3Qgc3VwcG9ydHMgcmVzb3VyY2UgY29udGVudCBibG9ja3MuIikscmVzb3VyY2VMaW5rOmYoe30pLm9wdGlvbmFsKCkuZGVzY3JpYmUoIkhvc3Qgc3VwcG9ydHMgcmVzb3VyY2UgbGluayBjb250ZW50IGJsb2Nrcy4iKSxzdHJ1Y3R1cmVkQ29udGVudDpmKHt9KS5vcHRpb25hbCgpLmRlc2NyaWJlKCJIb3N0IHN1cHBvcnRzIHN0cnVjdHVyZWQgY29udGVudC4iKX0pO2Yoe21ldGhvZDpwKCJ1aS9ub3RpZmljYXRpb25zL3JlcXVlc3QtdGVhcmRvd24iKSxwYXJhbXM6Zih7fSkub3B0aW9uYWwoKX0pO3ZhciAkJD1mKHtleHBlcmltZW50YWw6UChtKCksUChtKCksaG4oKSkuZGVzY3JpYmUoIkV4cGVyaW1lbnRhbCBmZWF0dXJlcyBrZXllZCBieSBpZGVudGlmaWVyLiIpKS5vcHRpb25hbCgpLmRlc2NyaWJlKCJFeHBlcmltZW50YWwgZmVhdHVyZXMga2V5ZWQgYnkgaWRlbnRpZmllci4iKSxvcGVuTGlua3M6Zih7fSkub3B0aW9uYWwoKS5kZXNjcmliZSgiSG9zdCBzdXBwb3J0cyBvcGVuaW5nIGV4dGVybmFsIFVSTHMuIiksZG93bmxvYWRGaWxlOmYoe30pLm9wdGlvbmFsKCkuZGVzY3JpYmUoIkhvc3Qgc3VwcG9ydHMgZmlsZSBkb3dubG9hZHMgdmlhIHVpL2Rvd25sb2FkLWZpbGUuIiksc2VydmVyVG9vbHM6Zih7bGlzdENoYW5nZWQ6WigpLm9wdGlvbmFsKCkuZGVzY3JpYmUoIkhvc3Qgc3VwcG9ydHMgdG9vbHMvbGlzdF9jaGFuZ2VkIG5vdGlmaWNhdGlvbnMuIil9KS5vcHRpb25hbCgpLmRlc2NyaWJlKCJIb3N0IGNhbiBwcm94eSB0b29sIGNhbGxzIHRvIHRoZSBNQ1Agc2VydmVyLiIpLHNlcnZlclJlc291cmNlczpmKHtsaXN0Q2hhbmdlZDpaKCkub3B0aW9uYWwoKS5kZXNjcmliZSgiSG9zdCBzdXBwb3J0cyByZXNvdXJjZXMvbGlzdF9jaGFuZ2VkIG5vdGlmaWNhdGlvbnMuIil9KS5vcHRpb25hbCgpLmRlc2NyaWJlKCJIb3N0IGNhbiBwcm94eSByZXNvdXJjZSByZWFkcyB0byB0aGUgTUNQIHNlcnZlci4iKSxsb2dnaW5nOmYoe30pLm9wdGlvbmFsKCkuZGVzY3JpYmUoIkhvc3QgYWNjZXB0cyBsb2cgbWVzc2FnZXMuIiksc2FuZGJveDpmKHtwZXJtaXNzaW9uczpvcy5vcHRpb25hbCgpLmRlc2NyaWJlKCJQZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoZSBob3N0IChjYW1lcmEsIG1pY3JvcGhvbmUsIGdlb2xvY2F0aW9uKS4iKSxjc3A6aXMub3B0aW9uYWwoKS5kZXNjcmliZSgiQ1NQIGRvbWFpbnMgYXBwcm92ZWQgYnkgdGhlIGhvc3QuIil9KS5vcHRpb25hbCgpLmRlc2NyaWJlKCJTYW5kYm94IGNvbmZpZ3VyYXRpb24gYXBwbGllZCBieSB0aGUgaG9zdC4iKSx1cGRhdGVNb2RlbENvbnRleHQ6TXMub3B0aW9uYWwoKS5kZXNjcmliZSgiSG9zdCBhY2NlcHRzIGNvbnRleHQgdXBkYXRlcyAodWkvdXBkYXRlLW1vZGVsLWNvbnRleHQpIHRvIGJlIGluY2x1ZGVkIGluIHRoZSBtb2RlbCdzIGNvbnRleHQgZm9yIGZ1dHVyZSB0dXJucy4iKSxtZXNzYWdlOk1zLm9wdGlvbmFsKCkuZGVzY3JpYmUoIkhvc3Qgc3VwcG9ydHMgcmVjZWl2aW5nIGNvbnRlbnQgbWVzc2FnZXMgKHVpL21lc3NhZ2UpIGZyb20gdGhlIHZpZXcuIiksc2FtcGxpbmc6Zih7dG9vbHM6Zih7fSkub3B0aW9uYWwoKS5kZXNjcmliZSgiSG9zdCBzdXBwb3J0cyB0b29sIHVzZSB2aWEgYHRvb2xzYCBhbmQgYHRvb2xDaG9pY2VgIHBhcmFtZXRlcnMuIil9KS5vcHRpb25hbCgpLmRlc2NyaWJlKCJIb3N0IHN1cHBvcnRzIExMTSBzYW1wbGluZyAoc2FtcGxpbmcvY3JlYXRlTWVzc2FnZSkgZnJvbSB0aGUgdmlldy5cbk1pcnJvcnMgdGhlIE1DUCBgQ2xpZW50Q2FwYWJpbGl0aWVzLnNhbXBsaW5nYCBzaGFwZSBzbyBob3N0cyBjYW4gcGFzcyBpdCB0aHJvdWdoLiIpfSksXyQ9Zih7ZXhwZXJpbWVudGFsOlAobSgpLFAobSgpLGhuKCkpLmRlc2NyaWJlKCJFeHBlcmltZW50YWwgZmVhdHVyZXMga2V5ZWQgYnkgaWRlbnRpZmllci4iKSkub3B0aW9uYWwoKS5kZXNjcmliZSgiRXhwZXJpbWVudGFsIGZlYXR1cmVzIGtleWVkIGJ5IGlkZW50aWZpZXIuIiksdG9vbHM6Zih7bGlzdENoYW5nZWQ6WigpLm9wdGlvbmFsKCkuZGVzY3JpYmUoIkFwcCBzdXBwb3J0cyB0b29scy9saXN0X2NoYW5nZWQgbm90aWZpY2F0aW9ucy4iKX0pLm9wdGlvbmFsKCkuZGVzY3JpYmUoIkFwcCBleHBvc2VzIE1DUC1zdHlsZSB0b29scyB0aGF0IHRoZSBob3N0IGNhbiBjYWxsLiIpLGF2YWlsYWJsZURpc3BsYXlNb2RlczpJKEl0KS5vcHRpb25hbCgpLmRlc2NyaWJlKCJEaXNwbGF5IG1vZGVzIHRoZSBhcHAgc3VwcG9ydHMuIil9KTtmKHttZXRob2Q6cCgidWkvbm90aWZpY2F0aW9ucy9pbml0aWFsaXplZCIpLHBhcmFtczpmKHt9KS5vcHRpb25hbCgpfSk7Zih7Y3NwOmlzLm9wdGlvbmFsKCkuZGVzY3JpYmUoIkNvbnRlbnQgU2VjdXJpdHkgUG9saWN5IGNvbmZpZ3VyYXRpb24gZm9yIFVJIHJlc291cmNlcy4iKSxwZXJtaXNzaW9uczpvcy5vcHRpb25hbCgpLmRlc2NyaWJlKCJTYW5kYm94IHBlcm1pc3Npb25zIHJlcXVlc3RlZCBieSB0aGUgVUkgcmVzb3VyY2UuIiksZG9tYWluOm0oKS5vcHRpb25hbCgpLmRlc2NyaWJlKGBEZWRpY2F0ZWQgb3JpZ2luIGZvciB2aWV3IHNhbmRib3guCgpVc2VmdWwgd2hlbiB2aWV3cyBuZWVkIHN0YWJsZSwgZGVkaWNhdGVkIG9yaWdpbnMgZm9yIE9BdXRoIGNhbGxiYWNrcywgQ09SUyBwb2xpY2llcywgb3IgQVBJIGtleSBhbGxvd2xpc3RzLgoKKipIb3N0LWRlcGVuZGVudDoqKiBUaGUgZm9ybWF0IGFuZCB2YWxpZGF0aW9uIHJ1bGVzIGZvciB0aGlzIGZpZWxkIGFyZSBkZXRlcm1pbmVkIGJ5IGVhY2ggaG9zdC4gU2VydmVycyBNVVNUIGNvbnN1bHQgaG9zdC1zcGVjaWZpYyBkb2N1bWVudGF0aW9uIGZvciB0aGUgZXhwZWN0ZWQgZG9tYWluIGZvcm1hdC4gQ29tbW9uIHBhdHRlcm5zIGluY2x1ZGU6Ci0gSGFzaC1iYXNlZCBzdWJkb21haW5zIChlLmcuLCBcYHtoYXNofS5jbGF1ZGVtY3Bjb250ZW50LmNvbVxgKQotIFVSTC1kZXJpdmVkIHN1YmRvbWFpbnMgKGUuZy4sIFxgd3d3LWV4YW1wbGUtY29tLm9haXVzZXJjb250ZW50LmNvbVxgKQoKSWYgb21pdHRlZCwgaG9zdCB1c2VzIGRlZmF1bHQgc2FuZGJveCBvcmlnaW4gKHR5cGljYWxseSBwZXItY29udmVyc2F0aW9uKS5gKSxwcmVmZXJzQm9yZGVyOlooKS5vcHRpb25hbCgpLmRlc2NyaWJlKGBWaXN1YWwgYm91bmRhcnkgcHJlZmVyZW5jZSAtIHRydWUgaWYgdmlldyBwcmVmZXJzIGEgdmlzaWJsZSBib3JkZXIuCgpCb29sZWFuIHJlcXVlc3Rpbmcgd2hldGhlciBhIHZpc2libGUgYm9yZGVyIGFuZCBiYWNrZ3JvdW5kIGlzIHByb3ZpZGVkIGJ5IHRoZSBob3N0LiBTcGVjaWZ5aW5nIGFuIGV4cGxpY2l0IHZhbHVlIGZvciB0aGlzIGlzIHJlY29tbWVuZGVkIGJlY2F1c2UgaG9zdHMnIGRlZmF1bHRzIG1heSB2YXJ5LgoKLSBcYHRydWVcYDogcmVxdWVzdCB2aXNpYmxlIGJvcmRlciArIGJhY2tncm91bmQKLSBcYGZhbHNlXGA6IHJlcXVlc3Qgbm8gdmlzaWJsZSBib3JkZXIgKyBiYWNrZ3JvdW5kCi0gb21pdHRlZDogaG9zdCBkZWNpZGVzIGJvcmRlcmApfSk7Zih7bWV0aG9kOnAoInVpL3JlcXVlc3QtZGlzcGxheS1tb2RlIikscGFyYW1zOmYoe21vZGU6SXQuZGVzY3JpYmUoIlRoZSBkaXNwbGF5IG1vZGUgYmVpbmcgcmVxdWVzdGVkLiIpfSl9KTt2YXIgYiQ9Zih7bW9kZTpJdC5kZXNjcmliZSgiVGhlIGRpc3BsYXkgbW9kZSB0aGF0IHdhcyBhY3R1YWxseSBzZXQuIE1heSBkaWZmZXIgZnJvbSByZXF1ZXN0ZWQgaWYgbm90IHN1cHBvcnRlZC4iKX0pLnBhc3N0aHJvdWdoKCkseSQ9VShbcCgibW9kZWwiKSxwKCJhcHAiKV0pLmRlc2NyaWJlKCJUb29sIHZpc2liaWxpdHkgc2NvcGUgLSB3aG8gY2FuIGFjY2VzcyB0aGUgdG9vbC4iKTtmKHtyZXNvdXJjZVVyaTptKCkub3B0aW9uYWwoKSx2aXNpYmlsaXR5OkkoeSQpLm9wdGlvbmFsKCkuZGVzY3JpYmUoYFdobyBjYW4gYWNjZXNzIHRoaXMgdG9vbC4gRGVmYXVsdDogWyJtb2RlbCIsICJhcHAiXQotICJtb2RlbCI6IFRvb2wgdmlzaWJsZSB0byBhbmQgY2FsbGFibGUgYnkgdGhlIGFnZW50Ci0gImFwcCI6IFRvb2wgY2FsbGFibGUgYnkgdGhlIGFwcCBmcm9tIHRoaXMgc2VydmVyIG9ubHlgKSxjc3A6RWUoKS5vcHRpb25hbCgpLHBlcm1pc3Npb25zOkVlKCkub3B0aW9uYWwoKX0pO2Yoe21pbWVUeXBlczpJKG0oKSkub3B0aW9uYWwoKS5kZXNjcmliZSgnQXJyYXkgb2Ygc3VwcG9ydGVkIE1JTUUgdHlwZXMgZm9yIFVJIHJlc291cmNlcy5cbk11c3QgaW5jbHVkZSBgInRleHQvaHRtbDtwcm9maWxlPW1jcC1hcHAiYCBmb3IgTUNQIEFwcHMgc3VwcG9ydC4nKX0pO2Yoe21ldGhvZDpwKCJ1aS9kb3dubG9hZC1maWxlIikscGFyYW1zOmYoe2NvbnRlbnRzOkkoVShbeW0sa21dKSkuZGVzY3JpYmUoIlJlc291cmNlIGNvbnRlbnRzIHRvIGRvd25sb2FkIOKAlCBlbWJlZGRlZCAoaW5saW5lIGRhdGEpIG9yIGxpbmtlZCAoaG9zdCBmZXRjaGVzKS4gVXNlcyBzdGFuZGFyZCBNQ1AgcmVzb3VyY2UgdHlwZXMuIil9KX0pO2Yoe21ldGhvZDpwKCJ1aS9tZXNzYWdlIikscGFyYW1zOmYoe3JvbGU6cCgidXNlciIpLmRlc2NyaWJlKCdNZXNzYWdlIHJvbGUsIGN1cnJlbnRseSBvbmx5ICJ1c2VyIiBpcyBzdXBwb3J0ZWQuJyksY29udGVudDpJKFVuKS5kZXNjcmliZSgiTWVzc2FnZSBjb250ZW50IGJsb2NrcyAodGV4dCwgaW1hZ2UsIGV0Yy4pLiIpfSl9KTtmKHttZXRob2Q6cCgidWkvbm90aWZpY2F0aW9ucy9zYW5kYm94LXJlc291cmNlLXJlYWR5IikscGFyYW1zOmYoe2h0bWw6bSgpLmRlc2NyaWJlKCJIVE1MIGNvbnRlbnQgdG8gbG9hZCBpbnRvIHRoZSBpbm5lciBpZnJhbWUuIiksc2FuZGJveDptKCkub3B0aW9uYWwoKS5kZXNjcmliZSgiT3B0aW9uYWwgb3ZlcnJpZGUgZm9yIHRoZSBpbm5lciBpZnJhbWUncyBzYW5kYm94IGF0dHJpYnV0ZS4iKSxjc3A6aXMub3B0aW9uYWwoKS5kZXNjcmliZSgiQ1NQIGNvbmZpZ3VyYXRpb24gZnJvbSByZXNvdXJjZSBtZXRhZGF0YS4iKSxwZXJtaXNzaW9uczpvcy5vcHRpb25hbCgpLmRlc2NyaWJlKCJTYW5kYm94IHBlcm1pc3Npb25zIGZyb20gcmVzb3VyY2UgbWV0YWRhdGEuIil9KX0pO3ZhciBrJD1mKHttZXRob2Q6cCgidWkvbm90aWZpY2F0aW9ucy90b29sLXJlc3VsdCIpLHBhcmFtczpyaS5kZXNjcmliZSgiU3RhbmRhcmQgTUNQIHRvb2wgZXhlY3V0aW9uIHJlc3VsdC4iKX0pLFRtPWYoe3Rvb2xJbmZvOmYoe2lkOkluLm9wdGlvbmFsKCkuZGVzY3JpYmUoIkpTT04tUlBDIGlkIG9mIHRoZSB0b29scy9jYWxsIHJlcXVlc3QuIiksdG9vbDpycy5kZXNjcmliZSgiVG9vbCBkZWZpbml0aW9uIGluY2x1ZGluZyBuYW1lLCBpbnB1dFNjaGVtYSwgZXRjLiIpfSkub3B0aW9uYWwoKS5kZXNjcmliZSgiTWV0YWRhdGEgb2YgdGhlIHRvb2wgY2FsbCB0aGF0IGluc3RhbnRpYXRlZCB0aGlzIEFwcC4iKSx0aGVtZTphJC5vcHRpb25hbCgpLmRlc2NyaWJlKCJDdXJyZW50IGNvbG9yIHRoZW1lIHByZWZlcmVuY2UuIiksc3R5bGVzOnYkLm9wdGlvbmFsKCkuZGVzY3JpYmUoIlN0eWxlIGNvbmZpZ3VyYXRpb24gZm9yIHRoZW1pbmcgdGhlIGFwcC4iKSxkaXNwbGF5TW9kZTpJdC5vcHRpb25hbCgpLmRlc2NyaWJlKCJIb3cgdGhlIFVJIGlzIGN1cnJlbnRseSBkaXNwbGF5ZWQuIiksYXZhaWxhYmxlRGlzcGxheU1vZGVzOkkoSXQpLm9wdGlvbmFsKCkuZGVzY3JpYmUoIkRpc3BsYXkgbW9kZXMgdGhlIGhvc3Qgc3VwcG9ydHMuIiksY29udGFpbmVyRGltZW5zaW9uczpVKFtmKHtoZWlnaHQ6VCgpLmRlc2NyaWJlKCJGaXhlZCBjb250YWluZXIgaGVpZ2h0IGluIHBpeGVscy4iKX0pLGYoe21heEhlaWdodDpVKFtUKCksWGUoKV0pLm9wdGlvbmFsKCkuZGVzY3JpYmUoIk1heGltdW0gY29udGFpbmVyIGhlaWdodCBpbiBwaXhlbHMuIil9KV0pLmFuZChVKFtmKHt3aWR0aDpUKCkuZGVzY3JpYmUoIkZpeGVkIGNvbnRhaW5lciB3aWR0aCBpbiBwaXhlbHMuIil9KSxmKHttYXhXaWR0aDpVKFtUKCksWGUoKV0pLm9wdGlvbmFsKCkuZGVzY3JpYmUoIk1heGltdW0gY29udGFpbmVyIHdpZHRoIGluIHBpeGVscy4iKX0pXSkpLm9wdGlvbmFsKCkuZGVzY3JpYmUoYENvbnRhaW5lciBkaW1lbnNpb25zLiBSZXByZXNlbnRzIHRoZSBkaW1lbnNpb25zIG9mIHRoZSBpZnJhbWUgb3Igb3RoZXIKY29udGFpbmVyIGhvbGRpbmcgdGhlIGFwcC4gU3BlY2lmeSBlaXRoZXIgd2lkdGggb3IgbWF4V2lkdGgsIGFuZCBlaXRoZXIgaGVpZ2h0IG9yIG1heEhlaWdodC5gKSxsb2NhbGU6bSgpLm9wdGlvbmFsKCkuZGVzY3JpYmUoIlVzZXIncyBsYW5ndWFnZSBhbmQgcmVnaW9uIHByZWZlcmVuY2UgaW4gQkNQIDQ3IGZvcm1hdC4iKSx0aW1lWm9uZTptKCkub3B0aW9uYWwoKS5kZXNjcmliZSgiVXNlcidzIHRpbWV6b25lIGluIElBTkEgZm9ybWF0LiIpLHVzZXJBZ2VudDptKCkub3B0aW9uYWwoKS5kZXNjcmliZSgiSG9zdCBhcHBsaWNhdGlvbiBpZGVudGlmaWVyLiIpLHBsYXRmb3JtOlUoW3AoIndlYiIpLHAoImRlc2t0b3AiKSxwKCJtb2JpbGUiKV0pLm9wdGlvbmFsKCkuZGVzY3JpYmUoIlBsYXRmb3JtIHR5cGUgZm9yIHJlc3BvbnNpdmUgZGVzaWduIGRlY2lzaW9ucy4iKSxkZXZpY2VDYXBhYmlsaXRpZXM6Zih7dG91Y2g6WigpLm9wdGlvbmFsKCkuZGVzY3JpYmUoIldoZXRoZXIgdGhlIGRldmljZSBzdXBwb3J0cyB0b3VjaCBpbnB1dC4iKSxob3ZlcjpaKCkub3B0aW9uYWwoKS5kZXNjcmliZSgiV2hldGhlciB0aGUgZGV2aWNlIHN1cHBvcnRzIGhvdmVyIGludGVyYWN0aW9ucy4iKX0pLm9wdGlvbmFsKCkuZGVzY3JpYmUoIkRldmljZSBpbnB1dCBjYXBhYmlsaXRpZXMuIiksc2FmZUFyZWFJbnNldHM6Zih7dG9wOlQoKS5kZXNjcmliZSgiVG9wIHNhZmUgYXJlYSBpbnNldCBpbiBwaXhlbHMuIikscmlnaHQ6VCgpLmRlc2NyaWJlKCJSaWdodCBzYWZlIGFyZWEgaW5zZXQgaW4gcGl4ZWxzLiIpLGJvdHRvbTpUKCkuZGVzY3JpYmUoIkJvdHRvbSBzYWZlIGFyZWEgaW5zZXQgaW4gcGl4ZWxzLiIpLGxlZnQ6VCgpLmRlc2NyaWJlKCJMZWZ0IHNhZmUgYXJlYSBpbnNldCBpbiBwaXhlbHMuIil9KS5vcHRpb25hbCgpLmRlc2NyaWJlKCJNb2JpbGUgc2FmZSBhcmVhIGJvdW5kYXJpZXMgaW4gcGl4ZWxzLiIpfSkucGFzc3Rocm91Z2goKSxTJD1mKHttZXRob2Q6cCgidWkvbm90aWZpY2F0aW9ucy9ob3N0LWNvbnRleHQtY2hhbmdlZCIpLHBhcmFtczpUbS5kZXNjcmliZSgiUGFydGlhbCBjb250ZXh0IHVwZGF0ZSBjb250YWluaW5nIG9ubHkgY2hhbmdlZCBmaWVsZHMuIil9KTtmKHttZXRob2Q6cCgidWkvdXBkYXRlLW1vZGVsLWNvbnRleHQiKSxwYXJhbXM6Zih7Y29udGVudDpJKFVuKS5vcHRpb25hbCgpLmRlc2NyaWJlKCJDb250ZXh0IGNvbnRlbnQgYmxvY2tzICh0ZXh0LCBpbWFnZSwgZXRjLikuIiksc3RydWN0dXJlZENvbnRlbnQ6UChtKCksRSgpLmRlc2NyaWJlKCJTdHJ1Y3R1cmVkIGNvbnRlbnQgZm9yIG1hY2hpbmUtcmVhZGFibGUgY29udGV4dCBkYXRhLiIpKS5vcHRpb25hbCgpLmRlc2NyaWJlKCJTdHJ1Y3R1cmVkIGNvbnRlbnQgZm9yIG1hY2hpbmUtcmVhZGFibGUgY29udGV4dCBkYXRhLiIpfSl9KTtmKHttZXRob2Q6cCgidWkvaW5pdGlhbGl6ZSIpLHBhcmFtczpmKHthcHBJbmZvOnRpLmRlc2NyaWJlKCJBcHAgaWRlbnRpZmljYXRpb24gKG5hbWUgYW5kIHZlcnNpb24pLiIpLGFwcENhcGFiaWxpdGllczpfJC5kZXNjcmliZSgiRmVhdHVyZXMgYW5kIGNhcGFiaWxpdGllcyB0aGlzIGFwcCBwcm92aWRlcy4iKSxwcm90b2NvbFZlcnNpb246bSgpLmRlc2NyaWJlKCJQcm90b2NvbCB2ZXJzaW9uIHRoaXMgYXBwIHN1cHBvcnRzLiIpfSl9KTt2YXIgdyQ9Zih7cHJvdG9jb2xWZXJzaW9uOm0oKS5kZXNjcmliZSgnTmVnb3RpYXRlZCBwcm90b2NvbCB2ZXJzaW9uIHN0cmluZyAoZS5nLiwgIjIwMjUtMTEtMjEiKS4nKSxob3N0SW5mbzp0aS5kZXNjcmliZSgiSG9zdCBhcHBsaWNhdGlvbiBpZGVudGlmaWNhdGlvbiBhbmQgdmVyc2lvbi4iKSxob3N0Q2FwYWJpbGl0aWVzOiQkLmRlc2NyaWJlKCJGZWF0dXJlcyBhbmQgY2FwYWJpbGl0aWVzIHByb3ZpZGVkIGJ5IHRoZSBob3N0LiIpLGhvc3RDb250ZXh0OlRtLmRlc2NyaWJlKCJSaWNoIGNvbnRleHQgYWJvdXQgdGhlIGhvc3QgZW52aXJvbm1lbnQuIil9KS5wYXNzdGhyb3VnaCgpLEkkPXt0YXJnZXQ6ImRyYWZ0LTIwMjAtMTIifTthc3luYyBmdW5jdGlvbiBxcyh0LG4pe2xldCByPXRbIn5zdGFuZGFyZCJdO2lmKHIuanNvblNjaGVtYSlyZXR1cm4gci5qc29uU2NoZW1hW25dKEkkKTtpZihyLnZlbmRvcj09PSJ6b2QiKXtsZXR7ejpvfT1hd2FpdCBBbSgoKT0+UHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKT0+cHYpLHZvaWQgMCxpbXBvcnQubWV0YS51cmwpO3JldHVybiBvLnRvSlNPTlNjaGVtYSh0LHtpbzpufSl9dGhyb3cgRXJyb3IoYFNjaGVtYSAodmVuZG9yOiAke3IudmVuZG9yfSkgZG9lcyBub3QgaW1wbGVtZW50IFN0YW5kYXJkIEpTT04gU2NoZW1hICh+c3RhbmRhcmQuanNvblNjaGVtYSkuIFVzZSBhIGxpYnJhcnkgdGhhdCBkb2VzICh6b2QgdjQsIEFya1R5cGUsIFZhbGlib3QpIG9yIHdyYXAgeW91ciBzY2hlbWEgYWNjb3JkaW5nbHkuYCl9YXN5bmMgZnVuY3Rpb24gRnModCxuLHI9IiIpe2xldCBvPWF3YWl0IHRbIn5zdGFuZGFyZCJdLnZhbGlkYXRlKG4pO2lmKG8uaXNzdWVzKXtsZXQgZT1vLmlzc3Vlcy5tYXAoaT0+e2xldCBhPWkucGF0aD8ubWFwKHM9PnR5cGVvZiBzPT0ib2JqZWN0Ij9zLmtleTpzKS5qb2luKCIuIik7cmV0dXJuIGE/YCR7YX06ICR7aS5tZXNzYWdlfWA6aS5tZXNzYWdlfSkuam9pbigiOyAiKTt0aHJvdyBFcnJvcihyK2UpfXJldHVybiBvLnZhbHVlfWNsYXNzIGFzIGV4dGVuZHMgbiR7X2FwcEluZm87X2NhcGFiaWxpdGllcztvcHRpb25zO19ob3N0Q2FwYWJpbGl0aWVzO19ob3N0SW5mbztfaG9zdENvbnRleHQ7X3JlZ2lzdGVyZWRUb29scz17fTtfaW5pdGlhbGl6ZWRTZW50PSExO19hc3NlcnRJbml0aWFsaXplZChuKXtpZih0aGlzLl9pbml0aWFsaXplZFNlbnQpcmV0dXJuO2xldCByPWBbZXh0LWFwcHNdIEFwcC4ke259KCkgY2FsbGVkIGJlZm9yZSBjb25uZWN0KCkgY29tcGxldGVkIHRoZSB1aS9pbml0aWFsaXplIGhhbmRzaGFrZS4gQXdhaXQgYXBwLmNvbm5lY3QoKSBiZWZvcmUgY2FsbGluZyB0aGlzIG1ldGhvZCwgb3IgbW92ZSBkYXRhIGxvYWRpbmcgdG8gYW4gb250b29scmVzdWx0IGhhbmRsZXIuYDtpZih0aGlzLm9wdGlvbnM/LnN0cmljdCl0aHJvdyBFcnJvcihyKTtjb25zb2xlLndhcm4oYCR7cn0uIFRoaXMgd2lsbCB0aHJvdyBpbiBhIGZ1dHVyZSByZWxlYXNlLmApfWV2ZW50U2NoZW1hcz17dG9vbGlucHV0Om0kLHRvb2xpbnB1dHBhcnRpYWw6cCQsdG9vbHJlc3VsdDprJCx0b29sY2FuY2VsbGVkOmYkLGhvc3Rjb250ZXh0Y2hhbmdlZDpTJH07c3RhdGljIE9ORV9TSE9UX0VWRU5UUz1uZXcgU2V0KFsidG9vbGlucHV0IiwidG9vbGlucHV0cGFydGlhbCIsInRvb2xyZXN1bHQiLCJ0b29sY2FuY2VsbGVkIl0pO19ldmVySGFkTGlzdGVuZXI9bmV3IFNldDtfYXNzZXJ0SGFuZGxlclRpbWluZyhuKXtpZighYXMuT05FX1NIT1RfRVZFTlRTLmhhcyhuKXx8dGhpcy5fZXZlckhhZExpc3RlbmVyLmhhcyhuKXx8KHRoaXMuX2V2ZXJIYWRMaXN0ZW5lci5hZGQobiksIXRoaXMuX2luaXRpYWxpemVkU2VudCkpcmV0dXJuO2xldCByPWBbZXh0LWFwcHNdICIke1N0cmluZyhuKX0iIGhhbmRsZXIgcmVnaXN0ZXJlZCBhZnRlciBjb25uZWN0KCkgY29tcGxldGVkIHRoZSB1aS9pbml0aWFsaXplIGhhbmRzaGFrZS4gVGhlIGhvc3QgbWF5IGhhdmUgYWxyZWFkeSBzZW50IHRoaXMgbm90aWZpY2F0aW9uLiBSZWdpc3RlciBoYW5kbGVycyBiZWZvcmUgY2FsbGluZyBhcHAuY29ubmVjdCgpLmA7aWYodGhpcy5vcHRpb25zPy5zdHJpY3QpdGhyb3cgRXJyb3Iocik7Y29uc29sZS53YXJuKHIpfXNldEV2ZW50SGFuZGxlcihuLHIpe3ImJnRoaXMuX2Fzc2VydEhhbmRsZXJUaW1pbmcobiksc3VwZXIuc2V0RXZlbnRIYW5kbGVyKG4scil9YWRkRXZlbnRMaXN0ZW5lcihuLHIpe3RoaXMuX2Fzc2VydEhhbmRsZXJUaW1pbmcobiksc3VwZXIuYWRkRXZlbnRMaXN0ZW5lcihuLHIpfW9uRXZlbnREaXNwYXRjaChuLHIpe249PT0iaG9zdGNvbnRleHRjaGFuZ2VkIiYmKHRoaXMuX2hvc3RDb250ZXh0PXsuLi50aGlzLl9ob3N0Q29udGV4dCwuLi5yfSl9Y29uc3RydWN0b3IobixyPXt9LG89e2F1dG9SZXNpemU6ITB9KXtzdXBlcihvKSx0aGlzLl9hcHBJbmZvPW4sdGhpcy5fY2FwYWJpbGl0aWVzPXIsdGhpcy5vcHRpb25zPW8sby5hbGxvd1Vuc2FmZUV2YWx8fFYoe2ppdGxlc3M6ITB9KSx0aGlzLnNldFJlcXVlc3RIYW5kbGVyKG5pLGU9Pihjb25zb2xlLmxvZygiUmVjZWl2ZWQgcGluZzoiLGUucGFyYW1zKSx7fSkpLHRoaXMuc2V0RXZlbnRIYW5kbGVyKCJob3N0Y29udGV4dGNoYW5nZWQiLHZvaWQgMCl9cmVnaXN0ZXJDYXBhYmlsaXRpZXMobil7aWYodGhpcy50cmFuc3BvcnQpdGhyb3cgRXJyb3IoIkNhbm5vdCByZWdpc3RlciBjYXBhYmlsaXRpZXMgYWZ0ZXIgdHJhbnNwb3J0IGlzIGVzdGFibGlzaGVkIik7dGhpcy5fY2FwYWJpbGl0aWVzPXQkKHRoaXMuX2NhcGFiaWxpdGllcyxuKX1yZWdpc3RlclRvb2wobixyLG8pe2lmKHRoaXMuX3JlZ2lzdGVyZWRUb29sc1tuXSl0aHJvdyBFcnJvcihgVG9vbCAke259IGlzIGFscmVhZHkgcmVnaXN0ZXJlZGApO2xldCBlPXRoaXMsaT0oKT0+e2UuX2luaXRpYWxpemVkU2VudCYmZS5fY2FwYWJpbGl0aWVzLnRvb2xzPy5saXN0Q2hhbmdlZCYmZS5zZW5kVG9vbExpc3RDaGFuZ2VkKCl9LGE9ci5pbnB1dFNjaGVtYSE9PXZvaWQgMCxzPXt0aXRsZTpyLnRpdGxlLGRlc2NyaXB0aW9uOnIuZGVzY3JpcHRpb24saW5wdXRTY2hlbWE6ci5pbnB1dFNjaGVtYSxvdXRwdXRTY2hlbWE6ci5vdXRwdXRTY2hlbWEsYW5ub3RhdGlvbnM6ci5hbm5vdGF0aW9ucyxfbWV0YTpyLl9tZXRhLGVuYWJsZWQ6ITAsZW5hYmxlKCl7dGhpcy5lbmFibGVkPSEwLGkoKX0sZGlzYWJsZSgpe3RoaXMuZW5hYmxlZD0hMSxpKCl9LHVwZGF0ZShjKXtPYmplY3QuYXNzaWduKHRoaXMsYyksaSgpfSxyZW1vdmUoKXtlLl9yZWdpc3RlcmVkVG9vbHNbbl09PT1zJiYoZGVsZXRlIGUuX3JlZ2lzdGVyZWRUb29sc1tuXSxpKCkpfSxoYW5kbGVyOmFzeW5jKGMsdSk9PntpZighcy5lbmFibGVkKXRocm93IEVycm9yKGBUb29sICR7bn0gaXMgZGlzYWJsZWRgKTtsZXQgbDtpZihhKXtsZXQgZz1zLmlucHV0U2NoZW1hLHY9Zz9hd2FpdCBGcyhnLGM/P3t9LGBJbnZhbGlkIGlucHV0IGZvciB0b29sICR7bn06IGApOmM/P3t9O2w9YXdhaXQgbyh2LHUpfWVsc2UgbD1hd2FpdCBvKHUpO3JldHVybiBzLm91dHB1dFNjaGVtYSYmIWwuaXNFcnJvciYmKGwuc3RydWN0dXJlZENvbnRlbnQ9YXdhaXQgRnMocy5vdXRwdXRTY2hlbWEsbC5zdHJ1Y3R1cmVkQ29udGVudCxgSW52YWxpZCBvdXRwdXQgZm9yIHRvb2wgJHtufTogYCkpLGx9fTtyZXR1cm4gdGhpcy5fcmVnaXN0ZXJlZFRvb2xzW25dPXMsIXRoaXMuX2NhcGFiaWxpdGllcy50b29scyYmIXRoaXMudHJhbnNwb3J0JiZ0aGlzLnJlZ2lzdGVyQ2FwYWJpbGl0aWVzKHt0b29sczp7bGlzdENoYW5nZWQ6ITB9fSksdGhpcy5lbnN1cmVUb29sSGFuZGxlcnNJbml0aWFsaXplZCgpLGkoKSxzfV90b29sSGFuZGxlcnNJbml0aWFsaXplZD0hMTtlbnN1cmVUb29sSGFuZGxlcnNJbml0aWFsaXplZCgpe3RoaXMuX3Rvb2xIYW5kbGVyc0luaXRpYWxpemVkfHwodGhpcy5fdG9vbEhhbmRsZXJzSW5pdGlhbGl6ZWQ9ITAsdGhpcy5vbmNhbGx0b29sPWFzeW5jKG4scik9PntsZXQgbz10aGlzLl9yZWdpc3RlcmVkVG9vbHNbbi5uYW1lXTtpZighbyl0aHJvdyBFcnJvcihgVG9vbCAke24ubmFtZX0gbm90IGZvdW5kYCk7cmV0dXJuIG8uaGFuZGxlcihuLmFyZ3VtZW50cyxyKX0sdGhpcy5vbmxpc3R0b29scz1hc3luYyhuLHIpPT4oe3Rvb2xzOmF3YWl0IFByb21pc2UuYWxsKE9iamVjdC5lbnRyaWVzKHRoaXMuX3JlZ2lzdGVyZWRUb29scykuZmlsdGVyKChbbyxlXSk9PmUuZW5hYmxlZCkubWFwKGFzeW5jKFtvLGVdKT0+e2xldCBpPXtuYW1lOm8sdGl0bGU6ZS50aXRsZSxkZXNjcmlwdGlvbjplLmRlc2NyaXB0aW9uLGlucHV0U2NoZW1hOmUuaW5wdXRTY2hlbWE/YXdhaXQgcXMoZS5pbnB1dFNjaGVtYSwiaW5wdXQiKTp7dHlwZToib2JqZWN0Iixwcm9wZXJ0aWVzOnt9fX07cmV0dXJuIGUub3V0cHV0U2NoZW1hJiYoaS5vdXRwdXRTY2hlbWE9YXdhaXQgcXMoZS5vdXRwdXRTY2hlbWEsIm91dHB1dCIpKSxlLmFubm90YXRpb25zJiYoaS5hbm5vdGF0aW9ucz1lLmFubm90YXRpb25zKSxlLl9tZXRhJiYoaS5fbWV0YT1lLl9tZXRhKSxpfSkpfSkpfWFzeW5jIHNlbmRUb29sTGlzdENoYW5nZWQobj17fSl7dGhpcy5fYXNzZXJ0SW5pdGlhbGl6ZWQoInNlbmRUb29sTGlzdENoYW5nZWQiKSxhd2FpdCB0aGlzLm5vdGlmaWNhdGlvbih7bWV0aG9kOiJub3RpZmljYXRpb25zL3Rvb2xzL2xpc3RfY2hhbmdlZCIscGFyYW1zOm59KX1nZXRIb3N0Q2FwYWJpbGl0aWVzKCl7cmV0dXJuIHRoaXMuX2hvc3RDYXBhYmlsaXRpZXN9Z2V0SG9zdFZlcnNpb24oKXtyZXR1cm4gdGhpcy5faG9zdEluZm99Z2V0SG9zdENvbnRleHQoKXtyZXR1cm4gdGhpcy5faG9zdENvbnRleHR9Z2V0IG9udG9vbGlucHV0KCl7cmV0dXJuIHRoaXMuZ2V0RXZlbnRIYW5kbGVyKCJ0b29saW5wdXQiKX1zZXQgb250b29saW5wdXQobil7dGhpcy5zZXRFdmVudEhhbmRsZXIoInRvb2xpbnB1dCIsbil9Z2V0IG9udG9vbGlucHV0cGFydGlhbCgpe3JldHVybiB0aGlzLmdldEV2ZW50SGFuZGxlcigidG9vbGlucHV0cGFydGlhbCIpfXNldCBvbnRvb2xpbnB1dHBhcnRpYWwobil7dGhpcy5zZXRFdmVudEhhbmRsZXIoInRvb2xpbnB1dHBhcnRpYWwiLG4pfWdldCBvbnRvb2xyZXN1bHQoKXtyZXR1cm4gdGhpcy5nZXRFdmVudEhhbmRsZXIoInRvb2xyZXN1bHQiKX1zZXQgb250b29scmVzdWx0KG4pe3RoaXMuc2V0RXZlbnRIYW5kbGVyKCJ0b29scmVzdWx0IixuKX1nZXQgb250b29sY2FuY2VsbGVkKCl7cmV0dXJuIHRoaXMuZ2V0RXZlbnRIYW5kbGVyKCJ0b29sY2FuY2VsbGVkIil9c2V0IG9udG9vbGNhbmNlbGxlZChuKXt0aGlzLnNldEV2ZW50SGFuZGxlcigidG9vbGNhbmNlbGxlZCIsbil9Z2V0IG9uaG9zdGNvbnRleHRjaGFuZ2VkKCl7cmV0dXJuIHRoaXMuZ2V0RXZlbnRIYW5kbGVyKCJob3N0Y29udGV4dGNoYW5nZWQiKX1zZXQgb25ob3N0Y29udGV4dGNoYW5nZWQobil7dGhpcy5zZXRFdmVudEhhbmRsZXIoImhvc3Rjb250ZXh0Y2hhbmdlZCIsbil9X29udGVhcmRvd247Z2V0IG9udGVhcmRvd24oKXtyZXR1cm4gdGhpcy5fb250ZWFyZG93bn1zZXQgb250ZWFyZG93bihuKXt0aGlzLndhcm5JZlJlcXVlc3RIYW5kbGVyUmVwbGFjZWQoIm9udGVhcmRvd24iLHRoaXMuX29udGVhcmRvd24sbiksdGhpcy5fb250ZWFyZG93bj1uLHRoaXMucmVwbGFjZVJlcXVlc3RIYW5kbGVyKGgkLChyLG8pPT57aWYoIXRoaXMuX29udGVhcmRvd24pdGhyb3cgRXJyb3IoIk5vIG9udGVhcmRvd24gaGFuZGxlciBzZXQiKTtyZXR1cm4gdGhpcy5fb250ZWFyZG93bihyLnBhcmFtcyxvKX0pfV9vbmNhbGx0b29sO2dldCBvbmNhbGx0b29sKCl7cmV0dXJuIHRoaXMuX29uY2FsbHRvb2x9c2V0IG9uY2FsbHRvb2wobil7dGhpcy53YXJuSWZSZXF1ZXN0SGFuZGxlclJlcGxhY2VkKCJvbmNhbGx0b29sIix0aGlzLl9vbmNhbGx0b29sLG4pLHRoaXMuX29uY2FsbHRvb2w9bix0aGlzLnJlcGxhY2VSZXF1ZXN0SGFuZGxlcih3bSwocixvKT0+e2lmKCF0aGlzLl9vbmNhbGx0b29sKXRocm93IEVycm9yKCJObyBvbmNhbGx0b29sIGhhbmRsZXIgc2V0Iik7cmV0dXJuIHRoaXMuX29uY2FsbHRvb2woci5wYXJhbXMsbyl9KX1fb25saXN0dG9vbHM7Z2V0IG9ubGlzdHRvb2xzKCl7cmV0dXJuIHRoaXMuX29ubGlzdHRvb2xzfXNldCBvbmxpc3R0b29scyhuKXt0aGlzLndhcm5JZlJlcXVlc3RIYW5kbGVyUmVwbGFjZWQoIm9ubGlzdHRvb2xzIix0aGlzLl9vbmxpc3R0b29scyxuKSx0aGlzLl9vbmxpc3R0b29scz1uLHRoaXMucmVwbGFjZVJlcXVlc3RIYW5kbGVyKFNtLChyLG8pPT57aWYoIXRoaXMuX29ubGlzdHRvb2xzKXRocm93IEVycm9yKCJObyBvbmxpc3R0b29scyBoYW5kbGVyIHNldCIpO3JldHVybiB0aGlzLl9vbmxpc3R0b29scyhyLnBhcmFtcyxvKX0pfWFzc2VydENhcGFiaWxpdHlGb3JNZXRob2Qobil7c3dpdGNoKG4pe2Nhc2Uic2FtcGxpbmcvY3JlYXRlTWVzc2FnZSI6aWYoIXRoaXMuX2hvc3RDYXBhYmlsaXRpZXM/LnNhbXBsaW5nKXRocm93IEVycm9yKGBIb3N0IGRvZXMgbm90IHN1cHBvcnQgc2FtcGxpbmcgKHJlcXVpcmVkIGZvciAke259KWApO2JyZWFrfX1hc3NlcnRSZXF1ZXN0SGFuZGxlckNhcGFiaWxpdHkobil7c3dpdGNoKG4pe2Nhc2UidG9vbHMvY2FsbCI6Y2FzZSJ0b29scy9saXN0IjppZighdGhpcy5fY2FwYWJpbGl0aWVzLnRvb2xzKXRocm93IEVycm9yKGBDbGllbnQgZG9lcyBub3Qgc3VwcG9ydCB0b29sIGNhcGFiaWxpdHkgKHJlcXVpcmVkIGZvciAke259KWApO3JldHVybjtjYXNlInBpbmciOmNhc2UidWkvcmVzb3VyY2UtdGVhcmRvd24iOnJldHVybjtkZWZhdWx0OnRocm93IEVycm9yKGBObyBoYW5kbGVyIGZvciBtZXRob2QgJHtufSByZWdpc3RlcmVkYCl9fWFzc2VydE5vdGlmaWNhdGlvbkNhcGFiaWxpdHkobil7fWFzc2VydFRhc2tDYXBhYmlsaXR5KG4pe3Rocm93IEVycm9yKCJUYXNrcyBhcmUgbm90IHN1cHBvcnRlZCBpbiBNQ1AgQXBwcyIpfWFzc2VydFRhc2tIYW5kbGVyQ2FwYWJpbGl0eShuKXt0aHJvdyBFcnJvcigiVGFzayBoYW5kbGVycyBhcmUgbm90IHN1cHBvcnRlZCBpbiBNQ1AgQXBwcyIpfWFzeW5jIGNhbGxTZXJ2ZXJUb29sKG4scil7aWYodGhpcy5fYXNzZXJ0SW5pdGlhbGl6ZWQoImNhbGxTZXJ2ZXJUb29sIiksdHlwZW9mIG49PSJzdHJpbmciKXRocm93IEVycm9yKGBjYWxsU2VydmVyVG9vbCgpIGV4cGVjdHMgYW4gb2JqZWN0IGFzIGl0cyBmaXJzdCBhcmd1bWVudCwgYnV0IHJlY2VpdmVkIGEgc3RyaW5nICgiJHtufSIpLiBEaWQgeW91IG1lYW46IGNhbGxTZXJ2ZXJUb29sKHsgbmFtZTogIiR7bn0iLCBhcmd1bWVudHM6IHsgLi4uIH0gfSk/YCk7cmV0dXJuIGF3YWl0IHRoaXMucmVxdWVzdCh7bWV0aG9kOiJ0b29scy9jYWxsIixwYXJhbXM6bn0scmkse29ucHJvZ3Jlc3M6KCk9Pnt9LHJlc2V0VGltZW91dE9uUHJvZ3Jlc3M6ITAsLi4ucn0pfWFzeW5jIHJlYWRTZXJ2ZXJSZXNvdXJjZShuLHIpe3JldHVybiB0aGlzLl9hc3NlcnRJbml0aWFsaXplZCgicmVhZFNlcnZlclJlc291cmNlIiksYXdhaXQgdGhpcy5yZXF1ZXN0KHttZXRob2Q6InJlc291cmNlcy9yZWFkIixwYXJhbXM6bn0sYm0scil9YXN5bmMgbGlzdFNlcnZlclJlc291cmNlcyhuLHIpe3JldHVybiB0aGlzLl9hc3NlcnRJbml0aWFsaXplZCgibGlzdFNlcnZlclJlc291cmNlcyIpLGF3YWl0IHRoaXMucmVxdWVzdCh7bWV0aG9kOiJyZXNvdXJjZXMvbGlzdCIscGFyYW1zOm59LF9tLHIpfWFzeW5jIGNyZWF0ZVNhbXBsaW5nTWVzc2FnZShuLHIpe3RoaXMuX2Fzc2VydEluaXRpYWxpemVkKCJjcmVhdGVTYW1wbGluZ01lc3NhZ2UiKTtsZXQgbz1uLnRvb2xzP3htOnptO3JldHVybiBhd2FpdCB0aGlzLnJlcXVlc3Qoe21ldGhvZDoic2FtcGxpbmcvY3JlYXRlTWVzc2FnZSIscGFyYW1zOm59LG8scil9c2VuZE1lc3NhZ2UobixyKXtyZXR1cm4gdGhpcy5fYXNzZXJ0SW5pdGlhbGl6ZWQoInNlbmRNZXNzYWdlIiksdGhpcy5yZXF1ZXN0KHttZXRob2Q6InVpL21lc3NhZ2UiLHBhcmFtczpufSxkJCxyKX1zZW5kTG9nKG4pe3JldHVybiB0aGlzLm5vdGlmaWNhdGlvbih7bWV0aG9kOiJub3RpZmljYXRpb25zL21lc3NhZ2UiLHBhcmFtczpufSl9dXBkYXRlTW9kZWxDb250ZXh0KG4scil7cmV0dXJuIHRoaXMuX2Fzc2VydEluaXRpYWxpemVkKCJ1cGRhdGVNb2RlbENvbnRleHQiKSx0aGlzLnJlcXVlc3Qoe21ldGhvZDoidWkvdXBkYXRlLW1vZGVsLWNvbnRleHQiLHBhcmFtczpufSxxYSxyKX1vcGVuTGluayhuLHIpe3JldHVybiB0aGlzLl9hc3NlcnRJbml0aWFsaXplZCgib3BlbkxpbmsiKSx0aGlzLnJlcXVlc3Qoe21ldGhvZDoidWkvb3Blbi1saW5rIixwYXJhbXM6bn0sdSQscil9c2VuZE9wZW5MaW5rPXRoaXMub3Blbkxpbms7ZG93bmxvYWRGaWxlKG4scil7cmV0dXJuIHRoaXMuX2Fzc2VydEluaXRpYWxpemVkKCJkb3dubG9hZEZpbGUiKSx0aGlzLnJlcXVlc3Qoe21ldGhvZDoidWkvZG93bmxvYWQtZmlsZSIscGFyYW1zOm59LGwkLHIpfXJlcXVlc3RUZWFyZG93bihuPXt9KXtyZXR1cm4gdGhpcy5ub3RpZmljYXRpb24oe21ldGhvZDoidWkvbm90aWZpY2F0aW9ucy9yZXF1ZXN0LXRlYXJkb3duIixwYXJhbXM6bn0pfXJlcXVlc3REaXNwbGF5TW9kZShuLHIpe3JldHVybiB0aGlzLl9hc3NlcnRJbml0aWFsaXplZCgicmVxdWVzdERpc3BsYXlNb2RlIiksdGhpcy5yZXF1ZXN0KHttZXRob2Q6InVpL3JlcXVlc3QtZGlzcGxheS1tb2RlIixwYXJhbXM6bn0sYiQscil9c2VuZFNpemVDaGFuZ2VkKG4pe3JldHVybiB0aGlzLm5vdGlmaWNhdGlvbih7bWV0aG9kOiJ1aS9ub3RpZmljYXRpb25zL3NpemUtY2hhbmdlZCIscGFyYW1zOm59KX1zZXR1cFNpemVDaGFuZ2VkTm90aWZpY2F0aW9ucygpe2xldCBuPSExLHI9MCxvPTAsZT0oKT0+e258fChuPSEwLHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKT0+e249ITE7bGV0IGE9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LHM9YS5zdHlsZS5oZWlnaHQ7YS5zdHlsZS5oZWlnaHQ9Im1heC1jb250ZW50IjtsZXQgYz1NYXRoLmNlaWwoYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQpO2Euc3R5bGUuaGVpZ2h0PXM7bGV0IHU9TWF0aC5jZWlsKHdpbmRvdy5pbm5lcldpZHRoKTsodSE9PXJ8fGMhPT1vKSYmKHI9dSxvPWMsdGhpcy5zZW5kU2l6ZUNoYW5nZWQoe3dpZHRoOnUsaGVpZ2h0OmN9KSl9KSl9O2UoKTtsZXQgaT1uZXcgUmVzaXplT2JzZXJ2ZXIoZSk7cmV0dXJuIGkub2JzZXJ2ZShkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpLGkub2JzZXJ2ZShkb2N1bWVudC5ib2R5KSwoKT0+aS5kaXNjb25uZWN0KCl9YXN5bmMgY29ubmVjdChuPW5ldyBvJCh3aW5kb3cucGFyZW50LHdpbmRvdy5wYXJlbnQpLHIpe2lmKHRoaXMudHJhbnNwb3J0KXRocm93IEVycm9yKCJBcHAgaXMgYWxyZWFkeSBjb25uZWN0ZWQuIENhbGwgY2xvc2UoKSBiZWZvcmUgY29ubmVjdGluZyBhZ2Fpbi4iKTt0aGlzLl9pbml0aWFsaXplZFNlbnQ9ITEsYXdhaXQgc3VwZXIuY29ubmVjdChuKTt0cnl7bGV0IG89YXdhaXQgdGhpcy5yZXF1ZXN0KHttZXRob2Q6InVpL2luaXRpYWxpemUiLHBhcmFtczp7YXBwQ2FwYWJpbGl0aWVzOnRoaXMuX2NhcGFiaWxpdGllcyxhcHBJbmZvOnRoaXMuX2FwcEluZm8scHJvdG9jb2xWZXJzaW9uOnIkfX0sdyQscik7aWYobz09PXZvaWQgMCl0aHJvdyBFcnJvcihgU2VydmVyIHNlbnQgaW52YWxpZCBpbml0aWFsaXplIHJlc3VsdDogJHtvfWApO3RoaXMuX2hvc3RDYXBhYmlsaXRpZXM9by5ob3N0Q2FwYWJpbGl0aWVzLHRoaXMuX2hvc3RJbmZvPW8uaG9zdEluZm8sdGhpcy5faG9zdENvbnRleHQ9by5ob3N0Q29udGV4dCxhd2FpdCB0aGlzLm5vdGlmaWNhdGlvbih7bWV0aG9kOiJ1aS9ub3RpZmljYXRpb25zL2luaXRpYWxpemVkIn0pLHRoaXMuX2luaXRpYWxpemVkU2VudD0hMCx0aGlzLm9wdGlvbnM/LmF1dG9SZXNpemUmJnRoaXMuc2V0dXBTaXplQ2hhbmdlZE5vdGlmaWNhdGlvbnMoKX1jYXRjaChvKXt0aHJvdyB0aGlzLmNsb3NlKCksb319fWNvbnN0IGptPXtlbjp7bG9hZGluZzoiTG9hZGluZ+KApiIsb3BlbmluZzoiT3BlbmluZyBjaGVja291dOKApiIscGF5aW5nOiJQYXlpbmcgdmlhIHttZXRob2R94oCmIixlbXB0eUNhdGFsb2c6Ik5vdGhpbmcgaW4gdGhlIGNhdGFsb2cuIixub09yZGVyczoiTm8gb3JkZXJzIHlldCDigJQgcGljayBzb21ldGhpbmcgZnJvbSB0aGUgY2F0YWxvZyBmaXJzdC4iLHByb2R1Y3RDb3VudDoie2NvdW50fSBwcm9kdWN0cyIsb3JkZXJlZEZhbGxiYWNrOiJPcmRlcmVkIHtwcm9kdWN0fSIsaGFuZE9mZkFzazoiQnV5IHtwcm9kdWN0fSB3aXRoIG15IEN1cmxlc3Mgd2FsbGV0IGNvbm5lY3RvciIsYmFjazoi4oaQIENob29zZSBhbm90aGVyIHdheSIsb3JkZXJBZ2FpbjoiT3JkZXIgYW5vdGhlciIsdmlld09yZGVyczoiVmlldyBteSBvcmRlcnMg4oaSIixvcmRlcmVkOiJPcmRlcmVkIixub3RDb21wbGV0ZWQ6Ik5vdCBjb21wbGV0ZWQiLG9uZVN0ZXBMZWZ0OiJPbmUgc3RlcCBsZWZ0IixzaWduSW46IlNpZ24gaW4gdG8gQ3VybGVzcyIsc2lnbkluR286IlNpZ24gaW4g4oaXIixzaWduSW5XYWl0OiJUaGlzIGNhcmQgcmVjb25uZWN0cyBvbiBpdHMgb3duIG9uY2UgeW91IGFyZSBpbi4gQmluZGluZyBhIGNhcmQgaGFwcGVucyB0aGVyZSB0b28uIixzaWduZWRJblBheWluZzoiU2lnbmVkIGluIGFzIHtlbWFpbH0g4oCUIHBheWluZ+KApiIsc2lnbkluRXhwaXJlZDoiVGhhdCBzaWduLWluIHRpbWVkIG91dCDigJQgc3RhcnQgaXQgYWdhaW4gYWJvdmUuIixzaWduSW5OZXZlclN0YXJ0ZWQ6Ik5vIHNpZ24taW4gc3RhcnRlZCB5ZXQg4oCUIHVzZSB0aGUgbGluayBhYm92ZS4iLG9yZGVyc0ZhaWxlZDoiQ291bGQgbm90IGxvYWQgeW91ciBvcmRlcnMuIix3YWxsZXRTYWlkTm86IldhbGxldCBzYWlkIG5vIixvcGVuV2FsbGV0OiJPcGVuIHdhbGxldCDihpciLGdvUGF5OiJHbyBwYXkg4oaXIixwYXlXYWl0OiJBcHByb3ZlIGl0IGluIHlvdXIgYnJvd3NlciBhbmQgdGhpcyBjYXJkIHR1cm5zIGludG8gYSByZWNlaXB0IG9uIGl0cyBvd24uIixwYXlUaW1lb3V0OiJObyBwYXltZW50IHJlY2VpdmVkIHlldC4gT25jZSB5b3UgaGF2ZSBwYWlkLCBjaGVjayDigJxteSBvcmRlcnPigJ0uIixoYW5kZWRPdmVyOiJIYW5kZWQgdG8geW91ciBhc3Npc3RhbnQiLGhhbmRlZE92ZXJCb2R5OiJUaGlzIG9uZSBpcyBwYWlkIGZyb20gdGhlIEN1cmxlc3Mgd2FsbGV0IGNvbm5lY3RvciB5b3UgaW5zdGFsbGVkIOKAlCB0aGUgY3JlZGVudGlhbCBsaXZlcyB0aGVyZSwgYW5kIHRoaXMgY2FyZCBjYW5ub3QgcmVhY2ggaXQuIixoYW5kZWRPdmVyV2FpdDoiWW91ciBhc3Npc3RhbnQgd2lsbCBvcGVuIHRoZSBjaGVja291dCwgZ2V0IHlvdSBzaWduZWQgaW4gaWYgbmVlZGVkLCBhbmQgY29uZmlybSB0aGUgYW1vdW50IHdpdGggeW91IGJlZm9yZSBhbnl0aGluZyBpcyBjaGFyZ2VkLiIscmVmdW5kOiJSZXF1ZXN0IGEgcmVmdW5kIixyZWZ1bmRpbmc6IldvcmtpbmfigKYiLHJlZnVuZEZhaWxlZDoiVGhlIHJlZnVuZCByZXF1ZXN0IGZhaWxlZCIsb25DaGFpblR4OiJPbi1jaGFpbiB0eDoiLHBhaWRCeToiUGFpZCBieToiLGNhbm5vdE9wZW46IkNvdWxkIG5vdCBvcGVuIHRoZSBjaGVja291dCIsY2FyZEZhaWxlZDoiVGhlIGNhcmQgY291bGQgbm90IGxvYWQiLG5vdGhpbmdUb1Nob3c6Ik5vdGhpbmcgdG8gc2hvdyBoZXJlIixub3RoaW5nVG9TaG93Qm9keToiQXNrIGZvciBhIHByb2R1Y3QgYnkgbmFtZSwgb3IgZm9yIHRoZSBjYXRhbG9nLiIscmVmcmVzaDoiUmVmcmVzaCIsb3JkZXJzVGl0bGU6Ik15IG9yZGVycyJ9LHpoOntsb2FkaW5nOiLliqDovb3kuK3igKYiLG9wZW5pbmc6Iuato+WcqOW8gOe7k+i0puKApiIscGF5aW5nOiLmraPlnKjpgJrov4cge21ldGhvZH0g57uT566X4oCmIixlbXB0eUNhdGFsb2c6IuebruW9lemHjOayoeacieWVhuWTgeOAgiIsbm9PcmRlcnM6Iui/mOayoeacieiuouWNlSDigJTigJQg5YWI5LuO55uu5b2V6YeM5oyR5LiA5Lu244CCIixwcm9kdWN0Q291bnQ6Intjb3VudH0g5Lu25ZWG5ZOBIixvcmRlcmVkRmFsbGJhY2s6IuW3suS4i+WNlSB7cHJvZHVjdH0iLGhhbmRPZmZBc2s6IueUqOaIkeeahCBDdXJsZXNzIOmSseWMhei/nuaOpeWZqOS7mOi/meeslCh7cHJvZHVjdH0pIixiYWNrOiLihpAg5o2i5Liq5pSv5LuY5pa55byPIixvcmRlckFnYWluOiLlho3orqLkuIDmrKEiLHZpZXdPcmRlcnM6Iuafpeeci+aIkeeahOiuouWNlSDihpIiLG9yZGVyZWQ6IuW3suS4i+WNlSIsbm90Q29tcGxldGVkOiLmnKrlrozmiJAiLG9uZVN0ZXBMZWZ0OiLov5jlt67kuIDmraUiLHNpZ25Jbjoi55m75b2VIEN1cmxlc3Mg6ZKx5YyFIixzaWduSW5Hbzoi5Y6755m75b2VIOKGlyIsc2lnbkluV2FpdDoi55m75b2V5a6M6L+Z5byg5Y2h5Lya6Ieq5bex5o6l5LiK44CC57uR5Y2h5Lmf5Zyo5ZCM5LiA5Liq6aG16Z2i6YeM44CCIixzaWduZWRJblBheWluZzoi5bey55m75b2VIHtlbWFpbH0g4oCU4oCUIOato+WcqOS7mOasvuKApiIsc2lnbkluRXhwaXJlZDoi55m75b2V6LaF5pe25LqGLOeCueS4iumdoumHjeaWsOadpeS4gOasoeOAgiIsc2lnbkluTmV2ZXJTdGFydGVkOiLov5jmsqHlvIDlp4vnmbvlvZUg4oCU4oCUIOeCueS4iumdoumCo+S4qumTvuaOpeOAgiIsb3JkZXJzRmFpbGVkOiLorqLljZXliqDovb3lpLHotKXjgIIiLHdhbGxldFNhaWRObzoi6ZKx5YyF5pyq5pS+6KGMIixvcGVuV2FsbGV0OiLmiZPlvIDpkrHljIUg4oaXIixnb1BheToi5Y675LuY5qy+IOKGlyIscGF5V2FpdDoi5Zyo5rWP6KeI5Zmo6YeM5om55YeG5ZCOLOi/meW8oOWNoeS8muiHquW3seWPmOaIkOaUtuaNruOAgiIscGF5VGltZW91dDon6L+Y5rKh5pS25Yiw5LuY5qy+44CC5LuY5a6M54K55LiA5LiLIuaIkeeahOiuouWNlSLnnIvnnIvjgIInLGhhbmRlZE92ZXI6IuS6pOe7meWKqeaJi+e7p+e7rSIsaGFuZGVkT3ZlckJvZHk6Iui/meeslOimgeeUqOS9oOiHquW3seijheeahCBDdXJsZXNzIOmSseWMhei/nuaOpeWZqOS7mCDigJTigJQg5Yet5o2u5Zyo6YKj5Liq6L+e5o6l5Zmo6YeMLOi/meW8oOWNoeWkn+S4jeWIsOWug+OAgiIsaGFuZGVkT3ZlcldhaXQ6IuWKqeaJi+S8muWFiOiuqeS9oOeZu+W9lemSseWMhSzlho3pk7jkuIDlvKDlh63mja7lrozmiJDku5jmrL4s5omj5qy+5YmN5Lya6Lef5L2g56Gu6K6k6YeR6aKd44CCIixyZWZ1bmQ6IueUs+ivt+mAgOasviIscmVmdW5kaW5nOiLlpITnkIbkuK3igKYiLHJlZnVuZEZhaWxlZDoi6YCA5qy+55Sz6K+35aSx6LSlIixvbkNoYWluVHg6IumTvuS4iuS6pOaYkzoiLHBhaWRCeToi5LuY5qy+5pa55byPOiIsY2Fubm90T3Blbjoi5omT5LiN5byA57uT6LSmIixjYXJkRmFpbGVkOiLljaHniYfliqDovb3lpLHotKUiLG5vdGhpbmdUb1Nob3c6Iui/memHjOayoeacieWPr+aYvuekuueahOWGheWuuSIsbm90aGluZ1RvU2hvd0JvZHk6IuivtOWHuuWVhuWTgeWQjeWtlyzmiJbogIXorqnmiJHmiZPlvIDnm67lvZXjgIIiLHJlZnJlc2g6IuWIt+aWsCIsb3JkZXJzVGl0bGU6IuaIkeeahOiuouWNlSJ9fSxEPXQ9PmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHQpLGs9dD0+U3RyaW5nKHQ/PyIiKS5yZXBsYWNlKC9bJjw+IiddL2csbj0+KHsiJiI6IiZhbXA7IiwiPCI6IiZsdDsiLCI+IjoiJmd0OyIsJyInOiImcXVvdDsiLCInIjoiJiMzOTsifSlbbl0pLFBuPSh0LG4pPT50LnJlcGxhY2UoL1x7KFx3KylcfS9nLChyLG8pPT5TdHJpbmcobltvXT8/cikpLG9lPW5ldyBhcyh7bmFtZToic2lub2NhcmUtY2hlY2tvdXQiLHZlcnNpb246IjIuMC4wIn0pO2xldCB6PWptLmVuLEc9bnVsbCx6dD1udWxsLEZlPVtdO2NvbnN0IE9tPXQ9Pntjb25zdCBuPXQ/Lmxhbmc7KG49PT0iZW4ifHxuPT09InpoIikmJih6PWptW25dKX0seiQ9KHQsbixyKT0+YGcke3R9ciR7bn1hJHtyfWAsVW09dD0+e2NvbnN0IG49L15nKFxkKylyKFxkKylhKFxkKykkLy5leGVjKHQpO2lmKCFufHwhRylyZXR1cm47Y29uc3Qgcj1HLmdyb3Vwc1tOdW1iZXIoblsxXSldPy5yb3dzW051bWJlcihuWzJdKV0sbz1yPy5hY3Rpb25zW051bWJlcihuWzNdKV07aWYoIXJ8fCFvKXJldHVybjtjb25zdCBlPXIuYWN0aW9ucy5sZW5ndGg+MT9gJHtyLnRpdGxlfSDCtyAke28ubGFiZWx9YDpyLnRpdGxlO3JldHVybnsuLi5vLHJvdzpyLnRpdGxlLGRpc3BsYXk6ZX19LCR0PSh0LG4pPT57Y29uc3Qgcj0oKT0+e29lLm9wZW5MaW5rKHt1cmw6bn0pLmNhdGNoKCgpPT53aW5kb3cub3BlbihuLCJfYmxhbmsiKSl9LG89ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodCk7bz8uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHIpLG8/LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLGU9PnsoZS5rZXk9PT0iRW50ZXIifHxlLmtleT09PSIgIikmJnIoKX0pfSxqZT0oKT0+YDxidXR0b24gY2xhc3M9ImJhY2siIGlkPSJiYWNrIj4ke2soei5iYWNrKX08L2J1dHRvbj5gLE9lPSgpPT57RCgiYmFjayIpPy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsKCk9PntpZihHKXJldHVybiBzcyhHKTtpZih6dClyZXR1cm4gUG0oenQpfSl9LHgkPSgpPT5gPGJ1dHRvbiBjbGFzcz0iZ28iIGlkPSJvcmRlcnMiPiR7ayh6LnZpZXdPcmRlcnMpfTwvYnV0dG9uPmAsVCQ9KCk9PntEKCJvcmRlcnMiKT8uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCgpPT57RCgiY29udGVudCIpLmlubmVySFRNTD1gPGRpdiBjbGFzcz0ic3BpbiI+JHtrKHoubG9hZGluZyl9PC9kaXY+YCxObSgpfSl9LHh0PXQ9PntEKCJjb250ZW50IikuaW5uZXJIVE1MPWA8ZGl2IGNsYXNzPSJyZXN1bHQiPjxzcGFuIGNsYXNzPSJiYWRnZSBlcnIiPiR7ayh6LmNhcmRGYWlsZWQpfTwvc3Bhbj48ZGl2IGNsYXNzPSJsaW5lIj4ke2sodCl9PC9kaXY+PC9kaXY+YH07bGV0IG1pPW51bGwsb2k9ITE7Y29uc3QgaWk9dD0+e21pPXQ7Y29uc3Qgbj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicmVmcmVzaCIpO24mJihuLmhpZGRlbj0hdCxuLnRpdGxlPXoucmVmcmVzaCxuLnNldEF0dHJpYnV0ZSgiYXJpYS1sYWJlbCIsei5yZWZyZXNoKSl9LGokPSgpPT57Y29uc3QgdD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicmVmcmVzaCIpO3QmJnQuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCgpPT57aWYob2l8fCFtaSlyZXR1cm47b2k9ITAsdC5kaXNhYmxlZD0hMCx0LmNsYXNzTGlzdC5hZGQoImJ1c3kiKTtjb25zdCBuPSgpPT57b2k9ITE7Y29uc3Qgcj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicmVmcmVzaCIpO3ImJihyLmRpc2FibGVkPSExLHIuY2xhc3NMaXN0LnJlbW92ZSgiYnVzeSIpKX07bWkoKS50aGVuKG4sbil9KX0sUG09dD0+e3p0PXQsRz1udWxsLGlpKG51bGwpO2NvbnN0IG49dC5wcm9kdWN0cz8/W107RCgibWVyY2hhbnQiKS50ZXh0Q29udGVudD1Qbih6LnByb2R1Y3RDb3VudCx7Y291bnQ6bi5sZW5ndGh9KSxEKCJjb250ZW50IikuaW5uZXJIVE1MPWA8ZGl2IGNsYXNzPSJwZ3JpZCI+JHtuLm1hcCgocixvKT0+YDxkaXYgY2xhc3M9InBjZWxsIj4KICAgICAgJHtyLmltYWdlVXJsP2A8aW1nIGNsYXNzPSJwaW1nIiBzcmM9IiR7ayhyLmltYWdlVXJsKX0iIGFsdD0iIiBsb2FkaW5nPSJsYXp5Ij5gOmA8ZGl2IGNsYXNzPSJwaW1nIG5vbmUiPiR7ayhyLmNhdGVnb3J5Pz8iIil9PC9kaXY+YH0KICAgICAgPGRpdiBjbGFzcz0icG5hbWUiPiR7ayhyLm5hbWUpfTwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJwbWV0YSI+JHtyLnByaWNlRGlzcGxheT9rKHIucHJpY2VEaXNwbGF5KToiIn08L2Rpdj4KICAgICAgPGJ1dHRvbiBjbGFzcz0iYWN0IHBidXkiIGlkPSJwJHtvfSI+QnV5PC9idXR0b24+CiAgICA8L2Rpdj5gKS5qb2luKCIiKXx8YDxkaXYgY2xhc3M9InItc3ViIj4ke2soei5lbXB0eUNhdGFsb2cpfTwvZGl2PmB9PC9kaXY+YCxuLmZvckVhY2goKHIsbyk9PkQoYHAke299YCk/LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwoKT0+e0QoImNvbnRlbnQiKS5pbm5lckhUTUw9YDxkaXYgY2xhc3M9InNwaW4iPiR7ayh6Lm9wZW5pbmcpfTwvZGl2PmAsb2UuY2FsbFNlcnZlclRvb2woe25hbWU6InN0YXJ0X3Npbm9jYXJlX2NoZWNrb3V0Iixhcmd1bWVudHM6e3NrdTpyLnNrdX19KS50aGVuKGU9PntsZXQgaT1lPy5zdHJ1Y3R1cmVkQ29udGVudDtpZighaSl0cnl7aT1KU09OLnBhcnNlKGU/LmNvbnRlbnQ/LlswXT8udGV4dD8/Im51bGwiKX1jYXRjaHt9aWYoaSl7YWU9ITEsdXMoaSwhMCk7cmV0dXJufUpzKGU/LmNvbnRlbnQ/LlswXT8udGV4dD8/Im5vIGFuc3dlciBmcm9tIHRoZSBzdG9yZWZyb250Iil9KS5jYXRjaChlPT5KcyhTdHJpbmcoZT8ubWVzc2FnZT8/ZSkpKX0pKX0sSnM9dD0+e0QoImNvbnRlbnQiKS5pbm5lckhUTUw9YDxkaXYgY2xhc3M9InJlc3VsdCI+CiAgICA8c3BhbiBjbGFzcz0iYmFkZ2UgZXJyIj4ke2soei5jYW5ub3RPcGVuKX08L3NwYW4+CiAgICA8ZGl2IGNsYXNzPSJsaW5lIj4ke2sodCl9PC9kaXY+CiAgICAke2plKCl9PC9kaXY+YCxPZSgpfSxPJD0odCxuLHIpPT57Y29uc3Qgbz1yLmFjdGlvbnMubWFwKChlLGkpPT5gPGJ1dHRvbiBkYXRhLWFjdD0iJHt6JCh0LG4saSl9IiBjbGFzcz0iJHtlLmV4dD8iYWN0IGV4dCI6ImFjdCJ9Ij4ke2soZS5sYWJlbCl9JHtlLmV4dD8iIOKGlyI6IiDihpIifTwvYnV0dG9uPmApLmpvaW4oIiIpO3JldHVybmA8ZGl2IGNsYXNzPSJyb3ciPgogICAgICA8ZGl2IGNsYXNzPSJyb3ctbWFpbiI+PHNwYW4gY2xhc3M9InItdGl0bGUiPiR7ayhyLnRpdGxlKX08L3NwYW4+PHNwYW4gY2xhc3M9InItc3ViIj4ke2soci5zdWIpfTwvc3Bhbj48L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0icm93LWFjdHMiPiR7b308L2Rpdj4KICAgIDwvZGl2PmB9LHNzPXQ9PntpaShudWxsKSxHPXQsenQ9enQ/P251bGwsRCgibWVyY2hhbnQiKS50ZXh0Q29udGVudD10LnByb2R1Y3Quc2t1O2NvbnN0IG49KHQuZ3JvdXBzPz9bXSkubWFwKChvLGUpPT5gPGRpdiBjbGFzcz0iZ3JvdXAtbGFiZWwiPiR7ayhvLmxhYmVsKX08L2Rpdj48ZGl2IGNsYXNzPSJyb3dzIj4ke28ucm93cy5tYXAoKGksYSk9Pk8kKGUsYSxpKSkuam9pbigiIil9PC9kaXY+YCkuam9pbigiIikscj10LnByb2R1Y3QuaW1hZ2VVcmw/YDxpbWcgY2xhc3M9Imhlcm8iIHNyYz0iJHtrKHQucHJvZHVjdC5pbWFnZVVybCl9IiBhbHQ9IiR7ayh0LnByb2R1Y3QubmFtZSl9IiBvbmVycm9yPSJ0aGlzLnJlbW92ZSgpIj5gOiIiO0QoImNvbnRlbnQiKS5pbm5lckhUTUw9YAogICAgJHtyfQogICAgPGRpdiBjbGFzcz0icHJpY2UiPiR7ayh0LnByb2R1Y3QucHJpY2VEaXNwbGF5Pz8iIil9PC9kaXY+CiAgICA8ZGl2IGNsYXNzPSJzdWIiPiR7ayh0LnByb2R1Y3QubmFtZSl9JHt0LnF1YW50aXR5PjE/YCDDlyAke3QucXVhbnRpdHl9YDoiIn08L2Rpdj4KICAgICR7bn1gO2Zvcihjb25zdCBvIG9mIEFycmF5LmZyb20oRCgiY29udGVudCIpLnF1ZXJ5U2VsZWN0b3JBbGwoImJ1dHRvbltkYXRhLWFjdF0iKSkpby5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsKCk9PkRtKG8uZGF0YXNldC5hY3QpKX0sTm09KHQ9ITEpPT5vZS5jYWxsU2VydmVyVG9vbCh7bmFtZToibGlzdF9teV9vcmRlcnMiLGFyZ3VtZW50czp7fX0pLnRoZW4obj0+e2NvbnN0IHI9bj8uc3RydWN0dXJlZENvbnRlbnQ7cj8udmlldz09PSJvcmRlcnMiP2NzKHIpOnR8fHh0KHoub3JkZXJzRmFpbGVkKX0pLmNhdGNoKG49Pnt0fHx4dChTdHJpbmcobj8ubWVzc2FnZT8/bikpfSksVSQ9dD0+L2NhcHR1cmVkfGNvbXBsZXRlZHxwYWlkL2kudGVzdCh0LnN0YXR1cykmJiEvcmVmdW5kL2kudGVzdCh0LnN0YXR1cykmJiF0LnJlZnVuZFBlbmRpbmcsUCQ9dD0+e2NvbnN0IG49U3RyaW5nKHQpLnRvTG93ZXJDYXNlKCk7cmV0dXJuYDxzcGFuIGNsYXNzPSJvc3RhdCAkey9yZWZ1bmQvLnRlc3Qobik/Indhcm4iOi9jYXB0dXJlZHxjb21wbGV0ZWR8cGFpZHxzZXR0bGVkLy50ZXN0KG4pPyJvayI6Im11dGVkIn0iPiR7ayh0KX08L3NwYW4+YH0sY3M9dD0+e2lmKE9tKHQpLEZlPXQub3JkZXJzPz9bXSxHPW51bGwsRCgibWVyY2hhbnQiKS50ZXh0Q29udGVudD16Lm9yZGVyc1RpdGxlLGlpKCgpPT5ObSghMCkpLCFGZS5sZW5ndGgpe0QoImNvbnRlbnQiKS5pbm5lckhUTUw9YDxkaXYgY2xhc3M9ImVtcHR5Ij4ke2soei5ub09yZGVycyl9PC9kaXY+YDtyZXR1cm59RCgiY29udGVudCIpLmlubmVySFRNTD1gPGRpdiBjbGFzcz0icm93cyBvbGlzdCI+JHtGZS5tYXAoKG4scik9Pntjb25zdCBvPVtuLnRvdGFsLG4ucHJvdG9jb2wsbi5kYXRlXS5maWx0ZXIoQm9vbGVhbikubWFwKGspLmpvaW4oIiDCtyAiKTtyZXR1cm5gPGRpdiBjbGFzcz0icm93IiBkYXRhLXJvdz0iJHtyfSI+CiAgICAgIDxkaXYgY2xhc3M9InJvdy1tYWluIj48c3BhbiBjbGFzcz0ici10aXRsZSI+JHtrKG4ucHJvZHVjdHx8bi5vcmRlcklkKX08L3NwYW4+PHNwYW4gY2xhc3M9InItc3ViIj4ke299PC9zcGFuPjwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJyb3ctYWN0cyI+CiAgICAgICAgJHtQJChuLnN0YXR1cyl9CiAgICAgICAgJHtVJChuKT9gPGJ1dHRvbiBjbGFzcz0iYWN0IiBkYXRhLXJlZnVuZD0iJHtyfSI+JHtrKHoucmVmdW5kKX08L2J1dHRvbj5gOiIifQogICAgICA8L2Rpdj4KICAgIDwvZGl2PmB9KS5qb2luKCIiKX08L2Rpdj5gO2Zvcihjb25zdCBuIG9mIEFycmF5LmZyb20oRCgiY29udGVudCIpLnF1ZXJ5U2VsZWN0b3JBbGwoImJ1dHRvbltkYXRhLXJlZnVuZF0iKSkpbi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsKCk9Pk4kKE51bWJlcihuLmRhdGFzZXQucmVmdW5kKSkpfSxOJD10PT57Y29uc3Qgbj1GZVt0XTtpZighbilyZXR1cm47Y29uc3Qgcj1EKCJjb250ZW50IikucXVlcnlTZWxlY3RvcihgYnV0dG9uW2RhdGEtcmVmdW5kPSIke3R9Il1gKSxvPUQoImNvbnRlbnQiKS5xdWVyeVNlbGVjdG9yKGBbZGF0YS1yb3c9IiR7dH0iXWApO28/LnF1ZXJ5U2VsZWN0b3IoIi5vLWVyciIpPy5yZW1vdmUoKSxyJiYoci5kaXNhYmxlZD0hMCxyLnRleHRDb250ZW50PXoucmVmdW5kaW5nKTtjb25zdCBlPWk9PntpZihyJiYoci5kaXNhYmxlZD0hMSxyLnRleHRDb250ZW50PXoucmVmdW5kKSwhbylyZXR1cm47Y29uc3QgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTthLmNsYXNzTmFtZT0iby1lcnIiLGEudGV4dENvbnRlbnQ9aSxvLmFwcGVuZENoaWxkKGEpfTtvZS5jYWxsU2VydmVyVG9vbCh7bmFtZToicmVxdWVzdF9yZWZ1bmQiLGFyZ3VtZW50czp7b3JkZXJJZDpuLm9yZGVySWR9fSkudGhlbihpPT57bGV0IGE9e307dHJ5e2E9SlNPTi5wYXJzZShpPy5jb250ZW50Py5bMF0/LnRleHQ/PyJ7fSIpfWNhdGNoe31pZihpPy5pc0Vycm9yfHxhLnJlcXVlc3RlZD09PSExKXtlKFN0cmluZyhpPy5jb250ZW50Py5bMF0/LnRleHQ/P2EubWVzc2FnZT8/ei5yZWZ1bmRGYWlsZWQpKTtyZXR1cm59RmVbdF09ey4uLm4sc3RhdHVzOmEuc3RhdHVzPz8icmVmdW5kIHJlcXVlc3RlZCIscmVmdW5kUGVuZGluZzohMH0sY3Moe29yZGVyczpGZX0pfSkuY2F0Y2goaT0+ZShTdHJpbmcoaT8ubWVzc2FnZT8/aT8/ei5yZWZ1bmRGYWlsZWQpKSl9LEQkPSgpPT57aWYoIUcpcmV0dXJuO2NvbnN0IHQ9Ry5wcm9kdWN0O0QoImNvbnRlbnQiKS5pbm5lckhUTUw9YDxkaXYgY2xhc3M9InJlc3VsdCI+CiAgICA8c3BhbiBjbGFzcz0iYmFkZ2UgdG9kbyI+JHtrKHouaGFuZGVkT3Zlcil9PC9zcGFuPgogICAgPGRpdiBjbGFzcz0ibGluZSI+JHtrKHouaGFuZGVkT3ZlckJvZHkpfTwvZGl2PgogICAgPGRpdiBjbGFzcz0ibW9ubyI+JHtrKHQubmFtZSl9JHt0LnByaWNlRGlzcGxheT9gIMK3ICR7ayh0LnByaWNlRGlzcGxheSl9YDoiIn08L2Rpdj4KICAgIDxkaXYgY2xhc3M9ImxpbmUgd2FpdGluZyI+JHtrKHouaGFuZGVkT3ZlcldhaXQpfTwvZGl2PgogICAgJHtqZSgpfTwvZGl2PmAsT2UoKTtjb25zdCBuPVBuKHouaGFuZE9mZkFzayx7cHJvZHVjdDpgJHt0Lm5hbWV9JHtHLnF1YW50aXR5PjE/YCDDlyAke0cucXVhbnRpdHl9YDoiIn1gfSk7b2Uuc2VuZE1lc3NhZ2Uoe3JvbGU6InVzZXIiLGNvbnRlbnQ6W3t0eXBlOiJ0ZXh0Iix0ZXh0Om59XX0pLmNhdGNoKCgpPT57fSl9LERtPXQ9Pntjb25zdCBuPVVtKHQpO2lmKCEoIW58fCFHKSl7aWYobi5jaGF0KXtEJCgpO3JldHVybn1EKCJjb250ZW50IikuaW5uZXJIVE1MPWA8ZGl2IGNsYXNzPSJzcGluIj4ke2soUG4oei5wYXlpbmcse21ldGhvZDpuLmRpc3BsYXl9KSl9PC9kaXY+YCxvZS5jYWxsU2VydmVyVG9vbCh7bmFtZTpuLnRvb2wsYXJndW1lbnRzOntza3U6Ry5wcm9kdWN0LnNrdSxxdWFudGl0eTpHLnF1YW50aXR5LC4uLm4uYXJncz8/e319fSkudGhlbihyPT5Kbih0LHIpKS5jYXRjaChyPT5Kbih0LHtpc0Vycm9yOiEwLGNvbnRlbnQ6W3t0ZXh0OlN0cmluZyhyPy5tZXNzYWdlPz9yKX1dfSkpfX0sRSQ9KHQsbixyKT0+e2NvbnN0IG89RCgicHdhaXQiKTtsZXQgZT0hMTtEKCJiYWNrIik/LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwoKT0+e2U9ITB9KTtsZXQgaT0wO2NvbnN0IGE9KCk9PntlfHxvZS5jYWxsU2VydmVyVG9vbCh7bmFtZToiZ2V0X3Npbm9jYXJlX29yZGVyX3N0YXR1cyIsYXJndW1lbnRzOntzZXNzaW9uSWQ6dCxtZXJjaGFudElkOm59fSkudGhlbihzPT57aWYoZSlyZXR1cm47bGV0IGM9e307dHJ5e2M9SlNPTi5wYXJzZShzPy5jb250ZW50Py5bMF0/LnRleHQ/PyJ7fSIpfWNhdGNoe31pZihjLnBhaWQpe0puKHIscyk7cmV0dXJufWlmKCsraT4yMDApe28mJihvLnRleHRDb250ZW50PXoucGF5VGltZW91dCk7cmV0dXJufXNldFRpbWVvdXQoYSwzZTMpfSkuY2F0Y2goKCk9PntlfHxzZXRUaW1lb3V0KGEsNGUzKX0pfTtzZXRUaW1lb3V0KGEsM2UzKX0sWiQ9dD0+e2NvbnN0IG49RCgid3dhaXQiKTtsZXQgcj0hMTtEKCJiYWNrIik/LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwoKT0+e3I9ITB9KTtjb25zdCBvPSgpPT57cnx8b2UuY2FsbFNlcnZlclRvb2woe25hbWU6ImN1cmxlc3Nfd2FsbGV0X2xvZ2luX3N0YXR1cyIsYXJndW1lbnRzOnt9fSkudGhlbihlPT57aWYocilyZXR1cm47bGV0IGk9e307dHJ5e2k9SlNPTi5wYXJzZShlPy5jb250ZW50Py5bMF0/LnRleHQ/PyJ7fSIpfWNhdGNoe31pZihpLnNpZ25lZEluKXtuJiYobi50ZXh0Q29udGVudD1Qbih6LnNpZ25lZEluUGF5aW5nLHtlbWFpbDppLmVtYWlsPz8iIn0pKSxEbSh0KTtyZXR1cm59aWYoaS5leHBpcmVkKXtuJiYobi50ZXh0Q29udGVudD16LnNpZ25JbkV4cGlyZWQpO3JldHVybn1pZihpLm5ldmVyU3RhcnRlZCl7biYmKG4udGV4dENvbnRlbnQ9ei5zaWduSW5OZXZlclN0YXJ0ZWQpO3JldHVybn1zZXRUaW1lb3V0KG8sMmUzKX0pLmNhdGNoKCgpPT57cnx8c2V0VGltZW91dChvLDNlMyl9KX07c2V0VGltZW91dChvLDJlMyl9LEpuPSh0LG4pPT57Y29uc3Qgcj1VbSh0KTtsZXQgbz17fTt0cnl7bz1KU09OLnBhcnNlKG4/LmNvbnRlbnQ/LlswXT8udGV4dD8/Int9Iil9Y2F0Y2h7fWlmKHI/LmV4dCYmby51cmwpe0QoImNvbnRlbnQiKS5pbm5lckhUTUw9YDxkaXYgY2xhc3M9InJlc3VsdCI+CiAgICAgIDxzcGFuIGNsYXNzPSJiYWRnZSBvayI+JHtrKHoub25lU3RlcExlZnQpfTwvc3Bhbj4KICAgICAgPGRpdiBjbGFzcz0ibGluZSI+JHtrKG8ubWVzc2FnZT8/IiIpfTwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJsb2dpbnJvdyI+PHNwYW4gY2xhc3M9ImFjdCBwcmltYXJ5IiBpZD0icGF5bGluayIgcm9sZT0ibGluayIgdGFiaW5kZXg9IjAiPiR7ayh6LmdvUGF5KX08L3NwYW4+PC9kaXY+CiAgICAgICR7amUoKX08L2Rpdj5gLCR0KCJwYXlsaW5rIixTdHJpbmcoby51cmwpKSxPZSgpO3JldHVybn1pZihvLmF3YWl0aW5nUGF5bWVudCl7RCgiY29udGVudCIpLmlubmVySFRNTD1gPGRpdiBjbGFzcz0icmVzdWx0Ij4KICAgICAgPHNwYW4gY2xhc3M9ImJhZGdlIHRvZG8iPiR7ayh6Lm9uZVN0ZXBMZWZ0KX08L3NwYW4+CiAgICAgIDxkaXYgY2xhc3M9ImxpbmUiPiR7ayhvLm1lc3NhZ2U/PyIiKX08L2Rpdj4KICAgICAgJHtvLnRvdGFsP2A8ZGl2IGNsYXNzPSJtb25vIj4ke2soU3RyaW5nKG8udG90YWwpKX08L2Rpdj5gOiIifQogICAgICAke28ucGF5VXJsP2A8ZGl2IGNsYXNzPSJsb2dpbnJvdyI+PHNwYW4gY2xhc3M9ImFjdCBwcmltYXJ5IiBpZD0icGdvIiByb2xlPSJsaW5rIiB0YWJpbmRleD0iMCI+JHtrKHouZ29QYXkpfTwvc3Bhbj48L2Rpdj4KICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxpbmUgd2FpdGluZyIgaWQ9InB3YWl0Ij4ke2soei5wYXlXYWl0KX08L2Rpdj5gOiIifQogICAgICAke2plKCl9PC9kaXY+YCxvLnBheVVybCYmJHQoInBnbyIsU3RyaW5nKG8ucGF5VXJsKSksT2UoKSxvLnNlc3Npb25JZCYmby5tZXJjaGFudElkJiZFJChTdHJpbmcoby5zZXNzaW9uSWQpLFN0cmluZyhvLm1lcmNoYW50SWQpLHQpO3JldHVybn1pZihvLm5lZWRzTG9naW4mJm8ubG9naW5Vcmwpe0QoImNvbnRlbnQiKS5pbm5lckhUTUw9YDxkaXYgY2xhc3M9InJlc3VsdCI+CiAgICAgIDxzcGFuIGNsYXNzPSJiYWRnZSB0b2RvIj4ke2soei5zaWduSW4pfTwvc3Bhbj4KICAgICAgPGRpdiBjbGFzcz0ibGluZSI+JHtrKG8ubWVzc2FnZT8/IiIpfTwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJsb2dpbnJvdyI+CiAgICAgICAgPHNwYW4gY2xhc3M9ImFjdCBwcmltYXJ5IiBpZD0id2dvIiByb2xlPSJsaW5rIiB0YWJpbmRleD0iMCI+JHtrKHouc2lnbkluR28pfTwvc3Bhbj4KICAgICAgICAke28udXNlckNvZGU/YDxzcGFuIGNsYXNzPSJ1Y29kZSI+JHtrKG8udXNlckNvZGUpfTwvc3Bhbj5gOiIifQogICAgICA8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0ibGluZSB3YWl0aW5nIiBpZD0id3dhaXQiPiR7ayh6LnNpZ25JbldhaXQpfTwvZGl2PgogICAgICAke2plKCl9PC9kaXY+YCwkdCgid2dvIixTdHJpbmcoby5sb2dpblVybCkpLE9lKCksWiQodCk7cmV0dXJufWlmKG8ud2FsbGV0UmVmdXNlZCl7RCgiY29udGVudCIpLmlubmVySFRNTD1gPGRpdiBjbGFzcz0icmVzdWx0Ij4KICAgICAgPHNwYW4gY2xhc3M9ImJhZGdlIHRvZG8iPiR7ayh6LndhbGxldFNhaWRObyl9PC9zcGFuPgogICAgICA8ZGl2IGNsYXNzPSJsaW5lIj4ke2soby5tZXNzYWdlPz8iIil9PC9kaXY+CiAgICAgICR7by53YWxsZXRVcmw/YDxkaXYgY2xhc3M9ImxvZ2lucm93Ij48c3BhbiBjbGFzcz0iYWN0IHByaW1hcnkiIGlkPSJ3b3BlbiIgcm9sZT0ibGluayIgdGFiaW5kZXg9IjAiPiR7ayh6Lm9wZW5XYWxsZXQpfTwvc3Bhbj48L2Rpdj5gOiIifQogICAgICAke2plKCl9PC9kaXY+YCxvLndhbGxldFVybCYmJHQoIndvcGVuIixTdHJpbmcoby53YWxsZXRVcmwpKSxPZSgpO3JldHVybn1jb25zdCBlPW8ub3JkZXJlZD8/by5ib29rZWQ7aWYobj8uaXNFcnJvcnx8KGU9PT12b2lkIDA/by5zdGF0dXMhPT0iY2FwdHVyZWQiJiZvLnN0YXR1cyE9PSJjb21wbGV0ZWQiOmU9PT0hMSkpe0QoImNvbnRlbnQiKS5pbm5lckhUTUw9YDxkaXYgY2xhc3M9InJlc3VsdCI+CiAgICAgIDxzcGFuIGNsYXNzPSJiYWRnZSBlcnIiPiR7ayh6Lm5vdENvbXBsZXRlZCl9PC9zcGFuPgogICAgICA8ZGl2IGNsYXNzPSJsaW5lIj4ke2soby5tZXNzYWdlPz9vLnJlYXNvbj8/bj8uY29udGVudD8uWzBdPy50ZXh0Pz8iIil9PC9kaXY+CiAgICAgICR7amUoKX08L2Rpdj5gLE9lKCk7cmV0dXJufUVtKG8pfSxFbT10PT57aWkobnVsbCk7Y29uc3Qgbj10LnBhaWRSbHVzZD8/dC5wYWlkVXNkYz8/dC50b3RhbD8/IiIscj10LnR4SGFzaCxvPXQuZXhwbG9yZXI7RCgiY29udGVudCIpLmlubmVySFRNTD1gPGRpdiBjbGFzcz0icmVzdWx0Ij4KICAgIDxzcGFuIGNsYXNzPSJiYWRnZSBvayI+JHtrKHoub3JkZXJlZCl9PC9zcGFuPgogICAgPGRpdiBjbGFzcz0ibGluZSI+JHtrKHQubWVzc2FnZT8/UG4oei5vcmRlcmVkRmFsbGJhY2sse3Byb2R1Y3Q6dC5wcm9kdWN0Pz9HPy5wcm9kdWN0Lm5hbWU/PyIifSkpfTwvZGl2PgogICAgJHt0LnBheWVyP2A8ZGl2IGNsYXNzPSJtb25vIj4ke2soei5wYWlkQnkpfSAke2soU3RyaW5nKHQucGF5ZXIpKX08L2Rpdj5gOiIifQogICAgJHtuP2A8ZGl2IGNsYXNzPSJtb25vIj4ke2sobil9PC9kaXY+YDoiIn0KICAgICR7cj9gPGRpdiBjbGFzcz0ibGluZSI+JHtrKHoub25DaGFpblR4KX0gJHtvP2A8c3BhbiBjbGFzcz0idHgiIGlkPSJ0eGxpbmsiIHJvbGU9ImxpbmsiIHRhYmluZGV4PSIwIj4ke2socil9IOKGlzwvc3Bhbj5gOmA8c3BhbiBjbGFzcz0ibW9ubyI+JHtrKHIpfTwvc3Bhbj5gfTwvZGl2PmA6IiJ9CiAgICA8ZGl2IGNsYXNzPSJjdGEtcm93Ij4ke3gkKCl9PGJ1dHRvbiBjbGFzcz0iYmFjayIgaWQ9ImFnYWluIj4ke2soei5vcmRlckFnYWluKX08L2J1dHRvbj48L2Rpdj4KICA8L2Rpdj5gLHImJm8mJiR0KCJ0eGxpbmsiLFN0cmluZyhvKSksVCQoKSxEKCJhZ2FpbiIpPy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsKCk9PntHJiZzcyhHKX0pfTtsZXQgYWU9ITEsX3Q9bnVsbCxwaT1udWxsLGFpPSExLGJ0PW51bGw7Y29uc3QgdXM9KHQsbj0hMSk9PntpZighdClyZXR1cm47aWYoT20odCksdC52aWV3PT09InByb2R1Y3RzIil7UG0odCksYWU9ITAsX3Q9bnVsbCxwaT1udWxsLGFpPSExO3JldHVybn1pZih0LnZpZXc9PT0ib3JkZXJzIil7Y3ModCksYWU9ITA7cmV0dXJufWlmKHQub3JkZXJlZCE9PXZvaWQgMHx8dC5ib29rZWQhPT12b2lkIDB8fHQucGFpZCE9PXZvaWQgMHx8dC5hd2FpdGluZ1BheW1lbnR8fHQubmVlZHNMb2dpbnx8dC53YWxsZXRSZWZ1c2VkKXthZT0hMCxKbigiIix7Y29udGVudDpbe3RleHQ6SlNPTi5zdHJpbmdpZnkodCl9XX0pO3JldHVybn1pZih0LnZpZXchPT0iY2hlY2tvdXQifHwhdC5wcm9kdWN0Py5za3Upe2FlfHwoYWU9ITAsRCgiY29udGVudCIpLmlubmVySFRNTD1gPGRpdiBjbGFzcz0icmVzdWx0Ij4KICAgICAgICA8c3BhbiBjbGFzcz0iYmFkZ2UgdG9kbyI+JHtrKHoubm90aGluZ1RvU2hvdyl9PC9zcGFuPgogICAgICAgIDxkaXYgY2xhc3M9ImxpbmUiPiR7ayh6Lm5vdGhpbmdUb1Nob3dCb2R5KX08L2Rpdj48L2Rpdj5gKTtyZXR1cm59Y29uc3Qgcj10LnByb2R1Y3Quc2t1PT09X3Qsbz0hIXQucmVjZWlwdCYmIWFpO2lmKCEoYWUmJiFvJiYhKG4mJiFyKSkpe2lmKGFlPSEwLF90PXQucHJvZHVjdC5za3UscGk9dC5wcm9kdWN0Lm5hbWU/P251bGwsYWk9ISF0LnJlY2VpcHQsdC5yZWNlaXB0KXtHPXQsRW0odC5yZWNlaXB0KTtyZXR1cm59c3ModCl9fSxSJD0oKT0+b2UuZ2V0SG9zdENvbnRleHQoKT8udG9vbEluZm8/LnRvb2w/Lm5hbWU/PyJzdGFydF9zaW5vY2FyZV9jaGVja291dCIsSG49KHQsbj0hMCk9Pntjb25zdCByPVIkKCk7b2UuY2FsbFNlcnZlclRvb2woe25hbWU6cixhcmd1bWVudHM6ey4uLnQsLi4ubj97X19yZWh5ZHJhdGU6MX06e319fSkudGhlbihvPT57Y29uc3QgZT1vPy5zdHJ1Y3R1cmVkQ29udGVudDtlP3VzKGUpOmFlfHx4dCh6Lm5vdGhpbmdUb1Nob3dCb2R5KX0pLmNhdGNoKG89PnthZXx8eHQoU3RyaW5nKG8/Lm1lc3NhZ2U/P28pKX0pfSxDJD10PT57Y29uc3Qgbj10eXBlb2YgdC5za3U9PSJzdHJpbmciP3Quc2t1LnRyaW0oKToiIjtpZihuKXJldHVybiBuIT09X3Q7Y29uc3Qgcj10eXBlb2YgdC5xdWVyeT09InN0cmluZyI/dC5xdWVyeS50cmltKCk6IiI7cmV0dXJuIHI/IWAke3BpPz8iIn0gJHtfdD8/IiJ9YC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHIudG9Mb3dlckNhc2UoKSk6ITF9O2okKCk7b2Uub250b29scmVzdWx0PXQ9PnVzKHQ/LnN0cnVjdHVyZWRDb250ZW50LCEwKTtvZS5vbnRvb2xpbnB1dD10PT57Y29uc3Qgbj10Py5hcmd1bWVudHM/P3t9O2lmKCFhZSl7YnQ9bixIbihuKTtyZXR1cm59QyQobikmJihidD1uLGFlPSExLEhuKG4sITEpKX07b2Uub25ob3N0Y29udGV4dGNoYW5nZWQ9KCk9Pnt9O29lLmNvbm5lY3QoKS50aGVuKCgpPT57Y29uc3QgdD1vZS5nZXRIb3N0Q29udGV4dCgpLG49dD8udG9vbEluZm8/LmFyZ3VtZW50cz8/dD8udG9vbElucHV0Py5hcmd1bWVudHM/P3Q/LmFyZ3VtZW50cztuJiYhYWUmJihidD1uLEhuKGJ0KSksc2V0VGltZW91dCgoKT0+e2FlfHxIbihidD8/e30pfSwxZTMpfSkuY2F0Y2godD0+eHQoU3RyaW5nKHQ/Lm1lc3NhZ2U/P3QpKSk7PC9zY3JpcHQ+CiAgPC9oZWFkPgogIDxib2R5PgogICAgPGRpdiBjbGFzcz0iY2FyZCI+CiAgICAgIDxkaXYgY2xhc3M9ImhlYWQiPgogICAgICAgIDxzcGFuIGNsYXNzPSJ0aXRsZSI+U2lub2NhcmU8L3NwYW4+CiAgICAgICAgPHNwYW4gY2xhc3M9Im1lcmNoYW50IiBpZD0ibWVyY2hhbnQiPjwvc3Bhbj4KICAgICAgICA8YnV0dG9uIGNsYXNzPSJyZWZyZXNoIiBpZD0icmVmcmVzaCIgaGlkZGVuPgogICAgICAgICAgPHN2ZyB2aWV3Qm94PSIwIDAgMjQgMjQiIGZpbGw9Im5vbmUiIHN0cm9rZT0iY3VycmVudENvbG9yIiBzdHJva2Utd2lkdGg9IjIuNCIKICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBhcmlhLWhpZGRlbj0idHJ1ZSI+CiAgICAgICAgICAgIDxwYXRoIGQ9Ik0yMCAxMWE4IDggMCAxIDAtMS44IDYiIC8+CiAgICAgICAgICAgIDxwb2x5bGluZSBwb2ludHM9IjIwIDQgMjAgMTEgMTMgMTEiIC8+CiAgICAgICAgICA8L3N2Zz4KICAgICAgICA8L2J1dHRvbj4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgaWQ9ImNvbnRlbnQiPjxkaXYgY2xhc3M9ImVtcHR5Ij5Mb2FkaW5n4oCmPC9kaXY+PC9kaXY+CiAgICA8L2Rpdj4KICA8L2JvZHk+CjwvaHRtbD4K',\n 'base64',\n).toString('utf8');\n"],"mappings":"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","names":["query","sku","wallet","sku","quantity","receipt","session","merchantId","reqs","xPayment","paidRes","paid","paidUsdc"]}
|