ÿØÿàJFIFÿþ ÿÛC       ÿÛC ÿÀÿÄÿÄ"#QrÿÄÿÄ&1!A"2qQaáÿÚ ?Øy,æ/3JæÝ¹È߲؋5êXw²±ÉyˆR”¾I0ó2—PI¾IÌÚiMö¯–þrìN&"KgX:Šíµ•nTJnLK„…@!‰-ý ùúmë;ºgµŒ&ó±hw’¯Õ@”Ü— 9ñ-ë.²1<yà‚¹ïQÐU„ہ?.’¦èûbß±©Ö«Âw*VŒ) `$‰bØÔŸ’ëXÖ-ËTÜíGÚ3ð«g Ÿ§¯—Jx„–’U/ÂÅv_s(Hÿ@TñJÑãõçn­‚!ÈgfbÓc­:él[ðQe 9ÀPLbÃãCµm[5¿ç'ªjglå‡Ûí_§Úõl-;"PkÞÞÁQâ¼_Ñ^¢SŸx?"¸¦ùY騐ÒOÈ q’`~~ÚtËU¹CڒêV  I1Áß_ÿÙ ]c@sddlZddlZddlZddlZddlmZmZmZdefdYZde fdYZ dZ dd Z d Z d Zd Zd ZdZdZe e dZdZdS(iN(t str_typestMutableMappingturlsplittURIDictcBsVeZdZdZdZdZdZdZdZdZ dZ RS( s9 Dictionary which uses normalized URIs as keys. cCst|jS(N(Rtgeturl(tselfturi((sB/opt/alt/python27/lib/python2.7/site-packages/jsonschema/_utils.pyt normalizescOs#t|_|jj||dS(N(tdicttstoretupdate(Rtargstkwargs((sB/opt/alt/python27/lib/python2.7/site-packages/jsonschema/_utils.pyt__init__s cCs|j|j|S(N(R R(RR((sB/opt/alt/python27/lib/python2.7/site-packages/jsonschema/_utils.pyt __getitem__scCs||j|j|((R((sB/opt/alt/python27/lib/python2.7/site-packages/jsonschema/_utils.pyR/s(RRRR(((sB/opt/alt/python27/lib/python2.7/site-packages/jsonschema/_utils.pyR)scCs1tjddj|}tj|jdS(sD Load a schema from ./schemas/``name``.json and return it. t jsonschemasschemas/{0}.jsonsutf-8(tpkgutiltget_datatformattjsontloadstdecode(tnametdata((sB/opt/alt/python27/lib/python2.7/site-packages/jsonschema/_utils.pyt load_schema3sics#djfd|jDS(sE A dumb version of :func:`textwrap.indent` from Python 3.3. s c3s!|]}dd|VqdS(t iN((t.0tline(ttimes(sB/opt/alt/python27/lib/python2.7/site-packages/jsonschema/_utils.pys Cs(tjoint splitlines(tstringR)((R)sB/opt/alt/python27/lib/python2.7/site-packages/jsonschema/_utils.pytindent=scCs%|s dSddjd|DS(s Construct a single string containing indexing operations for the indices. For example, [1, 2, "foo"] -> [1][2]["foo"] Arguments: indices (sequence): The indices to format. ts[%s]s][css|]}t|VqdS(N(R(R'tindex((sB/opt/alt/python27/lib/python2.7/site-packages/jsonschema/_utils.pys Vs(R*(tindices((sB/opt/alt/python27/lib/python2.7/site-packages/jsonschema/_utils.pytformat_as_indexFsccst|jdi}dj|jdi}x@|D]8}||kr4|rdtj||rdq4n|Vq4q4WdS(s Return the set of additional properties for the given ``instance``. Weeds out properties that should have been validated by ``properties`` and / or ``patternProperties``. Assumes ``instance`` is dict-like already. t propertiest|tpatternPropertiesN(tgetR*tretsearch(tinstancetschemaR2tpatternstproperty((sB/opt/alt/python27/lib/python2.7/site-packages/jsonschema/_utils.pytfind_additional_propertiesYs   cCs>t|dkrd}nd}djd|D|fS(sA Create an error message for extra items or properties. itwastweres, css|]}t|VqdS(N(R(R'textra((sB/opt/alt/python27/lib/python2.7/site-packages/jsonschema/_utils.pys ws(RR*(textrastverb((sB/opt/alt/python27/lib/python2.7/site-packages/jsonschema/_utils.pyt extras_msgms cCspg}xP|D]H}y|jt|dWq tk rT|jt|q Xq Wd|dj|fS(s, Create an error message for a failure to match the given types. If the ``instance`` is an object and contains a ``name`` property, it will be considered to be a description of that object and used as its type. Otherwise the message is simply the reprs of the given ``types``. R#s%r is not of type %ss, (tappendRt ExceptionR*(R8ttypestreprsttype((sB/opt/alt/python27/lib/python2.7/site-packages/jsonschema/_utils.pyt types_msgzs   cCsqt}t|ts$|f}nx@|D]8}t|trV|jt|q+|j|q+Wt|S(s isinstance() can accept a bunch of really annoying different types: * a single type * a tuple of types * an arbitrary nested tree of tuples Return a flattened tuple of the given argument. (tsett isinstancettupleR tflattentadd(tsuitable_for_isinstanceREtthing((sB/opt/alt/python27/lib/python2.7/site-packages/jsonschema/_utils.pyRLs   cCst|tr|gS|S(s^ Wrap ``thing`` in a list if it's a single str. Otherwise, return it unchanged. (RJR(RO((sB/opt/alt/python27/lib/python2.7/site-packages/jsonschema/_utils.pyt ensure_listscCs$|tkr|S|tkr |S|S(sI A hack to make True and 1 and False and 0 unique for ``uniq``. (tTruetFalse(telementttruetfalse((sB/opt/alt/python27/lib/python2.7/site-packages/jsonschema/_utils.pytunbools   cCsy*ttd|Dt|kSWntk ry_td|D}tj|dd}x-t||D]\}}||krxtSqxWWqt tfk rg}x;|D]/}t |}||krtS|j |qWqXnXt S(s Check if all of a container's elements are unique. Successively tries first to rely that the elements are hashable, then falls back on them being sortable, and finally falls back on brute force. css|]}t|VqdS(N(RV(R'ti((sB/opt/alt/python27/lib/python2.7/site-packages/jsonschema/_utils.pys scss|]}t|VqdS(N(RV(R'RW((sB/opt/alt/python27/lib/python2.7/site-packages/jsonschema/_utils.pys siN( RRIt TypeErrortsortedt itertoolstislicetNonetzipRRtNotImplementedErrorRVRCRQ(t containertsorttslicedRWtjtseente((sB/opt/alt/python27/lib/python2.7/site-packages/jsonschema/_utils.pytuniqs" *      (RZR RR6tjsonschema.compatRRRRtobjectRR%R-R1R<RBRHRLRPRVRe(((sB/opt/alt/python27/lib/python2.7/site-packages/jsonschema/_utils.pyts