Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found in /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php on line 88

Warning: Cannot modify header information - headers already sent by (output started at /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php:88) in /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php on line 215

Warning: Cannot modify header information - headers already sent by (output started at /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php:88) in /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php on line 216

Warning: Cannot modify header information - headers already sent by (output started at /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php:88) in /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php on line 217

Warning: Cannot modify header information - headers already sent by (output started at /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php:88) in /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php on line 218

Warning: Cannot modify header information - headers already sent by (output started at /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php:88) in /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php on line 219

Warning: Cannot modify header information - headers already sent by (output started at /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php:88) in /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php on line 220
PK!3; hooks.phpnu[ '', 'xhtml1-strict' => '', 'xhtml1-trans' => '', 'xhtml1-frame' => '', 'xhtml-basic11' => '', 'html5' => '', 'html4-strict' => '', 'html4-trans' => '', 'html4-frame' => '', 'mathml1' => '', 'mathml2' => '', 'svg10' => '', 'svg11' => '', 'svg11-basic' => '', 'svg11-tiny' => '', 'xhtml-math-svg-xh' => '', 'xhtml-math-svg-sh' => '', 'xhtml-rdfa-1' => '', 'xhtml-rdfa-2' => '' ); PK!c foreign_chars.phpnu[ 'ae', '/ö|œ/' => 'oe', '/ü/' => 'ue', '/Ä/' => 'Ae', '/Ü/' => 'Ue', '/Ö/' => 'Oe', '/À|Á|Â|Ã|Ä|Å|Ǻ|Ā|Ă|Ą|Ǎ|Α|Ά|Ả|Ạ|Ầ|Ẫ|Ẩ|Ậ|Ằ|Ắ|Ẵ|Ẳ|Ặ|А/' => 'A', '/à|á|â|ã|å|ǻ|ā|ă|ą|ǎ|ª|α|ά|ả|ạ|ầ|ấ|ẫ|ẩ|ậ|ằ|ắ|ẵ|ẳ|ặ|а/' => 'a', '/Б/' => 'B', '/б/' => 'b', '/Ç|Ć|Ĉ|Ċ|Č/' => 'C', '/ç|ć|ĉ|ċ|č/' => 'c', '/Д|Δ/' => 'D', '/д|δ/' => 'd', '/Ð|Ď|Đ/' => 'Dj', '/ð|ď|đ/' => 'dj', '/È|É|Ê|Ë|Ē|Ĕ|Ė|Ę|Ě|Ε|Έ|Ẽ|Ẻ|Ẹ|Ề|Ế|Ễ|Ể|Ệ|Е|Э/' => 'E', '/è|é|ê|ë|ē|ĕ|ė|ę|ě|έ|ε|ẽ|ẻ|ẹ|ề|ế|ễ|ể|ệ|е|э/' => 'e', '/Ф/' => 'F', '/ф/' => 'f', '/Ĝ|Ğ|Ġ|Ģ|Γ|Г|Ґ/' => 'G', '/ĝ|ğ|ġ|ģ|γ|г|ґ/' => 'g', '/Ĥ|Ħ/' => 'H', '/ĥ|ħ/' => 'h', '/Ì|Í|Î|Ï|Ĩ|Ī|Ĭ|Ǐ|Į|İ|Η|Ή|Ί|Ι|Ϊ|Ỉ|Ị|И|Ы/' => 'I', '/ì|í|î|ï|ĩ|ī|ĭ|ǐ|į|ı|η|ή|ί|ι|ϊ|ỉ|ị|и|ы|ї/' => 'i', '/Ĵ/' => 'J', '/ĵ/' => 'j', '/Θ/' => 'TH', '/θ/' => 'th', '/Ķ|Κ|К/' => 'K', '/ķ|κ|к/' => 'k', '/Ĺ|Ļ|Ľ|Ŀ|Ł|Λ|Л/' => 'L', '/ĺ|ļ|ľ|ŀ|ł|λ|л/' => 'l', '/М/' => 'M', '/м/' => 'm', '/Ñ|Ń|Ņ|Ň|Ν|Н/' => 'N', '/ñ|ń|ņ|ň|ʼn|ν|н/' => 'n', '/Ò|Ó|Ô|Õ|Ō|Ŏ|Ǒ|Ő|Ơ|Ø|Ǿ|Ο|Ό|Ω|Ώ|Ỏ|Ọ|Ồ|Ố|Ỗ|Ổ|Ộ|Ờ|Ớ|Ỡ|Ở|Ợ|О/' => 'O', '/ò|ó|ô|õ|ō|ŏ|ǒ|ő|ơ|ø|ǿ|º|ο|ό|ω|ώ|ỏ|ọ|ồ|ố|ỗ|ổ|ộ|ờ|ớ|ỡ|ở|ợ|о/' => 'o', '/П/' => 'P', '/п/' => 'p', '/Ŕ|Ŗ|Ř|Ρ|Р/' => 'R', '/ŕ|ŗ|ř|ρ|р/' => 'r', '/Ś|Ŝ|Ş|Ș|Š|Σ|С/' => 'S', '/ś|ŝ|ş|ș|š|ſ|σ|ς|с/' => 's', '/Ț|Ţ|Ť|Ŧ|Τ|Т/' => 'T', '/ț|ţ|ť|ŧ|τ|т/' => 't', '/Þ|þ/' => 'th', '/Ù|Ú|Û|Ũ|Ū|Ŭ|Ů|Ű|Ų|Ư|Ǔ|Ǖ|Ǘ|Ǚ|Ǜ|Ũ|Ủ|Ụ|Ừ|Ứ|Ữ|Ử|Ự|У/' => 'U', '/ù|ú|û|ũ|ū|ŭ|ů|ű|ų|ư|ǔ|ǖ|ǘ|ǚ|ǜ|υ|ύ|ϋ|ủ|ụ|ừ|ứ|ữ|ử|ự|у/' => 'u', '/Ƴ|Ɏ|Ỵ|Ẏ|Ӳ|Ӯ|Ў|Ý|Ÿ|Ŷ|Υ|Ύ|Ϋ|Ỳ|Ỹ|Ỷ|Ỵ|Й/' => 'Y', '/ẙ|ʏ|ƴ|ɏ|ỵ|ẏ|ӳ|ӯ|ў|ý|ÿ|ŷ|ỳ|ỹ|ỷ|ỵ|й/' => 'y', '/В/' => 'V', '/в/' => 'v', '/Ŵ/' => 'W', '/ŵ/' => 'w', '/Φ/' => 'F', '/φ/' => 'f', '/Χ/' => 'CH', '/χ/' => 'ch', '/Ź|Ż|Ž|Ζ|З/' => 'Z', '/ź|ż|ž|ζ|з/' => 'z', '/Æ|Ǽ/' => 'AE', '/ß/' => 'ss', '/IJ/' => 'IJ', '/ij/' => 'ij', '/Œ/' => 'OE', '/ƒ/' => 'f', '/Ξ/' => 'KS', '/ξ/' => 'ks', '/Π/' => 'P', '/π/' => 'p', '/Β/' => 'V', '/β/' => 'v', '/Μ/' => 'M', '/μ/' => 'm', '/Ψ/' => 'PS', '/ψ/' => 'ps', '/Ё/' => 'Yo', '/ё/' => 'yo', '/Є/' => 'Ye', '/є/' => 'ye', '/Ї/' => 'Yi', '/Ж/' => 'Zh', '/ж/' => 'zh', '/Х/' => 'Kh', '/х/' => 'kh', '/Ц/' => 'Ts', '/ц/' => 'ts', '/Ч/' => 'Ch', '/ч/' => 'ch', '/Ш/' => 'Sh', '/ш/' => 'sh', '/Щ/' => 'Shch', '/щ/' => 'shch', '/Ъ|ъ|Ь|ь/' => '', '/Ю/' => 'Yu', '/ю/' => 'yu', '/Я/' => 'Ya', '/я/' => 'ya' ); PK!ɀ routes.phpnu[ my_controller/index | my-controller/my-method -> my_controller/my_method */ $route['default_controller'] = 'welcome'; $route['404_override'] = ''; $route['translate_uri_dashes'] = FALSE; PK!6R&L(L( mimes.phpnu[ array('application/mac-binhex40', 'application/mac-binhex', 'application/x-binhex40', 'application/x-mac-binhex40'), 'cpt' => 'application/mac-compactpro', 'csv' => array('text/x-comma-separated-values', 'text/comma-separated-values', 'application/octet-stream', 'application/vnd.ms-excel', 'application/x-csv', 'text/x-csv', 'text/csv', 'application/csv', 'application/excel', 'application/vnd.msexcel', 'text/plain'), 'bin' => array('application/macbinary', 'application/mac-binary', 'application/octet-stream', 'application/x-binary', 'application/x-macbinary'), 'dms' => 'application/octet-stream', 'lha' => 'application/octet-stream', 'lzh' => 'application/octet-stream', 'exe' => array('application/octet-stream', 'application/x-msdownload'), 'class' => 'application/octet-stream', 'psd' => array('application/x-photoshop', 'image/vnd.adobe.photoshop'), 'so' => 'application/octet-stream', 'sea' => 'application/octet-stream', 'dll' => 'application/octet-stream', 'oda' => 'application/oda', 'pdf' => array('application/pdf', 'application/force-download', 'application/x-download', 'binary/octet-stream'), 'ai' => array('application/pdf', 'application/postscript'), 'eps' => 'application/postscript', 'ps' => 'application/postscript', 'smi' => 'application/smil', 'smil' => 'application/smil', 'mif' => 'application/vnd.mif', 'xls' => array('application/vnd.ms-excel', 'application/msexcel', 'application/x-msexcel', 'application/x-ms-excel', 'application/x-excel', 'application/x-dos_ms_excel', 'application/xls', 'application/x-xls', 'application/excel', 'application/download', 'application/vnd.ms-office', 'application/msword'), 'ppt' => array('application/powerpoint', 'application/vnd.ms-powerpoint', 'application/vnd.ms-office', 'application/msword'), 'pptx' => array('application/vnd.openxmlformats-officedocument.presentationml.presentation', 'application/x-zip', 'application/zip'), 'wbxml' => 'application/wbxml', 'wmlc' => 'application/wmlc', 'dcr' => 'application/x-director', 'dir' => 'application/x-director', 'dxr' => 'application/x-director', 'dvi' => 'application/x-dvi', 'gtar' => 'application/x-gtar', 'gz' => 'application/x-gzip', 'gzip' => 'application/x-gzip', 'php' => array('application/x-httpd-php', 'application/php', 'application/x-php', 'text/php', 'text/x-php', 'application/x-httpd-php-source'), 'php4' => 'application/x-httpd-php', 'php3' => 'application/x-httpd-php', 'phtml' => 'application/x-httpd-php', 'phps' => 'application/x-httpd-php-source', 'js' => array('application/x-javascript', 'text/plain'), 'swf' => 'application/x-shockwave-flash', 'sit' => 'application/x-stuffit', 'tar' => 'application/x-tar', 'tgz' => array('application/x-tar', 'application/x-gzip-compressed'), 'z' => 'application/x-compress', 'xhtml' => 'application/xhtml+xml', 'xht' => 'application/xhtml+xml', 'zip' => array('application/x-zip', 'application/zip', 'application/x-zip-compressed', 'application/s-compressed', 'multipart/x-zip'), 'rar' => array('application/x-rar', 'application/rar', 'application/x-rar-compressed'), 'mid' => 'audio/midi', 'midi' => 'audio/midi', 'mpga' => 'audio/mpeg', 'mp2' => 'audio/mpeg', 'mp3' => array('audio/mpeg', 'audio/mpg', 'audio/mpeg3', 'audio/mp3'), 'aif' => array('audio/x-aiff', 'audio/aiff'), 'aiff' => array('audio/x-aiff', 'audio/aiff'), 'aifc' => 'audio/x-aiff', 'ram' => 'audio/x-pn-realaudio', 'rm' => 'audio/x-pn-realaudio', 'rpm' => 'audio/x-pn-realaudio-plugin', 'ra' => 'audio/x-realaudio', 'rv' => 'video/vnd.rn-realvideo', 'wav' => array('audio/x-wav', 'audio/wave', 'audio/wav'), 'bmp' => array('image/bmp', 'image/x-bmp', 'image/x-bitmap', 'image/x-xbitmap', 'image/x-win-bitmap', 'image/x-windows-bmp', 'image/ms-bmp', 'image/x-ms-bmp', 'application/bmp', 'application/x-bmp', 'application/x-win-bitmap'), 'gif' => 'image/gif', 'jpeg' => array('image/jpeg', 'image/pjpeg'), 'jpg' => array('image/jpeg', 'image/pjpeg'), 'jpe' => array('image/jpeg', 'image/pjpeg'), 'jp2' => array('image/jp2', 'video/mj2', 'image/jpx', 'image/jpm'), 'j2k' => array('image/jp2', 'video/mj2', 'image/jpx', 'image/jpm'), 'jpf' => array('image/jp2', 'video/mj2', 'image/jpx', 'image/jpm'), 'jpg2' => array('image/jp2', 'video/mj2', 'image/jpx', 'image/jpm'), 'jpx' => array('image/jp2', 'video/mj2', 'image/jpx', 'image/jpm'), 'jpm' => array('image/jp2', 'video/mj2', 'image/jpx', 'image/jpm'), 'mj2' => array('image/jp2', 'video/mj2', 'image/jpx', 'image/jpm'), 'mjp2' => array('image/jp2', 'video/mj2', 'image/jpx', 'image/jpm'), 'png' => array('image/png', 'image/x-png'), 'tiff' => 'image/tiff', 'tif' => 'image/tiff', 'heic' => 'image/heic', 'heif' => 'image/heif', 'css' => array('text/css', 'text/plain'), 'html' => array('text/html', 'text/plain'), 'htm' => array('text/html', 'text/plain'), 'shtml' => array('text/html', 'text/plain'), 'txt' => 'text/plain', 'text' => 'text/plain', 'log' => array('text/plain', 'text/x-log'), 'rtx' => 'text/richtext', 'rtf' => 'text/rtf', 'xml' => array('application/xml', 'text/xml', 'text/plain'), 'xsl' => array('application/xml', 'text/xsl', 'text/xml'), 'mpeg' => 'video/mpeg', 'mpg' => 'video/mpeg', 'mpe' => 'video/mpeg', 'qt' => 'video/quicktime', 'mov' => 'video/quicktime', 'avi' => array('video/x-msvideo', 'video/msvideo', 'video/avi', 'application/x-troff-msvideo'), 'movie' => 'video/x-sgi-movie', 'doc' => array('application/msword', 'application/vnd.ms-office'), 'docx' => array('application/vnd.openxmlformats-officedocument.wordprocessingml.document', 'application/zip', 'application/msword', 'application/x-zip'), 'dot' => array('application/msword', 'application/vnd.ms-office'), 'dotx' => array('application/vnd.openxmlformats-officedocument.wordprocessingml.document', 'application/zip', 'application/msword'), 'xlsx' => array('application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'application/zip', 'application/vnd.ms-excel', 'application/msword', 'application/x-zip'), 'word' => array('application/msword', 'application/octet-stream'), 'xl' => 'application/excel', 'eml' => 'message/rfc822', 'json' => array('application/json', 'text/json'), 'pem' => array('application/x-x509-user-cert', 'application/x-pem-file', 'application/octet-stream'), 'p10' => array('application/x-pkcs10', 'application/pkcs10'), 'p12' => 'application/x-pkcs12', 'p7a' => 'application/x-pkcs7-signature', 'p7c' => array('application/pkcs7-mime', 'application/x-pkcs7-mime'), 'p7m' => array('application/pkcs7-mime', 'application/x-pkcs7-mime'), 'p7r' => 'application/x-pkcs7-certreqresp', 'p7s' => 'application/pkcs7-signature', 'crt' => array('application/x-x509-ca-cert', 'application/x-x509-user-cert', 'application/pkix-cert'), 'crl' => array('application/pkix-crl', 'application/pkcs-crl'), 'der' => 'application/x-x509-ca-cert', 'kdb' => 'application/octet-stream', 'pgp' => 'application/pgp', 'gpg' => 'application/gpg-keys', 'sst' => 'application/octet-stream', 'csr' => 'application/octet-stream', 'rsa' => 'application/x-pkcs7', 'cer' => array('application/pkix-cert', 'application/x-x509-ca-cert'), '3g2' => 'video/3gpp2', '3gp' => array('video/3gp', 'video/3gpp'), 'mp4' => 'video/mp4', 'm4a' => 'audio/x-m4a', 'f4v' => array('video/mp4', 'video/x-f4v'), 'flv' => 'video/x-flv', 'webm' => 'video/webm', 'aac' => array('audio/x-aac', 'audio/aac'), 'm4u' => 'application/vnd.mpegurl', 'm3u' => 'text/plain', 'xspf' => 'application/xspf+xml', 'vlc' => 'application/videolan', 'wmv' => array('video/x-ms-wmv', 'video/x-ms-asf'), 'au' => 'audio/x-au', 'ac3' => 'audio/ac3', 'flac' => 'audio/x-flac', 'ogg' => array('audio/ogg', 'video/ogg', 'application/ogg'), 'kmz' => array('application/vnd.google-earth.kmz', 'application/zip', 'application/x-zip'), 'kml' => array('application/vnd.google-earth.kml+xml', 'application/xml', 'text/xml'), 'ics' => 'text/calendar', 'ical' => 'text/calendar', 'zsh' => 'text/x-scriptzsh', '7z' => array('application/x-7z-compressed', 'application/x-compressed', 'application/x-zip-compressed', 'application/zip', 'multipart/x-zip'), '7zip' => array('application/x-7z-compressed', 'application/x-compressed', 'application/x-zip-compressed', 'application/zip', 'multipart/x-zip'), 'cdr' => array('application/cdr', 'application/coreldraw', 'application/x-cdr', 'application/x-coreldraw', 'image/cdr', 'image/x-cdr', 'zz-application/zz-winassoc-cdr'), 'wma' => array('audio/x-ms-wma', 'video/x-ms-asf'), 'jar' => array('application/java-archive', 'application/x-java-application', 'application/x-jar', 'application/x-compressed'), 'svg' => array('image/svg+xml', 'image/svg', 'application/xml', 'text/xml'), 'vcf' => 'text/x-vcard', 'srt' => array('text/srt', 'text/plain'), 'vtt' => array('text/vtt', 'text/plain'), 'ico' => array('image/x-icon', 'image/x-ico', 'image/vnd.microsoft.icon'), 'odc' => 'application/vnd.oasis.opendocument.chart', 'otc' => 'application/vnd.oasis.opendocument.chart-template', 'odf' => 'application/vnd.oasis.opendocument.formula', 'otf' => 'application/vnd.oasis.opendocument.formula-template', 'odg' => 'application/vnd.oasis.opendocument.graphics', 'otg' => 'application/vnd.oasis.opendocument.graphics-template', 'odi' => 'application/vnd.oasis.opendocument.image', 'oti' => 'application/vnd.oasis.opendocument.image-template', 'odp' => 'application/vnd.oasis.opendocument.presentation', 'otp' => 'application/vnd.oasis.opendocument.presentation-template', 'ods' => 'application/vnd.oasis.opendocument.spreadsheet', 'ots' => 'application/vnd.oasis.opendocument.spreadsheet-template', 'odt' => 'application/vnd.oasis.opendocument.text', 'odm' => 'application/vnd.oasis.opendocument.text-master', 'ott' => 'application/vnd.oasis.opendocument.text-template', 'oth' => 'application/vnd.oasis.opendocument.text-web' ); PK!~(6I6I config.phpnu[]+$/i | | DO NOT CHANGE THIS UNLESS YOU FULLY UNDERSTAND THE REPERCUSSIONS!! | */ $config['permitted_uri_chars'] = 'a-z 0-9~%.:_\-'; /* |-------------------------------------------------------------------------- | Enable Query Strings |-------------------------------------------------------------------------- | | By default CodeIgniter uses search-engine friendly segment based URLs: | example.com/who/what/where/ | | You can optionally enable standard query string based URLs: | example.com?who=me&what=something&where=here | | Options are: TRUE or FALSE (boolean) | | The other items let you set the query string 'words' that will | invoke your controllers and its functions: | example.com/index.php?c=controller&m=function | | Please note that some of the helpers won't work as expected when | this feature is enabled, since CodeIgniter is designed primarily to | use segment based URLs. | */ $config['enable_query_strings'] = FALSE; $config['controller_trigger'] = 'c'; $config['function_trigger'] = 'm'; $config['directory_trigger'] = 'd'; /* |-------------------------------------------------------------------------- | Allow $_GET array |-------------------------------------------------------------------------- | | By default CodeIgniter enables access to the $_GET array. If for some | reason you would like to disable it, set 'allow_get_array' to FALSE. | | WARNING: This feature is DEPRECATED and currently available only | for backwards compatibility purposes! | */ $config['allow_get_array'] = TRUE; /* |-------------------------------------------------------------------------- | Error Logging Threshold |-------------------------------------------------------------------------- | | You can enable error logging by setting a threshold over zero. The | threshold determines what gets logged. Threshold options are: | | 0 = Disables logging, Error logging TURNED OFF | 1 = Error Messages (including PHP errors) | 2 = Debug Messages | 3 = Informational Messages | 4 = All Messages | | You can also pass an array with threshold levels to show individual error types | | array(2) = Debug Messages, without Error Messages | | For a live site you'll usually only enable Errors (1) to be logged otherwise | your log files will fill up very fast. | */ $config['log_threshold'] = 0; /* |-------------------------------------------------------------------------- | Error Logging Directory Path |-------------------------------------------------------------------------- | | Leave this BLANK unless you would like to set something other than the default | application/logs/ directory. Use a full server path with trailing slash. | */ $config['log_path'] = ''; /* |-------------------------------------------------------------------------- | Log File Extension |-------------------------------------------------------------------------- | | The default filename extension for log files. The default 'php' allows for | protecting the log files via basic scripting, when they are to be stored | under a publicly accessible directory. | | Note: Leaving it blank will default to 'php'. | */ $config['log_file_extension'] = ''; /* |-------------------------------------------------------------------------- | Log File Permissions |-------------------------------------------------------------------------- | | The file system permissions to be applied on newly created log files. | | IMPORTANT: This MUST be an integer (no quotes) and you MUST use octal | integer notation (i.e. 0700, 0644, etc.) */ $config['log_file_permissions'] = 0644; /* |-------------------------------------------------------------------------- | Date Format for Logs |-------------------------------------------------------------------------- | | Each item that is logged has an associated date. You can use PHP date | codes to set your own date formatting | */ $config['log_date_format'] = 'Y-m-d H:i:s'; /* |-------------------------------------------------------------------------- | Error Views Directory Path |-------------------------------------------------------------------------- | | Leave this BLANK unless you would like to set something other than the default | application/views/errors/ directory. Use a full server path with trailing slash. | */ $config['error_views_path'] = ''; /* |-------------------------------------------------------------------------- | Cache Directory Path |-------------------------------------------------------------------------- | | Leave this BLANK unless you would like to set something other than the default | application/cache/ directory. Use a full server path with trailing slash. | */ $config['cache_path'] = ''; /* |-------------------------------------------------------------------------- | Cache Include Query String |-------------------------------------------------------------------------- | | Whether to take the URL query string into consideration when generating | output cache files. Valid options are: | | FALSE = Disabled | TRUE = Enabled, take all query parameters into account. | Please be aware that this may result in numerous cache | files generated for the same page over and over again. | array('q') = Enabled, but only take into account the specified list | of query parameters. | */ $config['cache_query_string'] = FALSE; /* |-------------------------------------------------------------------------- | Encryption Key |-------------------------------------------------------------------------- | | If you use the Encryption class, you must set an encryption key. | See the user guide for more info. | | https://codeigniter.com/userguide3/libraries/encryption.html | */ $config['encryption_key'] = ''; /* |-------------------------------------------------------------------------- | Session Variables |-------------------------------------------------------------------------- | | 'sess_driver' | | The storage driver to use: files, database, redis, memcached | | 'sess_cookie_name' | | The session cookie name, must contain only [0-9a-z_-] characters | | 'sess_samesite' | | Session cookie SameSite attribute: Lax (default), Strict or None | | 'sess_expiration' | | The number of SECONDS you want the session to last. | Setting to 0 (zero) means expire when the browser is closed. | | 'sess_save_path' | | The location to save sessions to, driver dependent. | | For the 'files' driver, it's a path to a writable directory. | WARNING: Only absolute paths are supported! | | For the 'database' driver, it's a table name. | Please read up the manual for the format with other session drivers. | | IMPORTANT: You are REQUIRED to set a valid save path! | | 'sess_match_ip' | | Whether to match the user's IP address when reading the session data. | | WARNING: If you're using the database driver, don't forget to update | your session table's PRIMARY KEY when changing this setting. | | 'sess_time_to_update' | | How many seconds between CI regenerating the session ID. | | 'sess_regenerate_destroy' | | Whether to destroy session data associated with the old session ID | when auto-regenerating the session ID. When set to FALSE, the data | will be later deleted by the garbage collector. | | Other session cookie settings are shared with the rest of the application, | except for 'cookie_prefix' and 'cookie_httponly', which are ignored here. | */ $config['sess_driver'] = 'files'; $config['sess_cookie_name'] = 'ci_session'; $config['sess_samesite'] = 'Lax'; $config['sess_expiration'] = 7200; $config['sess_save_path'] = NULL; $config['sess_match_ip'] = FALSE; $config['sess_time_to_update'] = 300; $config['sess_regenerate_destroy'] = FALSE; /* |-------------------------------------------------------------------------- | Cookie Related Variables |-------------------------------------------------------------------------- | | 'cookie_prefix' = Set a cookie name prefix if you need to avoid collisions | 'cookie_domain' = Set to .your-domain.com for site-wide cookies | 'cookie_path' = Typically will be a forward slash | 'cookie_secure' = Cookie will only be set if a secure HTTPS connection exists. | 'cookie_httponly' = Cookie will only be accessible via HTTP(S) (no javascript) | 'cookie_samesite' = Cookie's samesite attribute (Lax, Strict or None) | | Note: These settings (with the exception of 'cookie_prefix' and | 'cookie_httponly') will also affect sessions. | */ $config['cookie_prefix'] = ''; $config['cookie_domain'] = ''; $config['cookie_path'] = '/'; $config['cookie_secure'] = FALSE; $config['cookie_httponly'] = FALSE; $config['cookie_samesite'] = 'Lax'; /* |-------------------------------------------------------------------------- | Standardize newlines |-------------------------------------------------------------------------- | | Determines whether to standardize newline characters in input data, | meaning to replace \r\n, \r, \n occurrences with the PHP_EOL value. | | WARNING: This feature is DEPRECATED and currently available only | for backwards compatibility purposes! | */ $config['standardize_newlines'] = FALSE; /* |-------------------------------------------------------------------------- | Global XSS Filtering |-------------------------------------------------------------------------- | | Determines whether the XSS filter is always active when GET, POST or | COOKIE data is encountered | | WARNING: This feature is DEPRECATED and currently available only | for backwards compatibility purposes! | */ $config['global_xss_filtering'] = FALSE; /* |-------------------------------------------------------------------------- | Cross Site Request Forgery |-------------------------------------------------------------------------- | Enables a CSRF cookie token to be set. When set to TRUE, token will be | checked on a submitted form. If you are accepting user data, it is strongly | recommended CSRF protection be enabled. | | 'csrf_token_name' = The token name | 'csrf_cookie_name' = The cookie name | 'csrf_expire' = The number in seconds the token should expire. | 'csrf_regenerate' = Regenerate token on every submission | 'csrf_exclude_uris' = Array of URIs which ignore CSRF checks */ $config['csrf_protection'] = FALSE; $config['csrf_token_name'] = 'csrf_test_name'; $config['csrf_cookie_name'] = 'csrf_cookie_name'; $config['csrf_expire'] = 7200; $config['csrf_regenerate'] = TRUE; $config['csrf_exclude_uris'] = array(); /* |-------------------------------------------------------------------------- | Output Compression |-------------------------------------------------------------------------- | | Enables Gzip output compression for faster page loads. When enabled, | the output class will test whether your server supports Gzip. | Even if it does, however, not all browsers support compression | so enable only if you are reasonably sure your visitors can handle it. | | Only used if zlib.output_compression is turned off in your php.ini. | Please do not use it together with httpd-level output compression. | | VERY IMPORTANT: If you are getting a blank page when compression is enabled it | means you are prematurely outputting something to your browser. It could | even be a line of whitespace at the end of one of your scripts. For | compression to work, nothing can be sent before the output buffer is called | by the output class. Do not 'echo' any values with compression enabled. | */ $config['compress_output'] = FALSE; /* |-------------------------------------------------------------------------- | Master Time Reference |-------------------------------------------------------------------------- | | Options are 'local' or any PHP supported timezone. This preference tells | the system whether to use your server's local time as the master 'now' | reference, or convert it to the configured one timezone. See the 'date | helper' page of the user guide for information regarding date handling. | */ $config['time_reference'] = 'local'; /* |-------------------------------------------------------------------------- | Rewrite PHP Short Tags |-------------------------------------------------------------------------- | | If your PHP installation does not have short tag support enabled CI | can rewrite the tags on-the-fly, enabling you to utilize that syntax | in your view files. Options are TRUE or FALSE (boolean) | | Note: You need to have eval() enabled for this to work. | */ $config['rewrite_short_tags'] = FALSE; /* |-------------------------------------------------------------------------- | Reverse Proxy IPs |-------------------------------------------------------------------------- | | If your server is behind a reverse proxy, you must whitelist the proxy | IP addresses from which CodeIgniter should trust headers such as | HTTP_X_FORWARDED_FOR and HTTP_CLIENT_IP in order to properly identify | the visitor's IP address. | | You can use both an array or a comma-separated list of proxy addresses, | as well as specifying whole subnets. Here are a few examples: | | Comma-separated: '10.0.1.200,192.168.5.0/24' | Array: array('10.0.1.200', '192.168.5.0/24') */ $config['proxy_ips'] = ''; PK! autoload.phpnu[ 'ua'); */ $autoload['libraries'] = array('database', 'email', 'session'); /* | ------------------------------------------------------------------- | Auto-load Drivers | ------------------------------------------------------------------- | These classes are located in system/libraries/ or in your | application/libraries/ directory, but are also placed inside their | own subdirectory and they extend the CI_Driver_Library class. They | offer multiple interchangeable driver options. | | Prototype: | | $autoload['drivers'] = array('cache'); | | You can also supply an alternative property name to be assigned in | the controller: | | $autoload['drivers'] = array('cache' => 'cch'); | */ $autoload['drivers'] = array(); /* | ------------------------------------------------------------------- | Auto-load Helper Files | ------------------------------------------------------------------- | Prototype: | | $autoload['helper'] = array('url', 'file'); */ $autoload['helper'] = array('url', 'file'); /* | ------------------------------------------------------------------- | Auto-load Config files | ------------------------------------------------------------------- | Prototype: | | $autoload['config'] = array('config1', 'config2'); | | NOTE: This item is intended for use ONLY if you have created custom | config files. Otherwise, leave it blank. | */ $autoload['config'] = array(); /* | ------------------------------------------------------------------- | Auto-load Language files | ------------------------------------------------------------------- | Prototype: | | $autoload['language'] = array('lang1', 'lang2'); | | NOTE: Do not include the "_lang" part of your file. For example | "codeigniter_lang.php" would be referenced as array('codeigniter'); | */ $autoload['language'] = array(); /* | ------------------------------------------------------------------- | Auto-load Models | ------------------------------------------------------------------- | Prototype: | | $autoload['model'] = array('first_model', 'second_model'); | | You can also supply an alternative model name to be assigned | in the controller: | | $autoload['model'] = array('first_model' => 'first'); */ $autoload['model'] = array(); PK!l6 profiler.phpnu[migration->current() this is the version that schema will | be upgraded / downgraded to. | */ $config['migration_version'] = 0; /* |-------------------------------------------------------------------------- | Migrations Path |-------------------------------------------------------------------------- | | Path to your migrations folder. | Typically, it will be within your application path. | Also, writing permission is required within the migrations path. | */ $config['migration_path'] = APPPATH.'migrations/'; PK! ˅  user_agents.phpnu[ 'Windows 10', 'windows nt 6.3' => 'Windows 8.1', 'windows nt 6.2' => 'Windows 8', 'windows nt 6.1' => 'Windows 7', 'windows nt 6.0' => 'Windows Vista', 'windows nt 5.2' => 'Windows 2003', 'windows nt 5.1' => 'Windows XP', 'windows nt 5.0' => 'Windows 2000', 'windows nt 4.0' => 'Windows NT 4.0', 'winnt4.0' => 'Windows NT 4.0', 'winnt 4.0' => 'Windows NT', 'winnt' => 'Windows NT', 'windows 98' => 'Windows 98', 'win98' => 'Windows 98', 'windows 95' => 'Windows 95', 'win95' => 'Windows 95', 'windows phone' => 'Windows Phone', 'windows' => 'Unknown Windows OS', 'android' => 'Android', 'blackberry' => 'BlackBerry', 'iphone' => 'iOS', 'ipad' => 'iOS', 'ipod' => 'iOS', 'os x' => 'Mac OS X', 'ppc mac' => 'Power PC Mac', 'freebsd' => 'FreeBSD', 'ppc' => 'Macintosh', 'linux' => 'Linux', 'debian' => 'Debian', 'sunos' => 'Sun Solaris', 'beos' => 'BeOS', 'apachebench' => 'ApacheBench', 'aix' => 'AIX', 'irix' => 'Irix', 'osf' => 'DEC OSF', 'hp-ux' => 'HP-UX', 'netbsd' => 'NetBSD', 'bsdi' => 'BSDi', 'openbsd' => 'OpenBSD', 'gnu' => 'GNU/Linux', 'unix' => 'Unknown Unix OS', 'symbian' => 'Symbian OS' ); // The order of this array should NOT be changed. Many browsers return // multiple browser types so we want to identify the sub-type first. $browsers = array( 'OPR' => 'Opera', 'Flock' => 'Flock', 'Edge' => 'Edge', 'Chrome' => 'Chrome', // Opera 10+ always reports Opera/9.80 and appends Version/ to the user agent string 'Opera.*?Version' => 'Opera', 'Opera' => 'Opera', 'MSIE' => 'Internet Explorer', 'Internet Explorer' => 'Internet Explorer', 'Trident.* rv' => 'Internet Explorer', 'Shiira' => 'Shiira', 'Firefox' => 'Firefox', 'Chimera' => 'Chimera', 'Phoenix' => 'Phoenix', 'Firebird' => 'Firebird', 'Camino' => 'Camino', 'Netscape' => 'Netscape', 'OmniWeb' => 'OmniWeb', 'Safari' => 'Safari', 'Mozilla' => 'Mozilla', 'Konqueror' => 'Konqueror', 'icab' => 'iCab', 'Lynx' => 'Lynx', 'Links' => 'Links', 'hotjava' => 'HotJava', 'amaya' => 'Amaya', 'IBrowse' => 'IBrowse', 'Maxthon' => 'Maxthon', 'Ubuntu' => 'Ubuntu Web Browser' ); $mobiles = array( // legacy array, old values commented out 'mobileexplorer' => 'Mobile Explorer', // 'openwave' => 'Open Wave', // 'opera mini' => 'Opera Mini', // 'operamini' => 'Opera Mini', // 'elaine' => 'Palm', 'palmsource' => 'Palm', // 'digital paths' => 'Palm', // 'avantgo' => 'Avantgo', // 'xiino' => 'Xiino', 'palmscape' => 'Palmscape', // 'nokia' => 'Nokia', // 'ericsson' => 'Ericsson', // 'blackberry' => 'BlackBerry', // 'motorola' => 'Motorola' // Phones and Manufacturers 'motorola' => 'Motorola', 'nokia' => 'Nokia', 'nexus' => 'Nexus', 'palm' => 'Palm', 'iphone' => 'Apple iPhone', 'ipad' => 'iPad', 'ipod' => 'Apple iPod Touch', 'sony' => 'Sony Ericsson', 'ericsson' => 'Sony Ericsson', 'blackberry' => 'BlackBerry', 'cocoon' => 'O2 Cocoon', 'blazer' => 'Treo', 'lg' => 'LG', 'amoi' => 'Amoi', 'xda' => 'XDA', 'mda' => 'MDA', 'vario' => 'Vario', 'htc' => 'HTC', 'samsung' => 'Samsung', 'sharp' => 'Sharp', 'sie-' => 'Siemens', 'alcatel' => 'Alcatel', 'benq' => 'BenQ', 'ipaq' => 'HP iPaq', 'mot-' => 'Motorola', 'playstation portable' => 'PlayStation Portable', 'playstation 3' => 'PlayStation 3', 'playstation vita' => 'PlayStation Vita', 'hiptop' => 'Danger Hiptop', 'nec-' => 'NEC', 'panasonic' => 'Panasonic', 'philips' => 'Philips', 'sagem' => 'Sagem', 'sanyo' => 'Sanyo', 'spv' => 'SPV', 'zte' => 'ZTE', 'sendo' => 'Sendo', 'nintendo dsi' => 'Nintendo DSi', 'nintendo ds' => 'Nintendo DS', 'nintendo 3ds' => 'Nintendo 3DS', 'wii' => 'Nintendo Wii', 'open web' => 'Open Web', 'openweb' => 'OpenWeb', 'meizu' => 'Meizu', 'huawei' => 'Huawei', 'xiaomi' => 'Xiaomi', 'oppo' => 'Oppo', 'vivo' => 'Vivo', 'infinix' => 'Infinix', // Operating Systems 'android' => 'Android', 'symbian' => 'Symbian', 'SymbianOS' => 'SymbianOS', 'elaine' => 'Palm', 'series60' => 'Symbian S60', 'windows ce' => 'Windows CE', // Browsers 'obigo' => 'Obigo', 'netfront' => 'Netfront Browser', 'openwave' => 'Openwave Browser', 'mobilexplorer' => 'Mobile Explorer', 'operamini' => 'Opera Mini', 'opera mini' => 'Opera Mini', 'opera mobi' => 'Opera Mobile', 'fennec' => 'Firefox Mobile', // Other 'digital paths' => 'Digital Paths', 'avantgo' => 'AvantGo', 'xiino' => 'Xiino', 'novarra' => 'Novarra Transcoder', 'vodafone' => 'Vodafone', 'docomo' => 'NTT DoCoMo', 'o2' => 'O2', // Fallback 'mobile' => 'Generic Mobile', 'wireless' => 'Generic Mobile', 'j2me' => 'Generic Mobile', 'midp' => 'Generic Mobile', 'cldc' => 'Generic Mobile', 'up.link' => 'Generic Mobile', 'up.browser' => 'Generic Mobile', 'smartphone' => 'Generic Mobile', 'cellphone' => 'Generic Mobile' ); // There are hundreds of bots but these are the most common. $robots = array( 'googlebot' => 'Googlebot', 'msnbot' => 'MSNBot', 'baiduspider' => 'Baiduspider', 'bingbot' => 'Bing', 'slurp' => 'Inktomi Slurp', 'yahoo' => 'Yahoo', 'ask jeeves' => 'Ask Jeeves', 'fastcrawler' => 'FastCrawler', 'infoseek' => 'InfoSeek Robot 1.0', 'lycos' => 'Lycos', 'yandex' => 'YandexBot', 'mediapartners-google' => 'MediaPartners Google', 'CRAZYWEBCRAWLER' => 'Crazy Webcrawler', 'adsbot-google' => 'AdsBot Google', 'feedfetcher-google' => 'Feedfetcher Google', 'curious george' => 'Curious George', 'ia_archiver' => 'Alexa Crawler', 'MJ12bot' => 'Majestic-12', 'Uptimebot' => 'Uptimebot', 'UptimeRobot' => 'UptimeRobot' ); PK!Mm m smileys.phpnu[ array('grin.gif', '19', '19', 'grin'), ':lol:' => array('lol.gif', '19', '19', 'LOL'), ':cheese:' => array('cheese.gif', '19', '19', 'cheese'), ':)' => array('smile.gif', '19', '19', 'smile'), ';-)' => array('wink.gif', '19', '19', 'wink'), ';)' => array('wink.gif', '19', '19', 'wink'), ':smirk:' => array('smirk.gif', '19', '19', 'smirk'), ':roll:' => array('rolleyes.gif', '19', '19', 'rolleyes'), ':-S' => array('confused.gif', '19', '19', 'confused'), ':wow:' => array('surprise.gif', '19', '19', 'surprised'), ':bug:' => array('bigsurprise.gif', '19', '19', 'big surprise'), ':-P' => array('tongue_laugh.gif', '19', '19', 'tongue laugh'), '%-P' => array('tongue_rolleye.gif', '19', '19', 'tongue rolleye'), ';-P' => array('tongue_wink.gif', '19', '19', 'tongue wink'), ':P' => array('raspberry.gif', '19', '19', 'raspberry'), ':blank:' => array('blank.gif', '19', '19', 'blank stare'), ':long:' => array('longface.gif', '19', '19', 'long face'), ':ohh:' => array('ohh.gif', '19', '19', 'ohh'), ':grrr:' => array('grrr.gif', '19', '19', 'grrr'), ':gulp:' => array('gulp.gif', '19', '19', 'gulp'), '8-/' => array('ohoh.gif', '19', '19', 'oh oh'), ':down:' => array('downer.gif', '19', '19', 'downer'), ':red:' => array('embarrassed.gif', '19', '19', 'red face'), ':sick:' => array('sick.gif', '19', '19', 'sick'), ':shut:' => array('shuteye.gif', '19', '19', 'shut eye'), ':-/' => array('hmm.gif', '19', '19', 'hmmm'), '>:(' => array('mad.gif', '19', '19', 'mad'), ':mad:' => array('mad.gif', '19', '19', 'mad'), '>:-(' => array('angry.gif', '19', '19', 'angry'), ':angry:' => array('angry.gif', '19', '19', 'angry'), ':zip:' => array('zip.gif', '19', '19', 'zipper'), ':kiss:' => array('kiss.gif', '19', '19', 'kiss'), ':ahhh:' => array('shock.gif', '19', '19', 'shock'), ':coolsmile:' => array('shade_smile.gif', '19', '19', 'cool smile'), ':coolsmirk:' => array('shade_smirk.gif', '19', '19', 'cool smirk'), ':coolgrin:' => array('shade_grin.gif', '19', '19', 'cool grin'), ':coolhmm:' => array('shade_hmm.gif', '19', '19', 'cool hmm'), ':coolmad:' => array('shade_mad.gif', '19', '19', 'cool mad'), ':coolcheese:' => array('shade_cheese.gif', '19', '19', 'cool cheese'), ':vampire:' => array('vampire.gif', '19', '19', 'vampire'), ':snake:' => array('snake.gif', '19', '19', 'snake'), ':exclaim:' => array('exclaim.gif', '19', '19', 'exclaim'), ':question:' => array('question.gif', '19', '19', 'question') ); PK!Ӽ database.phpnu[db->last_query() and profiling of DB queries. | When you run a query, with this setting set to TRUE (default), | CodeIgniter will store the SQL statement for debugging purposes. | However, this may cause high memory usage, especially if you run | a lot of SQL queries ... disable this to avoid that problem. | | The $active_group variable lets you choose which connection group to | make active. By default there is only one group (the 'default' group). | | The $query_builder variables lets you determine whether or not to load | the query builder class. */ $active_group = 'default'; $query_builder = TRUE; $db['default'] = array( 'dsn' => '', 'hostname' => 'localhost', 'username' => 'afelisqd_afel', 'password' => '@afelinfo123', 'database' => 'afelisqd_wh', 'dbdriver' => 'mysqli', 'dbprefix' => '', 'pconnect' => FALSE, 'db_debug' => (ENVIRONMENT !== 'production'), 'cache_on' => FALSE, 'cachedir' => '', 'char_set' => 'utf8', 'dbcollat' => 'utf8_general_ci', 'swap_pre' => '', 'encrypt' => FALSE, 'compress' => FALSE, 'stricton' => FALSE, 'failover' => array(), 'save_queries' => TRUE ); PK!$t constants.phpnu[ array( 'hostname' => '127.0.0.1', 'port' => '11211', 'weight' => '1', ), ); PK!( index.htmlnu[ 403 Forbidden

Directory access is forbidden.

PK!cconfFooter.phpnu[ '; echo GUI::footer(); PK!_,- confMgr.phpnu[GetDispInfo(); $page = DPageDef::GetInstance()->GetPageDef($disp->_type, $disp->_pid); $confErr = NULL; $pageData = $confCenter->GetPageData($disp, $confErr); require_once('confHeader.php'); if ( $confErr == NULL ) { $page->PrintHtml($pageData, $disp); } else { echo '
' . $confErr . '
'; } require_once('confFooter.php'); PK!|'confHeader.phpnu[_serv->_id}: $page->_title") . GUI::top_menu() . GUI::left_menu(); $buf .= '
'; // to avoid warning, put in echo if(strlen($disp->_titleLabel)) { $buf .= '

'.$disp->_titleLabel . '

'."\n"; } $buf .= '
    '; $uri = $disp->_ctrlUrl . 'm=' . urlencode($disp->_mid) . '&p='; foreach ( $disp->_tabs as $pid => $tabName ) { $on = ''; if ( $page->_id == $pid ){ $on = 'class="on"'; } $buf .= "
  • {$tabName}
  • "; } $buf .= '
'; echo $buf; PK![ mh-linuxnu[## -*-makefile-*- ## Copyright (C) 2016 and later: Unicode, Inc. and others. ## License & terms of use: http://www.unicode.org/copyright.html ## Linux-specific setup ## Copyright (c) 1999-2013, International Business Machines Corporation and ## others. All Rights Reserved. ## Commands to generate dependency files GEN_DEPS.c= $(CC) -E -MM $(DEFS) $(CPPFLAGS) GEN_DEPS.cc= $(CXX) -E -MM $(DEFS) $(CPPFLAGS) $(CXXFLAGS) ## Flags for position independent code SHAREDLIBCFLAGS = -fPIC SHAREDLIBCXXFLAGS = -fPIC SHAREDLIBCPPFLAGS = -DPIC ## Additional flags when building libraries and with threads THREADSCPPFLAGS = -D_REENTRANT LIBCPPFLAGS = ## Compiler switch to embed a runtime search path LD_RPATH= -Wl,-zorigin,-rpath,'$$'ORIGIN LD_RPATH_PRE = -Wl,-rpath, ## These are the library specific LDFLAGS LDFLAGSICUDT=-nodefaultlibs -nostdlib ## Compiler switch to embed a library name # The initial tab in the next line is to prevent icu-config from reading it. LD_SONAME = -Wl,-soname -Wl,$(notdir $(MIDDLE_SO_TARGET)) #SH# # We can't depend on MIDDLE_SO_TARGET being set. #SH# LD_SONAME= ## Shared library options LD_SOOPTIONS= -Wl,-Bsymbolic ## Shared object suffix SO = so ## Non-shared intermediate object suffix STATIC_O = ao ## Compilation rules %.$(STATIC_O): $(srcdir)/%.c $(call SILENT_COMPILE,$(strip $(COMPILE.c) $(STATICCPPFLAGS) $(STATICCFLAGS)) -o $@ $<) %.o: $(srcdir)/%.c $(call SILENT_COMPILE,$(strip $(COMPILE.c) $(DYNAMICCPPFLAGS) $(DYNAMICCFLAGS)) -o $@ $<) %.$(STATIC_O): $(srcdir)/%.cpp $(call SILENT_COMPILE,$(strip $(COMPILE.cc) $(STATICCPPFLAGS) $(STATICCXXFLAGS)) -o $@ $<) %.o: $(srcdir)/%.cpp $(call SILENT_COMPILE,$(strip $(COMPILE.cc) $(DYNAMICCPPFLAGS) $(DYNAMICCXXFLAGS)) -o $@ $<) ## Dependency rules %.d: $(srcdir)/%.c $(call ICU_MSG,(deps)) $< @$(SHELL) -ec '$(GEN_DEPS.c) $< \ | sed '\''s%\($*\)\.o[ :]*%\1.o $@ : %g'\'' > $@; \ [ -s $@ ] || rm -f $@' %.d: $(srcdir)/%.cpp $(call ICU_MSG,(deps)) $< @$(SHELL) -ec '$(GEN_DEPS.cc) $< \ | sed '\''s%\($*\)\.o[ :]*%\1.o $@ : %g'\'' > $@; \ [ -s $@ ] || rm -f $@' ## Versioned libraries rules %.$(SO).$(SO_TARGET_VERSION_MAJOR): %.$(SO).$(SO_TARGET_VERSION) $(RM) $@ && ln -s ${ [ // App\Console\Commands\ExampleCommand::class, ], /* |-------------------------------------------------------------------------- | Alias Blacklist |-------------------------------------------------------------------------- | | Typically, Tinker automatically aliases classes as you require them in | Tinker. However, you may wish to never alias certain classes, which | you may accomplish by listing the classes in the following array. | */ 'dont_alias' => [ 'App\Nova', ], ]; PK!Em0-0-type-ghostscript.mgknu[ PK!AVVtype.mgknu[ PK!Y mtype-solaris.mgknu[ PK!`==type-windows.mgknu[ PK!1 delegates.mgknu[ PK!yuWbreadcrumbs.phpnu[/'; $config['tag_open'] = ''; $config['crumb_open'] = '
  • '; $config['crumb_last_open'] = '
  • '; $config['crumb_close'] = '
  • '; /* End of file breadcrumbs.php */ /* Location: ./application/config/breadcrumbs.php */PK!؃utrustedproxy.phpnuIw null, // [,], '*', ',' /* * To trust one or more specific proxies that connect * directly to your server, use an array or a string separated by comma of IP addresses: */ // 'proxies' => ['192.168.1.1'], // 'proxies' => '192.168.1.1, 192.168.1.2', /* * Or, to trust all proxies that connect * directly to your server, use a "*" */ // 'proxies' => '*', /* * Which headers to use to detect proxy related data (For, Host, Proto, Port) * * Options include: * * - Illuminate\Http\Request::HEADER_X_FORWARDED_ALL (use all x-forwarded-* headers to establish trust) * - Illuminate\Http\Request::HEADER_FORWARDED (use the FORWARDED header to establish trust) * - Illuminate\Http\Request::HEADER_X_FORWARDED_AWS_ELB (If you are using AWS Elastic Load Balancer) * * - 'HEADER_X_FORWARDED_ALL' (use all x-forwarded-* headers to establish trust) * - 'HEADER_FORWARDED' (use the FORWARDED header to establish trust) * - 'HEADER_X_FORWARDED_AWS_ELB' (If you are using AWS Elastic Load Balancer) * * @link https://symfony.com/doc/current/deployment/proxies.html */ 'headers' => Illuminate\Http\Request::HEADER_X_FORWARDED_ALL, ]; PK! set-credentials-by-uri.jsnu[var assert = require('assert') var toNerfDart = require('./nerf-dart.js') module.exports = setCredentialsByURI function setCredentialsByURI (uri, c) { assert(uri && typeof uri === 'string', 'registry URL is required') assert(c && typeof c === 'object', 'credentials are required') var nerfed = toNerfDart(uri) if (c.token) { this.set(nerfed + ':_authToken', c.token, 'user') this.del(nerfed + ':_password', 'user') this.del(nerfed + ':username', 'user') this.del(nerfed + ':email', 'user') this.del(nerfed + ':always-auth', 'user') } else if (c.username || c.password || c.email) { assert(c.username, 'must include username') assert(c.password, 'must include password') assert(c.email, 'must include email address') this.del(nerfed + ':_authToken', 'user') var encoded = Buffer.from(c.password, 'utf8').toString('base64') this.set(nerfed + ':_password', encoded, 'user') this.set(nerfed + ':username', c.username, 'user') this.set(nerfed + ':email', c.email, 'user') if (c.alwaysAuth !== undefined) { this.set(nerfed + ':always-auth', c.alwaysAuth, 'user') } else { this.del(nerfed + ':always-auth', 'user') } } else { throw new Error('No credentials to set.') } } PK!QkIload-cafile.jsnu[module.exports = loadCAFile var fs = require('fs') function loadCAFile (cafilePath, cb) { if (!cafilePath) return process.nextTick(cb) fs.readFile(cafilePath, 'utf8', afterCARead.bind(this)) function afterCARead (er, cadata) { if (er) { // previous cafile no longer exists, so just continue on gracefully if (er.code === 'ENOENT') return cb() return cb(er) } var delim = '-----END CERTIFICATE-----' var output output = cadata .split(delim) .filter(function (xs) { return !!xs.trim() }) .map(function (xs) { return xs.trimLeft() + delim }) this.set('ca', output) cb(null) } } PK!p`clear-credentials-by-uri.jsnu[var assert = require('assert') var toNerfDart = require('./nerf-dart.js') module.exports = clearCredentialsByURI function clearCredentialsByURI (uri) { assert(uri && typeof uri === 'string', 'registry URL is required') var nerfed = toNerfDart(uri) this.del(nerfed + ':_authToken', 'user') this.del(nerfed + ':_password', 'user') this.del(nerfed + ':username', 'user') this.del(nerfed + ':email', 'user') } PK!ר gentle-fs.jsnu['use strict' const npm = require('../npm.js') const log = require('npmlog') module.exports = gentleFSOpts function gentleFSOpts (gently, base, abs) { return { // never rm the root, prefix, or bin dirs // // globals included because of `npm link` -- as far as the package // requesting the link is concerned, the linked package is always // installed globally prefixes: [ npm.prefix, npm.globalPrefix, npm.dir, npm.root, npm.globalDir, npm.bin, npm.globalBin ], absolute: abs, log: log, prefix: npm.prefix, force: npm.config.get('force'), gently: gently, base: base, name: 'npm' } } PK!Wh]; ; figgy-config.jsnu['use strict' const BB = require('bluebird') const crypto = require('crypto') const figgyPudding = require('figgy-pudding') const log = require('npmlog') const npm = require('../npm.js') const pack = require('../pack.js') const path = require('path') const npmSession = npm.session = crypto.randomBytes(8).toString('hex') log.verbose('npm-session', npmSession) const SCOPE_REGISTRY_REGEX = /@.*:registry$/gi const NpmConfig = figgyPudding({}, { other (key) { return key.match(SCOPE_REGISTRY_REGEX) } }) let baseConfig module.exports = mkConfig function mkConfig (...providers) { if (!baseConfig) { baseConfig = NpmConfig(npm.config, { // Add some non-npm-config opts by hand. cache: path.join(npm.config.get('cache'), '_cacache'), // NOTE: npm has some magic logic around color distinct from the config // value, so we have to override it here color: !!npm.color, dirPacker: pack.packGitDep, hashAlgorithm: 'sha1', includeDeprecated: false, log, 'npm-session': npmSession, 'project-scope': npm.projectScope, refer: npm.referer, dmode: npm.modes.exec, fmode: npm.modes.file, umask: npm.modes.umask, npmVersion: npm.version, tmp: npm.tmp, Promise: BB }) const ownerStats = calculateOwner() if (ownerStats.uid != null || ownerStats.gid != null) { baseConfig = baseConfig.concat(ownerStats) } } let conf = baseConfig.concat(...providers) // Adapt some other configs if missing if (npm.config.get('prefer-online') === undefined) { conf = conf.concat({ 'prefer-online': npm.config.get('cache-max') <= 0 }) } if (npm.config.get('prefer-online') === undefined) { conf = conf.concat({ 'prefer-online': npm.config.get('cache-min') >= 9999 }) } return conf } let effectiveOwner function calculateOwner () { if (!effectiveOwner) { effectiveOwner = { uid: 0, gid: 0 } // Pretty much only on windows if (!process.getuid) { return effectiveOwner } effectiveOwner.uid = +process.getuid() effectiveOwner.gid = +process.getgid() if (effectiveOwner.uid === 0) { if (process.env.SUDO_UID) effectiveOwner.uid = +process.env.SUDO_UID if (process.env.SUDO_GID) effectiveOwner.gid = +process.env.SUDO_GID } } return effectiveOwner } PK!1 cmd-list.jsnu[// short names for common things var shorthands = { 'un': 'uninstall', 'rb': 'rebuild', 'list': 'ls', 'ln': 'link', 'create': 'init', 'i': 'install', 'it': 'install-test', 'cit': 'install-ci-test', 'up': 'update', 'c': 'config', 's': 'search', 'se': 'search', 'unstar': 'star', // same function 'tst': 'test', 't': 'test', 'ddp': 'dedupe', 'v': 'view', 'run': 'run-script', 'clean-install': 'ci', 'clean-install-test': 'cit' } var affordances = { 'la': 'ls', 'll': 'ls', 'verison': 'version', 'ic': 'ci', 'innit': 'init', 'isntall': 'install', 'install-clean': 'ci', 'isntall-clean': 'ci', 'dist-tags': 'dist-tag', 'apihelp': 'help', 'find-dupes': 'dedupe', 'upgrade': 'update', 'udpate': 'update', 'login': 'adduser', 'add-user': 'adduser', 'author': 'owner', 'home': 'docs', 'issues': 'bugs', 'info': 'view', 'show': 'view', 'find': 'search', 'add': 'install', 'unlink': 'uninstall', 'remove': 'uninstall', 'rm': 'uninstall', 'r': 'uninstall', 'rum': 'run-script', 'sit': 'cit', 'urn': 'run-script', 'ogr': 'org' } // these are filenames in . var cmdList = [ 'ci', 'install-ci-test', 'install', 'install-test', 'uninstall', 'cache', 'config', 'set', 'get', 'update', 'outdated', 'prune', 'pack', 'dedupe', 'hook', 'rebuild', 'link', 'publish', 'star', 'stars', 'adduser', 'login', // This is an alias for `adduser` but it can be confusing 'logout', 'unpublish', 'owner', 'access', 'team', 'deprecate', 'shrinkwrap', 'token', 'profile', 'audit', 'fund', 'org', 'help', 'help-search', 'ls', 'search', 'view', 'init', 'version', 'edit', 'explore', 'docs', 'repo', 'bugs', 'root', 'prefix', 'bin', 'whoami', 'dist-tag', 'ping', 'test', 'stop', 'start', 'restart', 'run-script', 'completion', 'doctor' ] var plumbing = [ 'build', 'unbuild', 'xmas', 'substack', 'visnup' ] module.exports.aliases = Object.assign({}, shorthands, affordances) module.exports.shorthands = shorthands module.exports.affordances = affordances module.exports.cmdList = cmdList module.exports.plumbing = plumbing PK!sN՗++core.jsnu[var CC = require('config-chain').ConfigChain var inherits = require('inherits') var configDefs = require('./defaults.js') var types = configDefs.types var once = require('once') var fs = require('fs') var path = require('path') var nopt = require('nopt') var ini = require('ini') var Umask = configDefs.Umask var mkdirp = require('gentle-fs').mkdir var umask = require('../utils/umask') var isWindows = require('../utils/is-windows.js') exports.load = load exports.Conf = Conf exports.loaded = false exports.rootConf = null exports.usingBuiltin = false exports.defs = configDefs Object.defineProperty(exports, 'defaults', { get: function () { return configDefs.defaults }, enumerable: true }) Object.defineProperty(exports, 'types', { get: function () { return configDefs.types }, enumerable: true }) exports.validate = validate var myUid = process.getuid && process.getuid() var myGid = process.getgid && process.getgid() var loading = false var loadCbs = [] function load () { var cli, builtin, cb for (var i = 0; i < arguments.length; i++) { switch (typeof arguments[i]) { case 'string': builtin = arguments[i]; break case 'object': cli = arguments[i]; break case 'function': cb = arguments[i]; break } } if (!cb) cb = function () {} if (exports.loaded) { var ret = exports.loaded if (cli) { ret = new Conf(ret) ret.unshift(cli) } return process.nextTick(cb.bind(null, null, ret)) } // either a fresh object, or a clone of the passed in obj if (!cli) { cli = {} } else { cli = Object.keys(cli).reduce(function (c, k) { c[k] = cli[k] return c }, {}) } loadCbs.push(cb) if (loading) return loading = true cb = once(function (er, conf) { if (!er) { exports.loaded = conf loading = false } loadCbs.forEach(function (fn) { fn(er, conf) }) loadCbs.length = 0 }) // check for a builtin if provided. exports.usingBuiltin = !!builtin var rc = exports.rootConf = new Conf() if (builtin) { rc.addFile(builtin, 'builtin') } else { rc.add({}, 'builtin') } rc.on('load', function () { load_(builtin, rc, cli, cb) }) rc.on('error', cb) } function load_ (builtin, rc, cli, cb) { var defaults = configDefs.defaults var conf = new Conf(rc) conf.usingBuiltin = !!builtin conf.add(cli, 'cli') conf.addEnv() conf.loadPrefix(function (er) { if (er) return cb(er) // If you're doing `npm --userconfig=~/foo.npmrc` then you'd expect // that ~/.npmrc won't override the stuff in ~/foo.npmrc (or, indeed // be used at all). // // However, if the cwd is ~, then ~/.npmrc is the home for the project // config, and will override the userconfig. // // If you're not setting the userconfig explicitly, then it will be loaded // twice, which is harmless but excessive. If you *are* setting the // userconfig explicitly then it will override your explicit intent, and // that IS harmful and unexpected. // // Solution: Do not load project config file that is the same as either // the default or resolved userconfig value. npm will log a "verbose" // message about this when it happens, but it is a rare enough edge case // that we don't have to be super concerned about it. var projectConf = path.resolve(conf.localPrefix, '.npmrc') var defaultUserConfig = rc.get('userconfig') var resolvedUserConfig = conf.get('userconfig') if (!conf.get('global') && projectConf !== defaultUserConfig && projectConf !== resolvedUserConfig) { conf.addFile(projectConf, 'project') conf.once('load', afterPrefix) } else { conf.add({}, 'project') afterPrefix() } }) function afterPrefix () { conf.addFile(conf.get('userconfig'), 'user') conf.once('error', cb) conf.once('load', afterUser) } function afterUser () { // globalconfig and globalignorefile defaults // need to respond to the 'prefix' setting up to this point. // Eg, `npm config get globalconfig --prefix ~/local` should // return `~/local/etc/npmrc` // annoying humans and their expectations! if (conf.get('prefix')) { var etc = path.resolve(conf.get('prefix'), 'etc') defaults.globalconfig = path.resolve(etc, 'npmrc') defaults.globalignorefile = path.resolve(etc, 'npmignore') } conf.addFile(conf.get('globalconfig'), 'global') // move the builtin into the conf stack now. conf.root = defaults conf.add(rc.shift(), 'builtin') conf.once('load', function () { conf.loadExtras(afterExtras) }) } function afterExtras (er) { if (er) return cb(er) // warn about invalid bits. validate(conf) var cafile = conf.get('cafile') if (cafile) { return conf.loadCAFile(cafile, finalize) } finalize() } function finalize (er) { if (er) { return cb(er) } exports.loaded = conf cb(er, conf) } } // Basically the same as CC, but: // 1. Always ini // 2. Parses environment variable names in field values // 3. Field values that start with ~/ are replaced with process.env.HOME // 4. Can inherit from another Conf object, using it as the base. inherits(Conf, CC) function Conf (base) { if (!(this instanceof Conf)) return new Conf(base) CC.call(this) if (base) { if (base instanceof Conf) { this.root = base.list[0] || base.root } else { this.root = base } } else { this.root = configDefs.defaults } } Conf.prototype.loadPrefix = require('./load-prefix.js') Conf.prototype.loadCAFile = require('./load-cafile.js') Conf.prototype.setUser = require('./set-user.js') Conf.prototype.getCredentialsByURI = require('./get-credentials-by-uri.js') Conf.prototype.setCredentialsByURI = require('./set-credentials-by-uri.js') Conf.prototype.clearCredentialsByURI = require('./clear-credentials-by-uri.js') Conf.prototype.loadExtras = function (cb) { this.setUser(function (er) { if (er) return cb(er) // Without prefix, nothing will ever work mkdirp(this.prefix, cb) }.bind(this)) } Conf.prototype.save = function (where, cb) { var target = this.sources[where] if (!target || !(target.path || target.source) || !target.data) { var er if (where !== 'builtin') er = new Error('bad save target: ' + where) if (cb) { process.nextTick(cb.bind(null, er)) return this } return this.emit('error', er) } if (target.source) { var pref = target.prefix || '' Object.keys(target.data).forEach(function (k) { target.source[pref + k] = target.data[k] }) if (cb) process.nextTick(cb) return this } var data = ini.stringify(target.data) var then = function then (er) { if (er) return done(er) fs.chmod(target.path, mode, done) } var done = function done (er) { if (er) { if (cb) return cb(er) else return this.emit('error', er) } this._saving-- if (this._saving === 0) { if (cb) cb() this.emit('save') } } then = then.bind(this) done = done.bind(this) this._saving++ var mode = where === 'user' ? '0600' : '0666' if (!data.trim()) { fs.unlink(target.path, function () { // ignore the possible error (e.g. the file doesn't exist) done(null) }) } else { // we don't have to use inferOwner here, because gentle-fs will // mkdir with the correctly inferred ownership. Just preserve it. const dir = path.dirname(target.path) mkdirp(dir, function (er) { if (er) return then(er) fs.stat(dir, (er, st) => { if (er) return then(er) fs.writeFile(target.path, data, 'utf8', function (er) { if (er) return then(er) if (myUid === 0 && (myUid !== st.uid || myGid !== st.gid)) { fs.chown(target.path, st.uid, st.gid, then) } else { then() } }) }) }) } return this } Conf.prototype.addFile = function (file, name) { name = name || file var marker = { __source__: name } this.sources[name] = { path: file, type: 'ini' } this.push(marker) this._await() fs.readFile(file, 'utf8', function (er, data) { // just ignore missing files. if (er) return this.add({}, marker) this.addString(data, file, 'ini', marker) }.bind(this)) return this } // always ini files. Conf.prototype.parse = function (content, file) { return CC.prototype.parse.call(this, content, file, 'ini') } Conf.prototype.add = function (data, marker) { try { Object.keys(data).forEach(function (k) { const newKey = envReplace(k) const newField = parseField(data[k], newKey) delete data[k] data[newKey] = newField }) } catch (e) { this.emit('error', e) return this } return CC.prototype.add.call(this, data, marker) } Conf.prototype.addEnv = function (env) { env = env || process.env var conf = {} Object.keys(env) .filter(function (k) { return k.match(/^npm_config_/i) }) .forEach(function (k) { if (!env[k]) return // leave first char untouched, even if // it is a '_' - convert all other to '-' var p = k.toLowerCase() .replace(/^npm_config_/, '') .replace(/(?!^)_/g, '-') conf[p] = env[k] }) return CC.prototype.addEnv.call(this, '', conf, 'env') } function parseField (f, k) { if (typeof f !== 'string' && !(f instanceof String)) return f // type can be an array or single thing. var typeList = [].concat(types[k]) var isPath = typeList.indexOf(path) !== -1 var isBool = typeList.indexOf(Boolean) !== -1 var isString = typeList.indexOf(String) !== -1 var isUmask = typeList.indexOf(Umask) !== -1 var isNumber = typeList.indexOf(Number) !== -1 f = ('' + f).trim() if (f.match(/^".*"$/)) { try { f = JSON.parse(f) } catch (e) { throw new Error('Failed parsing JSON config key ' + k + ': ' + f) } } if (isBool && !isString && f === '') return true switch (f) { case 'true': return true case 'false': return false case 'null': return null case 'undefined': return undefined } f = envReplace(f) if (isPath) { var homePattern = isWindows ? /^~(\/|\\)/ : /^~\// if (f.match(homePattern) && process.env.HOME) { f = path.resolve(process.env.HOME, f.substr(2)) } f = path.resolve(f) } if (isUmask) f = umask.fromString(f) if (isNumber && !isNaN(f)) f = +f return f } function envReplace (f) { if (typeof f !== 'string' || !f) return f // replace any ${ENV} values with the appropriate environ. var envExpr = /(\\*)\$\{([^}]+)\}/g return f.replace(envExpr, function (orig, esc, name) { esc = esc.length && esc.length % 2 if (esc) return orig if (undefined === process.env[name]) { throw new Error('Failed to replace env in config: ' + orig) } return process.env[name] }) } function validate (cl) { // warn about invalid configs at every level. cl.list.forEach(function (conf) { nopt.clean(conf, configDefs.types) }) nopt.clean(cl.root, configDefs.types) } PK!H33load-prefix.jsnu[module.exports = loadPrefix var findPrefix = require('find-npm-prefix') var path = require('path') function loadPrefix (cb) { var cli = this.list[0] Object.defineProperty(this, 'prefix', { set: function (prefix) { var g = this.get('global') this[g ? 'globalPrefix' : 'localPrefix'] = prefix }.bind(this), get: function () { var g = this.get('global') return g ? this.globalPrefix : this.localPrefix }.bind(this), enumerable: true }) Object.defineProperty(this, 'globalPrefix', { set: function (prefix) { this.set('prefix', prefix) }.bind(this), get: function () { return path.resolve(this.get('prefix')) }.bind(this), enumerable: true }) var p Object.defineProperty(this, 'localPrefix', { set: function (prefix) { p = prefix }, get: function () { return p }, enumerable: true }) // try to guess at a good node_modules location. // If we are *explicitly* given a prefix on the cli, then // always use that. otherwise, infer local prefix from cwd. if (Object.prototype.hasOwnProperty.call(cli, 'prefix')) { p = path.resolve(cli.prefix) process.nextTick(cb) } else { findPrefix(process.cwd()).then((found) => { p = found cb() }, cb) } } PK!  nerf-dart.jsnu[var url = require('url') module.exports = toNerfDart /** * Maps a URL to an identifier. * * Name courtesy schiffertronix media LLC, a New Jersey corporation * * @param {String} uri The URL to be nerfed. * * @returns {String} A nerfed URL. */ function toNerfDart (uri) { var parsed = url.parse(uri) delete parsed.protocol delete parsed.auth delete parsed.query delete parsed.search delete parsed.hash return url.resolve(url.format(parsed), '.') } PK! SS lifecycle.jsnu['use strict' const npm = require('../npm.js') const log = require('npmlog') module.exports = lifecycleOpts let opts function lifecycleOpts (moreOpts) { if (!opts) { opts = { config: npm.config.snapshot, dir: npm.dir, failOk: false, force: npm.config.get('force'), group: npm.config.get('group'), ignorePrepublish: npm.config.get('ignore-prepublish'), ignoreScripts: npm.config.get('ignore-scripts'), log: log, nodeOptions: npm.config.get('node-options'), production: npm.config.get('production'), scriptShell: npm.config.get('script-shell'), scriptsPrependNodePath: npm.config.get('scripts-prepend-node-path'), unsafePerm: npm.config.get('unsafe-perm'), user: npm.config.get('user') } } return moreOpts ? Object.assign({}, opts, moreOpts) : opts } PK!i׮ set-user.jsnu[module.exports = setUser var assert = require('assert') var path = require('path') var fs = require('fs') var mkdirp = require('gentle-fs').mkdir function setUser (cb) { var defaultConf = this.root assert(defaultConf !== Object.prototype) // If global, leave it as-is. // If not global, then set the user to the owner of the prefix folder. // Just set the default, so it can be overridden. if (this.get('global')) return cb() if (process.env.SUDO_UID) { defaultConf.user = +(process.env.SUDO_UID) return cb() } var prefix = path.resolve(this.get('prefix')) mkdirp(prefix, function (er) { if (er) return cb(er) fs.stat(prefix, function (er, st) { defaultConf.user = st && st.uid return cb(er) }) }) } PK!d-- defaults.jsnu[// defaults, types, and shorthands. var path = require('path') var url = require('url') var Stream = require('stream').Stream var semver = require('semver') var stableFamily = semver.parse(process.version) var nopt = require('nopt') var os = require('os') var osenv = require('osenv') var umask = require('../utils/umask') var hasUnicode = require('has-unicode') var log try { log = require('npmlog') } catch (er) { var util = require('util') log = { warn: function (m) { console.warn(m + ' ' + util.format.apply(util, [].slice.call(arguments, 1))) } } } exports.Umask = Umask function Umask () {} function validateUmask (data, k, val) { return umask.validate(data, k, val) } function validateSemver (data, k, val) { if (!semver.valid(val)) return false data[k] = semver.valid(val) } function validateStream (data, k, val) { if (!(val instanceof Stream)) return false data[k] = val } nopt.typeDefs.semver = { type: semver, validate: validateSemver } nopt.typeDefs.Stream = { type: Stream, validate: validateStream } nopt.typeDefs.Umask = { type: Umask, validate: validateUmask } nopt.invalidHandler = function (k, val, type) { log.warn('invalid config', k + '=' + JSON.stringify(val)) if (Array.isArray(type)) { if (type.indexOf(url) !== -1) type = url else if (type.indexOf(path) !== -1) type = path } switch (type) { case Umask: log.warn('invalid config', 'Must be umask, octal number in range 0000..0777') break case url: log.warn('invalid config', "Must be a full url with 'http://'") break case path: log.warn('invalid config', 'Must be a valid filesystem path') break case Number: log.warn('invalid config', 'Must be a numeric value') break case Stream: log.warn('invalid config', 'Must be an instance of the Stream class') break } } if (!stableFamily || (+stableFamily.minor % 2)) stableFamily = null else stableFamily = stableFamily.major + '.' + stableFamily.minor var defaults var temp = osenv.tmpdir() var home = osenv.home() var uidOrPid = process.getuid ? process.getuid() : process.pid if (home) process.env.HOME = home else home = path.resolve(temp, 'npm-' + uidOrPid) var cacheExtra = process.platform === 'win32' ? 'npm-cache' : '.npm' var cacheRoot = (process.platform === 'win32' && process.env.APPDATA) || home var cache = path.resolve(cacheRoot, cacheExtra) var globalPrefix Object.defineProperty(exports, 'defaults', {get: function () { if (defaults) return defaults if (process.env.PREFIX) { globalPrefix = process.env.PREFIX } else if (process.platform === 'win32') { // c:\node\node.exe --> prefix=c:\node\ globalPrefix = path.dirname(process.execPath) } else { // /usr/local/bin/node --> prefix=/usr/local globalPrefix = path.dirname(path.dirname(process.execPath)) // destdir only is respected on Unix if (process.env.DESTDIR) { globalPrefix = path.join(process.env.DESTDIR, globalPrefix) } } defaults = { access: null, 'allow-same-version': false, 'always-auth': false, also: null, audit: true, 'audit-level': 'low', 'auth-type': 'legacy', 'before': null, 'bin-links': true, browser: null, ca: null, cafile: null, cache: cache, 'cache-lock-stale': 60000, 'cache-lock-retries': 10, 'cache-lock-wait': 10000, 'cache-max': Infinity, 'cache-min': 10, cert: null, cidr: null, color: process.env.NO_COLOR == null, depth: Infinity, description: true, dev: false, 'dry-run': false, editor: osenv.editor(), 'engine-strict': false, force: false, 'format-package-lock': true, fund: true, 'fetch-retries': 2, 'fetch-retry-factor': 10, 'fetch-retry-mintimeout': 10000, 'fetch-retry-maxtimeout': 60000, git: 'git', 'git-tag-version': true, 'commit-hooks': true, global: false, globalconfig: path.resolve(globalPrefix, 'etc', 'npmrc'), 'global-style': false, group: process.platform === 'win32' ? 0 : process.env.SUDO_GID || (process.getgid && process.getgid()), 'ham-it-up': false, heading: 'npm', 'if-present': false, 'ignore-prepublish': false, 'ignore-scripts': false, 'init-module': path.resolve(home, '.npm-init.js'), 'init-author-name': '', 'init-author-email': '', 'init-author-url': '', 'init-version': '1.0.0', 'init-license': 'ISC', json: false, key: null, 'legacy-bundling': false, link: false, 'local-address': undefined, loglevel: 'notice', logstream: process.stderr, 'logs-max': 10, long: false, maxsockets: 50, message: '%s', 'metrics-registry': null, 'node-options': null, 'node-version': process.version, 'offline': false, 'onload-script': false, only: null, optional: true, otp: null, 'package-lock': true, 'package-lock-only': false, parseable: false, 'prefer-offline': false, 'prefer-online': false, prefix: globalPrefix, preid: '', production: process.env.NODE_ENV === 'production', 'progress': !process.env.TRAVIS && !process.env.CI, proxy: null, 'https-proxy': null, 'noproxy': null, 'user-agent': 'npm/{npm-version} ' + 'node/{node-version} ' + '{platform} ' + '{arch} ' + '{ci}', 'read-only': false, 'rebuild-bundle': true, registry: 'https://registry.npmjs.org/', rollback: true, save: true, 'save-bundle': false, 'save-dev': false, 'save-exact': false, 'save-optional': false, 'save-prefix': '^', 'save-prod': false, scope: '', 'script-shell': null, 'scripts-prepend-node-path': 'warn-only', searchopts: '', searchexclude: null, searchlimit: 20, searchstaleness: 15 * 60, 'send-metrics': false, shell: osenv.shell(), shrinkwrap: true, 'sign-git-commit': false, 'sign-git-tag': false, 'sso-poll-frequency': 500, 'sso-type': 'oauth', 'strict-ssl': true, tag: 'latest', 'tag-version-prefix': 'v', timing: false, tmp: temp, unicode: hasUnicode(), 'unsafe-perm': process.platform === 'win32' || process.platform === 'cygwin' || !(process.getuid && process.setuid && process.getgid && process.setgid) || process.getuid() !== 0, 'update-notifier': true, usage: false, user: (process.platform === 'win32' || os.type() === 'OS400') ? 0 : 'nobody', userconfig: path.resolve(home, '.npmrc'), umask: process.umask ? process.umask() : umask.fromString('022'), version: false, versions: false, viewer: process.platform === 'win32' ? 'browser' : 'man', _exit: true } return defaults }}) exports.types = { access: [null, 'restricted', 'public'], 'allow-same-version': Boolean, 'always-auth': Boolean, also: [null, 'dev', 'development'], audit: Boolean, 'audit-level': ['low', 'moderate', 'high', 'critical'], 'auth-type': ['legacy', 'sso', 'saml', 'oauth'], 'before': [null, Date], 'bin-links': Boolean, browser: [null, String], ca: [null, String, Array], cafile: path, cache: path, 'cache-lock-stale': Number, 'cache-lock-retries': Number, 'cache-lock-wait': Number, 'cache-max': Number, 'cache-min': Number, cert: [null, String], cidr: [null, String, Array], color: ['always', Boolean], depth: Number, description: Boolean, dev: Boolean, 'dry-run': Boolean, editor: String, 'engine-strict': Boolean, force: Boolean, fund: Boolean, 'format-package-lock': Boolean, 'fetch-retries': Number, 'fetch-retry-factor': Number, 'fetch-retry-mintimeout': Number, 'fetch-retry-maxtimeout': Number, git: String, 'git-tag-version': Boolean, 'commit-hooks': Boolean, global: Boolean, globalconfig: path, 'global-style': Boolean, group: [Number, String], 'https-proxy': [null, url], 'user-agent': String, 'ham-it-up': Boolean, 'heading': String, 'if-present': Boolean, 'ignore-prepublish': Boolean, 'ignore-scripts': Boolean, 'init-module': path, 'init-author-name': String, 'init-author-email': String, 'init-author-url': ['', url], 'init-license': String, 'init-version': semver, json: Boolean, key: [null, String], 'legacy-bundling': Boolean, link: Boolean, 'local-address': getLocalAddresses(), loglevel: ['silent', 'error', 'warn', 'notice', 'http', 'timing', 'info', 'verbose', 'silly'], logstream: Stream, 'logs-max': Number, long: Boolean, maxsockets: Number, message: String, 'metrics-registry': [null, String], 'node-options': [null, String], 'node-version': [null, semver], 'noproxy': [null, String, Array], offline: Boolean, 'onload-script': [null, String], only: [null, 'dev', 'development', 'prod', 'production'], optional: Boolean, 'package-lock': Boolean, otp: [null, String], 'package-lock-only': Boolean, parseable: Boolean, 'prefer-offline': Boolean, 'prefer-online': Boolean, prefix: path, preid: String, production: Boolean, progress: Boolean, proxy: [null, false, url], // allow proxy to be disabled explicitly 'read-only': Boolean, 'rebuild-bundle': Boolean, registry: [null, url], rollback: Boolean, save: Boolean, 'save-bundle': Boolean, 'save-dev': Boolean, 'save-exact': Boolean, 'save-optional': Boolean, 'save-prefix': String, 'save-prod': Boolean, scope: String, 'script-shell': [null, String], 'scripts-prepend-node-path': [false, true, 'auto', 'warn-only'], searchopts: String, searchexclude: [null, String], searchlimit: Number, searchstaleness: Number, 'send-metrics': Boolean, shell: String, shrinkwrap: Boolean, 'sign-git-commit': Boolean, 'sign-git-tag': Boolean, 'sso-poll-frequency': Number, 'sso-type': [null, 'oauth', 'saml'], 'strict-ssl': Boolean, tag: String, timing: Boolean, tmp: path, unicode: Boolean, 'unsafe-perm': Boolean, 'update-notifier': Boolean, usage: Boolean, user: [Number, String], userconfig: path, umask: Umask, version: Boolean, 'tag-version-prefix': String, versions: Boolean, viewer: String, _exit: Boolean } function getLocalAddresses () { var interfaces // #8094: some environments require elevated permissions to enumerate // interfaces, and synchronously throw EPERM when run without // elevated privileges try { interfaces = os.networkInterfaces() } catch (e) { interfaces = {} } return Object.keys(interfaces).map( nic => interfaces[nic].map(({address}) => address) ).reduce((curr, next) => curr.concat(next), []).concat(undefined) } exports.shorthands = { before: ['--enjoy-by'], s: ['--loglevel', 'silent'], d: ['--loglevel', 'info'], dd: ['--loglevel', 'verbose'], ddd: ['--loglevel', 'silly'], noreg: ['--no-registry'], N: ['--no-registry'], reg: ['--registry'], 'no-reg': ['--no-registry'], silent: ['--loglevel', 'silent'], verbose: ['--loglevel', 'verbose'], quiet: ['--loglevel', 'warn'], q: ['--loglevel', 'warn'], h: ['--usage'], H: ['--usage'], '?': ['--usage'], help: ['--usage'], v: ['--version'], f: ['--force'], desc: ['--description'], 'no-desc': ['--no-description'], 'local': ['--no-global'], l: ['--long'], m: ['--message'], p: ['--parseable'], porcelain: ['--parseable'], readonly: ['--read-only'], g: ['--global'], S: ['--save'], D: ['--save-dev'], E: ['--save-exact'], O: ['--save-optional'], P: ['--save-prod'], y: ['--yes'], n: ['--no-yes'], B: ['--save-bundle'], C: ['--prefix'] } PK!M=get-credentials-by-uri.jsnu[var assert = require('assert') var toNerfDart = require('./nerf-dart.js') module.exports = getCredentialsByURI function getCredentialsByURI (uri) { assert(uri && typeof uri === 'string', 'registry URL is required') var nerfed = toNerfDart(uri) var defnerf = toNerfDart(this.get('registry')) // hidden class micro-optimization var c = { scope: nerfed, token: undefined, password: undefined, username: undefined, email: undefined, auth: undefined, alwaysAuth: undefined } // used to override scope matching for tokens as well as legacy auth if (this.get(nerfed + ':always-auth') !== undefined) { var val = this.get(nerfed + ':always-auth') c.alwaysAuth = val === 'false' ? false : !!val } else if (this.get('always-auth') !== undefined) { c.alwaysAuth = this.get('always-auth') } if (this.get(nerfed + ':_authToken')) { c.token = this.get(nerfed + ':_authToken') // the bearer token is enough, don't confuse things return c } if (this.get(nerfed + ':-authtoken')) { c.token = this.get(nerfed + ':-authtoken') // the bearer token is enough, don't confuse things return c } // Handle the old-style _auth= style for the default // registry, if set. var authDef = this.get('_auth') var userDef = this.get('username') var passDef = this.get('_password') if (authDef && !(userDef && passDef)) { authDef = Buffer.from(authDef, 'base64').toString() authDef = authDef.split(':') userDef = authDef.shift() passDef = authDef.join(':') } if (this.get(nerfed + ':_password')) { c.password = Buffer.from(this.get(nerfed + ':_password'), 'base64').toString('utf8') } else if (nerfed === defnerf && passDef) { c.password = passDef } if (this.get(nerfed + ':username')) { c.username = this.get(nerfed + ':username') } else if (nerfed === defnerf && userDef) { c.username = userDef } if (this.get(nerfed + ':email')) { c.email = this.get(nerfed + ':email') } else if (this.get('email')) { c.email = this.get('email') } if (c.username && c.password) { c.auth = Buffer.from(c.username + ':' + c.password).toString('base64') } return c } PK!S bin-links.jsnu['use strict' const npm = require('../npm.js') var packageId = require('../utils/package-id.js') const log = require('npmlog') module.exports = binLinksOpts function binLinksOpts (pkg) { return { ignoreScripts: npm.config.get('ignore-scripts'), force: npm.config.get('force'), globalBin: npm.globalBin, globalDir: npm.globalDir, json: npm.config.get('json'), log: log, name: 'npm', parseable: npm.config.get('parseable'), pkgId: packageId(pkg), prefix: npm.config.get('prefix'), prefixes: [ npm.prefix, npm.globalPrefix, npm.dir, npm.root, npm.globalDir, npm.bin, npm.globalBin ], umask: npm.config.get('umask') } } PK!h0 __init__.pynu["""For backward compatibility, expose main functions from ``setuptools.config.setupcfg`` """ from functools import wraps from typing import Callable, TypeVar, cast from ..warnings import SetuptoolsDeprecationWarning from . import setupcfg Fn = TypeVar("Fn", bound=Callable) __all__ = ('parse_configuration', 'read_configuration') def _deprecation_notice(fn: Fn) -> Fn: @wraps(fn) def _wrapper(*args, **kwargs): SetuptoolsDeprecationWarning.emit( "Deprecated API usage.", f""" As setuptools moves its configuration towards `pyproject.toml`, `{__name__}.{fn.__name__}` became deprecated. For the time being, you can use the `{setupcfg.__name__}` module to access a backward compatible API, but this module is provisional and might be removed in the future. To read project metadata, consider using ``build.util.project_wheel_metadata`` (https://pypi.org/project/build/). For simple scenarios, you can also try parsing the file directly with the help of ``configparser``. """, # due_date not defined yet, because the community still heavily relies on it # Warning introduced in 24 Mar 2022 ) return fn(*args, **kwargs) return cast(Fn, _wrapper) read_configuration = _deprecation_notice(setupcfg.read_configuration) parse_configuration = _deprecation_notice(setupcfg.parse_configuration) PK!;  dbus.pynu[# -*- coding: utf-8 -*- # # Copyright (C) 2011,2016 Red Hat, Inc. # # Authors: # Thomas Woerner # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # DBUS_INTERFACE_VERSION = 1 DBUS_INTERFACE_REVISION = 15 DBUS_INTERFACE = "org.fedoraproject.FirewallD%d" % DBUS_INTERFACE_VERSION DBUS_INTERFACE_ZONE = DBUS_INTERFACE+".zone" DBUS_INTERFACE_POLICY = DBUS_INTERFACE+".policy" DBUS_INTERFACE_DIRECT = DBUS_INTERFACE+".direct" DBUS_INTERFACE_POLICIES = DBUS_INTERFACE+".policies" DBUS_INTERFACE_IPSET = DBUS_INTERFACE+".ipset" DBUS_INTERFACE_CONFIG = DBUS_INTERFACE+".config" DBUS_INTERFACE_CONFIG_ZONE = DBUS_INTERFACE_CONFIG+".zone" DBUS_INTERFACE_CONFIG_POLICY = DBUS_INTERFACE_CONFIG+".policy" DBUS_INTERFACE_CONFIG_SERVICE = DBUS_INTERFACE_CONFIG+".service" DBUS_INTERFACE_CONFIG_ICMPTYPE = DBUS_INTERFACE_CONFIG+".icmptype" DBUS_INTERFACE_CONFIG_POLICIES = DBUS_INTERFACE_CONFIG+".policies" DBUS_INTERFACE_CONFIG_DIRECT = DBUS_INTERFACE_CONFIG+".direct" DBUS_INTERFACE_CONFIG_IPSET = DBUS_INTERFACE_CONFIG+".ipset" DBUS_INTERFACE_CONFIG_HELPER = DBUS_INTERFACE_CONFIG+".helper" DBUS_PATH = "/org/fedoraproject/FirewallD%d" % DBUS_INTERFACE_VERSION DBUS_PATH_CONFIG = DBUS_PATH+"/config" DBUS_PATH_CONFIG_ICMPTYPE = DBUS_PATH+"/config/icmptype" DBUS_PATH_CONFIG_SERVICE = DBUS_PATH+"/config/service" DBUS_PATH_CONFIG_ZONE = DBUS_PATH+"/config/zone" DBUS_PATH_CONFIG_POLICY = DBUS_PATH+"/config/policy" DBUS_PATH_CONFIG_IPSET = DBUS_PATH+"/config/ipset" DBUS_PATH_CONFIG_HELPER = DBUS_PATH+"/config/helper" # Polkit actions _PK_ACTION = "org.fedoraproject.FirewallD%d" % DBUS_INTERFACE_VERSION PK_ACTION_POLICIES = _PK_ACTION+".policies" PK_ACTION_POLICIES_INFO = PK_ACTION_POLICIES+".info" PK_ACTION_CONFIG = _PK_ACTION+".config" PK_ACTION_CONFIG_INFO = PK_ACTION_CONFIG+".info" PK_ACTION_DIRECT = _PK_ACTION+".direct" PK_ACTION_DIRECT_INFO = PK_ACTION_DIRECT+".info" PK_ACTION_INFO = _PK_ACTION+".info" PK_ACTION_ALL = _PK_ACTION+".all" # implies all other actions PK!Aw%__pycache__/dbus.cpython-36.opt-1.pycnu[3 Yj @s dZdZdeZedZedZedZedZedZedZedZ edZ ed Z ed Z edZ edZedZed Zd eZed ZedZedZedZedZedZedZdeZedZedZedZedZedZedZedZ edZ!dS)zorg.fedoraproject.FirewallD%dz.zonez.policyz.directz .policiesz.ipsetz.configz.servicez .icmptypez.helperz/org/fedoraproject/FirewallD%dz/configz/config/icmptypez/config/servicez /config/zonez/config/policyz /config/ipsetz/config/helperz.infoz.allN)"ZDBUS_INTERFACE_VERSIONZDBUS_INTERFACE_REVISIONZDBUS_INTERFACEZDBUS_INTERFACE_ZONEZDBUS_INTERFACE_POLICYZDBUS_INTERFACE_DIRECTZDBUS_INTERFACE_POLICIESZDBUS_INTERFACE_IPSETZDBUS_INTERFACE_CONFIGZDBUS_INTERFACE_CONFIG_ZONEZDBUS_INTERFACE_CONFIG_POLICYZDBUS_INTERFACE_CONFIG_SERVICEZDBUS_INTERFACE_CONFIG_ICMPTYPEZDBUS_INTERFACE_CONFIG_POLICIESZDBUS_INTERFACE_CONFIG_DIRECTZDBUS_INTERFACE_CONFIG_IPSETZDBUS_INTERFACE_CONFIG_HELPERZ DBUS_PATHZDBUS_PATH_CONFIGZDBUS_PATH_CONFIG_ICMPTYPEZDBUS_PATH_CONFIG_SERVICEZDBUS_PATH_CONFIG_ZONEZDBUS_PATH_CONFIG_POLICYZDBUS_PATH_CONFIG_IPSETZDBUS_PATH_CONFIG_HELPERZ _PK_ACTIONZPK_ACTION_POLICIESZPK_ACTION_POLICIES_INFOZPK_ACTION_CONFIGZPK_ACTION_CONFIG_INFOZPK_ACTION_DIRECTZPK_ACTION_DIRECT_INFOZPK_ACTION_INFOZ PK_ACTION_ALLrr/usr/lib/python3.6/dbus.pysBPK!w#__pycache__/__init__.cpython-36.pycnu[3 Yj@sfddlmZddlZyejejdWn6ejk r\ddlZdejd<ejejdYnXdZddl Z e j eddd l m Z dZ d Zd Zd e Zed ZdZdZdddgZe j dZdZddZedddZeddZdZdZdZdZd Zd!d"d#d$d%d&d'd(d)d* Zd+d,d-d.d/gZ d0d1d2gZ!d3d4gZ"d5Z#d6Z$d7Z%d7Z&d8Z'd7Z(d8Z)d/Z*d1Z+d3Z,d7Z-d7Z.d7Z/dS)9)absolute_importNCLC_ALLZ firewalld)Zdomain)dbuszfirewall-configzfirewall-appletz /usr/share/z.gladez(C) 2010-2017 Red Hat, Inc.z0.9.11z$Thomas Woerner z"Jiri Popelka zEric Garver acThis program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see .zhttp://www.firewalld.orgcCsP|a|da|da|da|da|da|da|da|da|d a dS) Nz/firewalld.confz/zonesz /servicesz /icmptypesz/ipsetsz/helpersz /policiesz /direct.xmlz/lockdown-whitelist.xml) Z ETC_FIREWALLDZFIREWALLD_CONFZETC_FIREWALLD_ZONESZETC_FIREWALLD_SERVICESZETC_FIREWALLD_ICMPTYPESZETC_FIREWALLD_IPSETSZETC_FIREWALLD_HELPERSZETC_FIREWALLD_POLICIESZFIREWALLD_DIRECTZLOCKDOWN_WHITELIST)pathr /usr/lib/python3.6/__init__.pyset_system_config_pathsBsr z/etc/firewalldcCs8|a|da|da|da|da|da|dadS)Nz/zonesz /servicesz /icmptypesz/ipsetsz/helpersz /policies)ZUSR_LIB_FIREWALLDZFIREWALLD_ZONESZFIREWALLD_SERVICESZFIREWALLD_ICMPTYPESZFIREWALLD_IPSETSZFIREWALLD_HELPERSZFIREWALLD_POLICIES)rr r r set_default_config_pathsSsr z/usr/lib/firewalldz/var/log/firewalldz/var/run/firewalld.pidz/run/firewalldz/etc/sysconfigz/etc/sysconfig/network-scriptsz/etc/sysctl.confz/usr/sbin/iptablesz/usr/sbin/iptables-restorez/usr/sbin/ip6tablesz/usr/sbin/ip6tables-restorez/usr/sbin/ebtablesz/usr/sbin/ebtables-restorez/usr/sbin/ipsetz/sbin/modprobez /sbin/rmmod) Zipv4z ipv4-restoreZipv6z ipv6-restoreZebz eb-restoreZipsetZmodprobeZrmmodallZunicastZ broadcastZ multicastZoffyesnosystemZnftablesZiptablesZpublicdTF)0Z __future__rZlocale setlocalerErrorosenvironZDOMAINgettextZinstallrrZ DAEMON_NAMEZ CONFIG_NAMEZ APPLET_NAMEZDATADIRZCONFIG_GLADE_NAMEZ COPYRIGHTVERSIONZAUTHORSLICENSEZWEBSITEr r ZFIREWALLD_LOGFILEZFIREWALLD_PIDFILEZFIREWALLD_TEMPDIRZ SYSCONFIGDIRZIFCFGDIRZ SYSCTL_CONFIGZCOMMANDSZLOG_DENIED_VALUESZAUTOMATIC_HELPERS_VALUESZFIREWALL_BACKEND_VALUESZ FALLBACK_ZONEZFALLBACK_MINIMAL_MARKZFALLBACK_CLEANUP_ON_EXITZ FALLBACK_CLEANUP_MODULES_ON_EXITZFALLBACK_LOCKDOWNZFALLBACK_IPV6_RPFILTERZFALLBACK_INDIVIDUAL_CALLSZFALLBACK_LOG_DENIEDZFALLBACK_AUTOMATIC_HELPERSZFALLBACK_FIREWALL_BACKENDZFALLBACK_FLUSH_ALL_ON_RELOADZFALLBACK_RFC3964_IPV4ZFALLBACK_ALLOW_ZONE_DRIFTINGr r r r sv       PK!w)__pycache__/__init__.cpython-36.opt-1.pycnu[3 Yj@sfddlmZddlZyejejdWn6ejk r\ddlZdejd<ejejdYnXdZddl Z e j eddd l m Z dZ d Zd Zd e Zed ZdZdZdddgZe j dZdZddZedddZeddZdZdZdZdZd Zd!d"d#d$d%d&d'd(d)d* Zd+d,d-d.d/gZ d0d1d2gZ!d3d4gZ"d5Z#d6Z$d7Z%d7Z&d8Z'd7Z(d8Z)d/Z*d1Z+d3Z,d7Z-d7Z.d7Z/dS)9)absolute_importNCLC_ALLZ firewalld)Zdomain)dbuszfirewall-configzfirewall-appletz /usr/share/z.gladez(C) 2010-2017 Red Hat, Inc.z0.9.11z$Thomas Woerner z"Jiri Popelka zEric Garver acThis program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see .zhttp://www.firewalld.orgcCsP|a|da|da|da|da|da|da|da|da|d a dS) Nz/firewalld.confz/zonesz /servicesz /icmptypesz/ipsetsz/helpersz /policiesz /direct.xmlz/lockdown-whitelist.xml) Z ETC_FIREWALLDZFIREWALLD_CONFZETC_FIREWALLD_ZONESZETC_FIREWALLD_SERVICESZETC_FIREWALLD_ICMPTYPESZETC_FIREWALLD_IPSETSZETC_FIREWALLD_HELPERSZETC_FIREWALLD_POLICIESZFIREWALLD_DIRECTZLOCKDOWN_WHITELIST)pathr /usr/lib/python3.6/__init__.pyset_system_config_pathsBsr z/etc/firewalldcCs8|a|da|da|da|da|da|dadS)Nz/zonesz /servicesz /icmptypesz/ipsetsz/helpersz /policies)ZUSR_LIB_FIREWALLDZFIREWALLD_ZONESZFIREWALLD_SERVICESZFIREWALLD_ICMPTYPESZFIREWALLD_IPSETSZFIREWALLD_HELPERSZFIREWALLD_POLICIES)rr r r set_default_config_pathsSsr z/usr/lib/firewalldz/var/log/firewalldz/var/run/firewalld.pidz/run/firewalldz/etc/sysconfigz/etc/sysconfig/network-scriptsz/etc/sysctl.confz/usr/sbin/iptablesz/usr/sbin/iptables-restorez/usr/sbin/ip6tablesz/usr/sbin/ip6tables-restorez/usr/sbin/ebtablesz/usr/sbin/ebtables-restorez/usr/sbin/ipsetz/sbin/modprobez /sbin/rmmod) Zipv4z ipv4-restoreZipv6z ipv6-restoreZebz eb-restoreZipsetZmodprobeZrmmodallZunicastZ broadcastZ multicastZoffyesnosystemZnftablesZiptablesZpublicdTF)0Z __future__rZlocale setlocalerErrorosenvironZDOMAINgettextZinstallrrZ DAEMON_NAMEZ CONFIG_NAMEZ APPLET_NAMEZDATADIRZCONFIG_GLADE_NAMEZ COPYRIGHTVERSIONZAUTHORSLICENSEZWEBSITEr r ZFIREWALLD_LOGFILEZFIREWALLD_PIDFILEZFIREWALLD_TEMPDIRZ SYSCONFIGDIRZIFCFGDIRZ SYSCTL_CONFIGZCOMMANDSZLOG_DENIED_VALUESZAUTOMATIC_HELPERS_VALUESZFIREWALL_BACKEND_VALUESZ FALLBACK_ZONEZFALLBACK_MINIMAL_MARKZFALLBACK_CLEANUP_ON_EXITZ FALLBACK_CLEANUP_MODULES_ON_EXITZFALLBACK_LOCKDOWNZFALLBACK_IPV6_RPFILTERZFALLBACK_INDIVIDUAL_CALLSZFALLBACK_LOG_DENIEDZFALLBACK_AUTOMATIC_HELPERSZFALLBACK_FIREWALL_BACKENDZFALLBACK_FLUSH_ALL_ON_RELOADZFALLBACK_RFC3964_IPV4ZFALLBACK_ALLOW_ZONE_DRIFTINGr r r r sv       PK!Aw__pycache__/dbus.cpython-36.pycnu[3 Yj @s dZdZdeZedZedZedZedZedZedZedZ edZ ed Z ed Z edZ edZedZed Zd eZed ZedZedZedZedZedZedZdeZedZedZedZedZedZedZedZ edZ!dS)zorg.fedoraproject.FirewallD%dz.zonez.policyz.directz .policiesz.ipsetz.configz.servicez .icmptypez.helperz/org/fedoraproject/FirewallD%dz/configz/config/icmptypez/config/servicez /config/zonez/config/policyz /config/ipsetz/config/helperz.infoz.allN)"ZDBUS_INTERFACE_VERSIONZDBUS_INTERFACE_REVISIONZDBUS_INTERFACEZDBUS_INTERFACE_ZONEZDBUS_INTERFACE_POLICYZDBUS_INTERFACE_DIRECTZDBUS_INTERFACE_POLICIESZDBUS_INTERFACE_IPSETZDBUS_INTERFACE_CONFIGZDBUS_INTERFACE_CONFIG_ZONEZDBUS_INTERFACE_CONFIG_POLICYZDBUS_INTERFACE_CONFIG_SERVICEZDBUS_INTERFACE_CONFIG_ICMPTYPEZDBUS_INTERFACE_CONFIG_POLICIESZDBUS_INTERFACE_CONFIG_DIRECTZDBUS_INTERFACE_CONFIG_IPSETZDBUS_INTERFACE_CONFIG_HELPERZ DBUS_PATHZDBUS_PATH_CONFIGZDBUS_PATH_CONFIG_ICMPTYPEZDBUS_PATH_CONFIG_SERVICEZDBUS_PATH_CONFIG_ZONEZDBUS_PATH_CONFIG_POLICYZDBUS_PATH_CONFIG_IPSETZDBUS_PATH_CONFIG_HELPERZ _PK_ACTIONZPK_ACTION_POLICIESZPK_ACTION_POLICIES_INFOZPK_ACTION_CONFIGZPK_ACTION_CONFIG_INFOZPK_ACTION_DIRECTZPK_ACTION_DIRECT_INFOZPK_ACTION_INFOZ PK_ACTION_ALLrr/usr/lib/python3.6/dbus.pysBPK!dv  npm-config.jsnu['use strict' const BB = require('bluebird') const fs = require('fs') const figgyPudding = require('figgy-pudding') const ini = require('ini') const path = require('path') const spawn = require('child_process').spawn const readFileAsync = BB.promisify(fs.readFile) const NpmConfig = figgyPudding({ cache: { default: '' }, then: {}, userconfig: {} }) module.exports = NpmConfig module.exports.fromNpm = getNpmConfig function getNpmConfig (argv) { return new BB((resolve, reject) => { const npmBin = process.platform === 'win32' ? 'npm.cmd' : 'npm' const child = spawn(npmBin, [ 'config', 'ls', '--json', '-l' // We add argv here to get npm to parse those options for us :D ].concat(argv || []), { env: process.env, cwd: process.cwd(), stdio: [0, 'pipe', 2] }) let stdout = '' if (child.stdout) { child.stdout.on('data', (chunk) => { stdout += chunk }) } child.on('error', reject) child.on('close', (code) => { if (code === 127) { reject(new Error('`npm` command not found. Please ensure you have npm@5.4.0 or later installed.')) } else { try { resolve(JSON.parse(stdout)) } catch (e) { reject(new Error('`npm config ls --json` failed to output json. Please ensure you have npm@5.4.0 or later installed.')) } } }) }).then(opts => { return BB.all( process.cwd().split(path.sep).reduce((acc, next) => { acc.path = path.join(acc.path, next) acc.promises.push(maybeReadIni(path.join(acc.path, '.npmrc'))) acc.promises.push(maybeReadIni(path.join(acc.path, 'npmrc'))) return acc }, { path: '', promises: [] }).promises.concat( opts.userconfig ? maybeReadIni(opts.userconfig) : {} ) ).then(configs => NpmConfig(...configs, opts)) }).then(opts => { if (opts.cache) { return opts.concat({ cache: path.join(opts.cache, '_cacache') }) } else { return opts } }) } function maybeReadIni (f) { return readFileAsync(f, 'utf8').catch(err => { if (err.code === 'ENOENT') { return '' } else { throw err } }).then(ini.parse) } PK!T## hashing.phpnu[ 'bcrypt', /* |-------------------------------------------------------------------------- | Bcrypt Options |-------------------------------------------------------------------------- | | Here you may specify the configuration options that should be used when | passwords are hashed using the Bcrypt algorithm. This will allow you | to control the amount of time it takes to hash the given password. | */ 'bcrypt' => [ 'rounds' => env('BCRYPT_ROUNDS', 10), ], /* |-------------------------------------------------------------------------- | Argon Options |-------------------------------------------------------------------------- | | Here you may specify the configuration options that should be used when | passwords are hashed using the Argon algorithm. These will allow you | to control the amount of time it takes to hash the given password. | */ 'argon' => [ 'memory' => 1024, 'threads' => 2, 'time' => 2, ], ]; PK!\_ cache.phpnu[ env('CACHE_DRIVER', 'file'), /* |-------------------------------------------------------------------------- | Cache Stores |-------------------------------------------------------------------------- | | Here you may define all of the cache "stores" for your application as | well as their drivers. You may even define multiple stores for the | same cache driver to group types of items stored in your caches. | */ 'stores' => [ 'apc' => [ 'driver' => 'apc', ], 'array' => [ 'driver' => 'array', ], 'database' => [ 'driver' => 'database', 'table' => 'cache', 'connection' => null, ], 'file' => [ 'driver' => 'file', 'path' => storage_path('framework/cache/data'), ], 'memcached' => [ 'driver' => 'memcached', 'persistent_id' => env('MEMCACHED_PERSISTENT_ID'), 'sasl' => [ env('MEMCACHED_USERNAME'), env('MEMCACHED_PASSWORD'), ], 'options' => [ // Memcached::OPT_CONNECT_TIMEOUT => 2000, ], 'servers' => [ [ 'host' => env('MEMCACHED_HOST', '127.0.0.1'), 'port' => env('MEMCACHED_PORT', 11211), 'weight' => 100, ], ], ], 'redis' => [ 'driver' => 'redis', 'connection' => 'cache', ], 'dynamodb' => [ 'driver' => 'dynamodb', 'key' => env('AWS_ACCESS_KEY_ID'), 'secret' => env('AWS_SECRET_ACCESS_KEY'), 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), 'table' => env('DYNAMODB_CACHE_TABLE', 'cache'), 'endpoint' => env('DYNAMODB_ENDPOINT'), ], ], /* |-------------------------------------------------------------------------- | Cache Key Prefix |-------------------------------------------------------------------------- | | When utilizing a RAM based store such as APC or Memcached, there might | be other applications utilizing the same cache. So, we'll specify a | value to get prefixed to all our keys so we can avoid collisions. | */ 'prefix' => env('CACHE_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_cache'), ]; PK!-:: session.phpnu[ env('SESSION_DRIVER', 'file'), /* |-------------------------------------------------------------------------- | Session Lifetime |-------------------------------------------------------------------------- | | Here you may specify the number of minutes that you wish the session | to be allowed to remain idle before it expires. If you want them | to immediately expire on the browser closing, set that option. | */ 'lifetime' => env('SESSION_LIFETIME', 120), 'expire_on_close' => true, /* |-------------------------------------------------------------------------- | Session Encryption |-------------------------------------------------------------------------- | | This option allows you to easily specify that all of your session data | should be encrypted before it is stored. All encryption will be run | automatically by Laravel and you can use the Session like normal. | */ 'encrypt' => true, /* |-------------------------------------------------------------------------- | Session File Location |-------------------------------------------------------------------------- | | When using the native session driver, we need a location where session | files may be stored. A default has been set for you but a different | location may be specified. This is only needed for file sessions. | */ 'files' => storage_path('framework/sessions'), /* |-------------------------------------------------------------------------- | Session Database Connection |-------------------------------------------------------------------------- | | When using the "database" or "redis" session drivers, you may specify a | connection that should be used to manage these sessions. This should | correspond to a connection in your database configuration options. | */ 'connection' => env('SESSION_CONNECTION', null), /* |-------------------------------------------------------------------------- | Session Database Table |-------------------------------------------------------------------------- | | When using the "database" session driver, you may specify the table we | should use to manage the sessions. Of course, a sensible default is | provided for you; however, you are free to change this as needed. | */ 'table' => 'sessions', /* |-------------------------------------------------------------------------- | Session Cache Store |-------------------------------------------------------------------------- | | When using the "apc", "memcached", or "dynamodb" session drivers you may | list a cache store that should be used for these sessions. This value | must match with one of the application's configured cache "stores". | */ 'store' => env('SESSION_STORE', null), /* |-------------------------------------------------------------------------- | Session Sweeping Lottery |-------------------------------------------------------------------------- | | Some session drivers must manually sweep their storage location to get | rid of old sessions from storage. Here are the chances that it will | happen on a given request. By default, the odds are 2 out of 100. | */ 'lottery' => [2, 100], /* |-------------------------------------------------------------------------- | Session Cookie Name |-------------------------------------------------------------------------- | | Here you may change the name of the cookie used to identify a session | instance by ID. The name specified here will get used every time a | new session cookie is created by the framework for every driver. | */ 'cookie' => env( 'SESSION_COOKIE', Str::slug(env('APP_NAME', 'laravel'), '_').'_session' ), /* |-------------------------------------------------------------------------- | Session Cookie Path |-------------------------------------------------------------------------- | | The session cookie path determines the path for which the cookie will | be regarded as available. Typically, this will be the root path of | your application but you are free to change this when necessary. | */ 'path' => '/', /* |-------------------------------------------------------------------------- | Session Cookie Domain |-------------------------------------------------------------------------- | | Here you may change the domain of the cookie used to identify a session | in your application. This will determine which domains the cookie is | available to in your application. A sensible default has been set. | */ 'domain' => env('SESSION_DOMAIN', null), /* |-------------------------------------------------------------------------- | HTTPS Only Cookies |-------------------------------------------------------------------------- | | By setting this option to true, session cookies will only be sent back | to the server if the browser has a HTTPS connection. This will keep | the cookie from being sent to you if it can not be done securely. | */ 'secure' => env('SESSION_SECURE_COOKIE', false), /* |-------------------------------------------------------------------------- | HTTP Access Only |-------------------------------------------------------------------------- | | Setting this value to true will prevent JavaScript from accessing the | value of the cookie and the cookie will only be accessible through | the HTTP protocol. You are free to modify this option if needed. | */ 'http_only' => true, /* |-------------------------------------------------------------------------- | Same-Site Cookies |-------------------------------------------------------------------------- | | This option determines how your cookies behave when cross-site requests | take place, and can be used to mitigate CSRF attacks. By default, we | do not enable this as other CSRF protection services are in place. | | Supported: "lax", "strict" | */ 'same_site' => null, ]; PK!3Ϲ$$app.phpnu[ env('APP_NAME', 'Laravel'), /* |-------------------------------------------------------------------------- | Application Environment |-------------------------------------------------------------------------- | | This value determines the "environment" your application is currently | running in. This may determine how you prefer to configure various | services the application utilizes. Set this in your ".env" file. | */ 'env' => env('APP_ENV', 'production'), /* |-------------------------------------------------------------------------- | Application Debug Mode |-------------------------------------------------------------------------- | | When your application is in debug mode, detailed error messages with | stack traces will be shown on every error that occurs within your | application. If disabled, a simple generic error page is shown. | */ 'debug' => env('APP_DEBUG', false), /* |-------------------------------------------------------------------------- | Application URL |-------------------------------------------------------------------------- | | This URL is used by the console to properly generate URLs when using | the Artisan command line tool. You should set this to the root of | your application so that it is used when running Artisan tasks. | */ 'url' => env('APP_URL', 'http://localhost'), 'asset_url' => env('ASSET_URL', null), /* |-------------------------------------------------------------------------- | Application Timezone |-------------------------------------------------------------------------- | | Here you may specify the default timezone for your application, which | will be used by the PHP date and date-time functions. We have gone | ahead and set this to a sensible default for you out of the box. | */ 'timezone' => 'UTC', /* |-------------------------------------------------------------------------- | Application Locale Configuration |-------------------------------------------------------------------------- | | The application locale determines the default locale that will be used | by the translation service provider. You are free to set this value | to any of the locales which will be supported by the application. | */ 'locale' => 'en', /* |-------------------------------------------------------------------------- | Application Fallback Locale |-------------------------------------------------------------------------- | | The fallback locale determines the locale to use when the current one | is not available. You may change the value to correspond to any of | the language folders that are provided through your application. | */ 'fallback_locale' => 'en', /* |-------------------------------------------------------------------------- | Faker Locale |-------------------------------------------------------------------------- | | This locale will be used by the Faker PHP library when generating fake | data for your database seeds. For example, this will be used to get | localized telephone numbers, street address information and more. | */ 'faker_locale' => 'en_US', /* |-------------------------------------------------------------------------- | Encryption Key |-------------------------------------------------------------------------- | | This key is used by the Illuminate encrypter service and should be set | to a random, 32 character string, otherwise these encrypted strings | will not be safe. Please do this before deploying an application! | */ 'key' => env('APP_KEY'), 'cipher' => 'AES-256-CBC', /* |-------------------------------------------------------------------------- | Autoloaded Service Providers |-------------------------------------------------------------------------- | | The service providers listed here will be automatically loaded on the | request to your application. Feel free to add your own services to | this array to grant expanded functionality to your applications. | */ 'providers' => [ /* * Laravel Framework Service Providers... */ Illuminate\Auth\AuthServiceProvider::class, Illuminate\Broadcasting\BroadcastServiceProvider::class, Illuminate\Bus\BusServiceProvider::class, Illuminate\Cache\CacheServiceProvider::class, Illuminate\Foundation\Providers\ConsoleSupportServiceProvider::class, Illuminate\Cookie\CookieServiceProvider::class, Illuminate\Database\DatabaseServiceProvider::class, Illuminate\Encryption\EncryptionServiceProvider::class, Illuminate\Filesystem\FilesystemServiceProvider::class, Illuminate\Foundation\Providers\FoundationServiceProvider::class, Illuminate\Hashing\HashServiceProvider::class, Illuminate\Mail\MailServiceProvider::class, Illuminate\Notifications\NotificationServiceProvider::class, Illuminate\Pagination\PaginationServiceProvider::class, Illuminate\Pipeline\PipelineServiceProvider::class, Illuminate\Queue\QueueServiceProvider::class, Illuminate\Redis\RedisServiceProvider::class, Illuminate\Auth\Passwords\PasswordResetServiceProvider::class, Illuminate\Session\SessionServiceProvider::class, Illuminate\Translation\TranslationServiceProvider::class, Illuminate\Validation\ValidationServiceProvider::class, Illuminate\View\ViewServiceProvider::class, /* * Package Service Providers... */ /* * Application Service Providers... */ App\Providers\AppServiceProvider::class, App\Providers\AuthServiceProvider::class, // App\Providers\BroadcastServiceProvider::class, App\Providers\EventServiceProvider::class, App\Providers\RouteServiceProvider::class, ## This is for PHPExcel //App\Library\PHPExcel::class, // Maatwebsite\Excel\ExcelServiceProvider::class, ], /* |-------------------------------------------------------------------------- | Class Aliases |-------------------------------------------------------------------------- | | This array of class aliases will be registered when this application | is started. However, feel free to register as many as you wish as | the aliases are "lazy" loaded so they don't hinder performance. | */ 'aliases' => [ 'App' => Illuminate\Support\Facades\App::class, 'Arr' => Illuminate\Support\Arr::class, 'Artisan' => Illuminate\Support\Facades\Artisan::class, 'Auth' => Illuminate\Support\Facades\Auth::class, 'Blade' => Illuminate\Support\Facades\Blade::class, 'Broadcast' => Illuminate\Support\Facades\Broadcast::class, 'Bus' => Illuminate\Support\Facades\Bus::class, 'Cache' => Illuminate\Support\Facades\Cache::class, 'Config' => Illuminate\Support\Facades\Config::class, 'Cookie' => Illuminate\Support\Facades\Cookie::class, 'Crypt' => Illuminate\Support\Facades\Crypt::class, 'DB' => Illuminate\Support\Facades\DB::class, 'Eloquent' => Illuminate\Database\Eloquent\Model::class, 'Event' => Illuminate\Support\Facades\Event::class, 'File' => Illuminate\Support\Facades\File::class, 'Gate' => Illuminate\Support\Facades\Gate::class, 'Hash' => Illuminate\Support\Facades\Hash::class, 'Lang' => Illuminate\Support\Facades\Lang::class, 'Log' => Illuminate\Support\Facades\Log::class, 'Mail' => Illuminate\Support\Facades\Mail::class, 'Notification' => Illuminate\Support\Facades\Notification::class, 'Password' => Illuminate\Support\Facades\Password::class, 'Queue' => Illuminate\Support\Facades\Queue::class, 'Redirect' => Illuminate\Support\Facades\Redirect::class, 'Redis' => Illuminate\Support\Facades\Redis::class, 'Request' => Illuminate\Support\Facades\Request::class, 'Response' => Illuminate\Support\Facades\Response::class, 'Route' => Illuminate\Support\Facades\Route::class, 'Schema' => Illuminate\Support\Facades\Schema::class, 'Session' => Illuminate\Support\Facades\Session::class, 'Storage' => Illuminate\Support\Facades\Storage::class, 'Str' => Illuminate\Support\Str::class, 'URL' => Illuminate\Support\Facades\URL::class, 'Validator' => Illuminate\Support\Facades\Validator::class, 'View' => Illuminate\Support\Facades\View::class, 'Excel' => app\Http\Controllers\Classes\PHPExcel\Excel::class, ], ]; PK!yAAbroadcasting.phpnu[ env('BROADCAST_DRIVER', 'null'), /* |-------------------------------------------------------------------------- | Broadcast Connections |-------------------------------------------------------------------------- | | Here you may define all of the broadcast connections that will be used | to broadcast events to other systems or over websockets. Samples of | each available type of connection are provided inside this array. | */ 'connections' => [ 'pusher' => [ 'driver' => 'pusher', 'key' => env('PUSHER_APP_KEY'), 'secret' => env('PUSHER_APP_SECRET'), 'app_id' => env('PUSHER_APP_ID'), 'options' => [ 'cluster' => env('PUSHER_APP_CLUSTER'), 'useTLS' => true, ], ], 'redis' => [ 'driver' => 'redis', 'connection' => 'default', ], 'log' => [ 'driver' => 'log', ], 'null' => [ 'driver' => 'null', ], ], ]; PK!view.phpnu[ [ resource_path('views'), ], /* |-------------------------------------------------------------------------- | Compiled View Path |-------------------------------------------------------------------------- | | This option determines where all the compiled Blade templates will be | stored for your application. Typically, this is within the storage | directory. However, as usual, you are free to change this value. | */ 'compiled' => env( 'VIEW_COMPILED_PATH', realpath(storage_path('framework/views')) ), ]; PK! logging.phpnu[ env('LOG_CHANNEL', 'stack'), /* |-------------------------------------------------------------------------- | Log Channels |-------------------------------------------------------------------------- | | Here you may configure the log channels for your application. Out of | the box, Laravel uses the Monolog PHP logging library. This gives | you a variety of powerful log handlers / formatters to utilize. | | Available Drivers: "single", "daily", "slack", "syslog", | "errorlog", "monolog", | "custom", "stack" | */ 'channels' => [ 'stack' => [ 'driver' => 'stack', 'channels' => ['daily'], 'ignore_exceptions' => false, ], 'single' => [ 'driver' => 'single', 'path' => storage_path('logs/laravel.log'), 'level' => 'debug', ], 'daily' => [ 'driver' => 'daily', 'path' => storage_path('logs/laravel.log'), 'level' => 'debug', 'days' => 14, ], 'slack' => [ 'driver' => 'slack', 'url' => env('LOG_SLACK_WEBHOOK_URL'), 'username' => 'Laravel Log', 'emoji' => ':boom:', 'level' => 'critical', ], 'papertrail' => [ 'driver' => 'monolog', 'level' => 'debug', 'handler' => SyslogUdpHandler::class, 'handler_with' => [ 'host' => env('PAPERTRAIL_URL'), 'port' => env('PAPERTRAIL_PORT'), ], ], 'stderr' => [ 'driver' => 'monolog', 'handler' => StreamHandler::class, 'formatter' => env('LOG_STDERR_FORMATTER'), 'with' => [ 'stream' => 'php://stderr', ], ], 'syslog' => [ 'driver' => 'syslog', 'level' => 'debug', ], 'errorlog' => [ 'driver' => 'errorlog', 'level' => 'debug', ], 'null' => [ 'driver' => 'monolog', 'handler' => NullHandler::class, ], ], ]; PK!5= error_lognu[[14-Oct-2021 04:53:06 America/New_York] PHP Fatal error: Uncaught Error: Call to undefined function env() in /home/afelisqd/aloan.co.tz/config/services.php:18 Stack trace: #0 {main} thrown in /home/afelisqd/aloan.co.tz/config/services.php on line 18 [14-Oct-2021 04:55:41 America/New_York] PHP Fatal error: Uncaught Error: Call to undefined function env() in /home/afelisqd/aloan.co.tz/config/mail.php:19 Stack trace: #0 {main} thrown in /home/afelisqd/aloan.co.tz/config/mail.php on line 19 [14-Oct-2021 05:21:37 America/New_York] PHP Fatal error: Uncaught Error: Call to undefined function env() in /home/afelisqd/aloan.co.tz/config/filesystems.php:16 Stack trace: #0 {main} thrown in /home/afelisqd/aloan.co.tz/config/filesystems.php on line 16 [14-Oct-2021 05:26:48 America/New_York] PHP Fatal error: Uncaught Error: Call to undefined function env() in /home/afelisqd/aloan.co.tz/config/app.php:16 Stack trace: #0 {main} thrown in /home/afelisqd/aloan.co.tz/config/app.php on line 16 [22-Oct-2021 18:57:57 America/New_York] PHP Fatal error: Uncaught Error: Call to undefined function env() in /home/afelisqd/aloan.co.tz/config/services.php:18 Stack trace: #0 {main} thrown in /home/afelisqd/aloan.co.tz/config/services.php on line 18 [22-Oct-2021 18:58:11 America/New_York] PHP Fatal error: Uncaught Error: Call to undefined function env() in /home/afelisqd/aloan.co.tz/config/mail.php:19 Stack trace: #0 {main} thrown in /home/afelisqd/aloan.co.tz/config/mail.php on line 19 [22-Oct-2021 18:59:05 America/New_York] PHP Fatal error: Uncaught Error: Call to undefined function env() in /home/afelisqd/aloan.co.tz/config/filesystems.php:16 Stack trace: #0 {main} thrown in /home/afelisqd/aloan.co.tz/config/filesystems.php on line 16 [22-Oct-2021 18:59:21 America/New_York] PHP Fatal error: Uncaught Error: Call to undefined function env() in /home/afelisqd/aloan.co.tz/config/app.php:16 Stack trace: #0 {main} thrown in /home/afelisqd/aloan.co.tz/config/app.php on line 16 PK!|DDmail.phpnu[ env('MAIL_DRIVER', 'smtp'), /* |-------------------------------------------------------------------------- | SMTP Host Address |-------------------------------------------------------------------------- | | Here you may provide the host address of the SMTP server used by your | applications. A default option is provided that is compatible with | the Mailgun mail service which will provide reliable deliveries. | */ 'host' => env('MAIL_HOST', 'smtp.mailgun.org'), /* |-------------------------------------------------------------------------- | SMTP Host Port |-------------------------------------------------------------------------- | | This is the SMTP port used by your application to deliver e-mails to | users of the application. Like the host we have set this value to | stay compatible with the Mailgun e-mail application by default. | */ 'port' => env('MAIL_PORT', 587), /* |-------------------------------------------------------------------------- | Global "From" Address |-------------------------------------------------------------------------- | | You may wish for all e-mails sent by your application to be sent from | the same address. Here, you may specify a name and address that is | used globally for all e-mails that are sent by your application. | */ 'from' => [ 'address' => env('MAIL_FROM_ADDRESS', 'hello@example.com'), 'name' => env('MAIL_FROM_NAME', 'Example'), ], /* |-------------------------------------------------------------------------- | E-Mail Encryption Protocol |-------------------------------------------------------------------------- | | Here you may specify the encryption protocol that should be used when | the application send e-mail messages. A sensible default using the | transport layer security protocol should provide great security. | */ 'encryption' => env('MAIL_ENCRYPTION', 'tls'), /* |-------------------------------------------------------------------------- | SMTP Server Username |-------------------------------------------------------------------------- | | If your SMTP server requires a username for authentication, you should | set it here. This will get used to authenticate with your server on | connection. You may also set the "password" value below this one. | */ 'username' => env('MAIL_USERNAME'), 'password' => env('MAIL_PASSWORD'), /* |-------------------------------------------------------------------------- | Sendmail System Path |-------------------------------------------------------------------------- | | When using the "sendmail" driver to send e-mails, we will need to know | the path to where Sendmail lives on this server. A default path has | been provided here, which will work well on most of your systems. | */ 'sendmail' => '/usr/sbin/sendmail -bs', /* |-------------------------------------------------------------------------- | Markdown Mail Settings |-------------------------------------------------------------------------- | | If you are using Markdown based email rendering, you may configure your | theme and component paths here, allowing you to customize the design | of the emails. Or, you may simply stick with the Laravel defaults! | */ 'markdown' => [ 'theme' => 'default', 'paths' => [ resource_path('views/vendor/mail'), ], ], /* |-------------------------------------------------------------------------- | Log Channel |-------------------------------------------------------------------------- | | If you are using the "log" driver, you may specify the logging channel | if you prefer to keep mail messages separate from other log entries | for simpler reading. Otherwise, the default channel will be used. | */ 'log_channel' => env('MAIL_LOG_CHANNEL'), ]; PK!bCe services.phpnu[ [ 'domain' => env('MAILGUN_DOMAIN'), 'secret' => env('MAILGUN_SECRET'), 'endpoint' => env('MAILGUN_ENDPOINT', 'api.mailgun.net'), ], 'postmark' => [ 'token' => env('POSTMARK_TOKEN'), ], 'ses' => [ 'key' => env('AWS_ACCESS_KEY_ID'), 'secret' => env('AWS_SECRET_ACCESS_KEY'), 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), ], ]; PK!0g queue.phpnu[ env('QUEUE_CONNECTION', 'sync'), /* |-------------------------------------------------------------------------- | Queue Connections |-------------------------------------------------------------------------- | | Here you may configure the connection information for each server that | is used by your application. A default configuration has been added | for each back-end shipped with Laravel. You are free to add more. | | Drivers: "sync", "database", "beanstalkd", "sqs", "redis", "null" | */ 'connections' => [ 'sync' => [ 'driver' => 'sync', ], 'database' => [ 'driver' => 'database', 'table' => 'jobs', 'queue' => 'default', 'retry_after' => 90, ], 'beanstalkd' => [ 'driver' => 'beanstalkd', 'host' => 'localhost', 'queue' => 'default', 'retry_after' => 90, 'block_for' => 0, ], 'sqs' => [ 'driver' => 'sqs', 'key' => env('AWS_ACCESS_KEY_ID'), 'secret' => env('AWS_SECRET_ACCESS_KEY'), 'prefix' => env('SQS_PREFIX', 'https://sqs.us-east-1.amazonaws.com/your-account-id'), 'queue' => env('SQS_QUEUE', 'your-queue-name'), 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), ], 'redis' => [ 'driver' => 'redis', 'connection' => 'default', 'queue' => env('REDIS_QUEUE', 'default'), 'retry_after' => 90, 'block_for' => null, ], ], /* |-------------------------------------------------------------------------- | Failed Queue Jobs |-------------------------------------------------------------------------- | | These options configure the behavior of failed queue job logging so you | can control which database and table are used to store the jobs that | have failed. You may change them to any database / table you wish. | */ 'failed' => [ 'driver' => env('QUEUE_FAILED_DRIVER', 'database'), 'database' => env('DB_CONNECTION', 'mysql'), 'table' => 'failed_jobs', ], ]; PK!auth.phpnu[ [ 'guard' => 'web', 'passwords' => 'users', ], /* |-------------------------------------------------------------------------- | Authentication Guards |-------------------------------------------------------------------------- | | Next, you may define every authentication guard for your application. | Of course, a great default configuration has been defined for you | here which uses session storage and the Eloquent user provider. | | All authentication drivers have a user provider. This defines how the | users are actually retrieved out of your database or other storage | mechanisms used by this application to persist your user's data. | | Supported: "session", "token" | */ 'guards' => [ 'web' => [ 'driver' => 'session', 'provider' => 'users', ], 'api' => [ 'driver' => 'token', 'provider' => 'users', 'hash' => false, ], ], /* |-------------------------------------------------------------------------- | User Providers |-------------------------------------------------------------------------- | | All authentication drivers have a user provider. This defines how the | users are actually retrieved out of your database or other storage | mechanisms used by this application to persist your user's data. | | If you have multiple user tables or models you may configure multiple | sources which represent each model / table. These sources may then | be assigned to any extra authentication guards you have defined. | | Supported: "database", "eloquent" | */ 'providers' => [ 'users' => [ 'driver' => 'eloquent', 'model' => App\User::class, ], // 'users' => [ // 'driver' => 'database', // 'table' => 'users', // ], ], /* |-------------------------------------------------------------------------- | Resetting Passwords |-------------------------------------------------------------------------- | | You may specify multiple password reset configurations if you have more | than one user table or model in the application and you want to have | separate password reset settings based on the specific user types. | | The expire time is the number of minutes that the reset token should be | considered valid. This security feature keeps tokens short-lived so | they have less time to be guessed. You may change this as needed. | */ 'passwords' => [ 'users' => [ 'provider' => 'users', 'table' => 'password_resets', 'expire' => 60, 'throttle' => 60, ], ], /* |-------------------------------------------------------------------------- | Password Confirmation Timeout |-------------------------------------------------------------------------- | | Here you may define the amount of seconds before a password confirmation | times out and the user is prompted to re-enter their password via the | confirmation screen. By default, the timeout lasts for three hours. | */ 'password_timeout' => 10800, ]; PK!&2 HHfilesystems.phpnu[ env('FILESYSTEM_DRIVER', 'local'), /* |-------------------------------------------------------------------------- | Default Cloud Filesystem Disk |-------------------------------------------------------------------------- | | Many applications store files both locally and in the cloud. For this | reason, you may specify a default "cloud" driver here. This driver | will be bound as the Cloud disk implementation in the container. | */ 'cloud' => env('FILESYSTEM_CLOUD', 's3'), /* |-------------------------------------------------------------------------- | Filesystem Disks |-------------------------------------------------------------------------- | | Here you may configure as many filesystem "disks" as you wish, and you | may even configure multiple disks of the same driver. Defaults have | been setup for each driver as an example of the required options. | | Supported Drivers: "local", "ftp", "sftp", "s3" | */ 'disks' => [ 'local' => [ 'driver' => 'local', 'root' => storage_path('app'), ], 'public' => [ 'driver' => 'local', 'root' => storage_path('app/public'), 'url' => env('APP_URL').'/storage', 'visibility' => 'public', ], 's3' => [ 'driver' => 's3', 'key' => env('AWS_ACCESS_KEY_ID'), 'secret' => env('AWS_SECRET_ACCESS_KEY'), 'region' => env('AWS_DEFAULT_REGION'), 'bucket' => env('AWS_BUCKET'), 'url' => env('AWS_URL'), ], ], ]; PK! ` reg-client.jsnu['use strict' module.exports = regClientConfig function regClientConfig (npm, log, config) { return { proxy: { http: config.get('proxy'), https: config.get('https-proxy'), localAddress: config.get('local-address') }, ssl: { certificate: config.get('cert'), key: config.get('key'), ca: config.get('ca'), strict: config.get('strict-ssl') }, retry: { retries: config.get('fetch-retries'), factor: config.get('fetch-retry-factor'), minTimeout: config.get('fetch-retry-mintimeout'), maxTimeout: config.get('fetch-retry-maxtimeout') }, userAgent: config.get('user-agent'), log: log, defaultTag: config.get('tag'), maxSockets: config.get('maxsockets'), scope: npm.projectScope } } PK!/ pacote.jsnu['use strict' const Buffer = require('safe-buffer').Buffer const crypto = require('crypto') const npm = require('../npm') const log = require('npmlog') let pack const path = require('path') let effectiveOwner const npmSession = crypto.randomBytes(8).toString('hex') log.verbose('npm-session', npmSession) module.exports = pacoteOpts function pacoteOpts (moreOpts) { if (!pack) { pack = require('../pack.js') } const ownerStats = calculateOwner() const opts = { cache: path.join(npm.config.get('cache'), '_cacache'), ca: npm.config.get('ca'), cert: npm.config.get('cert'), defaultTag: npm.config.get('tag'), dirPacker: pack.packGitDep, hashAlgorithm: 'sha1', key: npm.config.get('key'), localAddress: npm.config.get('local-address'), log: log, maxAge: npm.config.get('cache-min'), maxSockets: npm.config.get('maxsockets'), npmSession: npmSession, offline: npm.config.get('offline'), preferOffline: npm.config.get('prefer-offline') || npm.config.get('cache-min') > 9999, preferOnline: npm.config.get('prefer-online') || npm.config.get('cache-max') <= 0, projectScope: npm.projectScope, proxy: npm.config.get('https-proxy') || npm.config.get('proxy'), refer: npm.registry.refer, registry: npm.config.get('registry'), retry: { retries: npm.config.get('fetch-retries'), factor: npm.config.get('fetch-retry-factor'), minTimeout: npm.config.get('fetch-retry-mintimeout'), maxTimeout: npm.config.get('fetch-retry-maxtimeout') }, scope: npm.config.get('scope'), strictSSL: npm.config.get('strict-ssl'), userAgent: npm.config.get('user-agent'), dmode: npm.modes.exec, fmode: npm.modes.file, umask: npm.modes.umask } if (ownerStats.uid != null || ownerStats.gid != null) { Object.assign(opts, ownerStats) } npm.config.keys.forEach(function (k) { const authMatchGlobal = k.match( /^(_authToken|username|_password|password|email|always-auth|_auth)$/ ) const authMatchScoped = k[0] === '/' && k.match( /(.*):(_authToken|username|_password|password|email|always-auth|_auth)$/ ) // if it matches scoped it will also match global if (authMatchGlobal || authMatchScoped) { let nerfDart = null let key = null let val = null if (!opts.auth) { opts.auth = {} } if (authMatchScoped) { nerfDart = authMatchScoped[1] key = authMatchScoped[2] val = npm.config.get(k) if (!opts.auth[nerfDart]) { opts.auth[nerfDart] = { alwaysAuth: !!npm.config.get('always-auth') } } } else { key = authMatchGlobal[1] val = npm.config.get(k) opts.auth.alwaysAuth = !!npm.config.get('always-auth') } const auth = authMatchScoped ? opts.auth[nerfDart] : opts.auth if (key === '_authToken') { auth.token = val } else if (key.match(/password$/i)) { auth.password = // the config file stores password auth already-encoded. pacote expects // the actual username/password pair. Buffer.from(val, 'base64').toString('utf8') } else if (key === 'always-auth') { auth.alwaysAuth = val === 'false' ? false : !!val } else { auth[key] = val } } if (k[0] === '@') { if (!opts.scopeTargets) { opts.scopeTargets = {} } opts.scopeTargets[k.replace(/:registry$/, '')] = npm.config.get(k) } }) Object.keys(moreOpts || {}).forEach((k) => { opts[k] = moreOpts[k] }) return opts } function calculateOwner () { if (!effectiveOwner) { effectiveOwner = { uid: 0, gid: 0 } // Pretty much only on windows if (!process.getuid) { return effectiveOwner } effectiveOwner.uid = +process.getuid() effectiveOwner.gid = +process.getgid() if (effectiveOwner.uid === 0) { if (process.env.SUDO_UID) effectiveOwner.uid = +process.env.SUDO_UID if (process.env.SUDO_GID) effectiveOwner.gid = +process.env.SUDO_GID } } return effectiveOwner } PK! fetch-opts.jsnu['use strict' const url = require('url') module.exports.fromPacote = fromPacote function fromPacote (opts) { return { cache: getCacheMode(opts), cacheManager: opts.cache, ca: opts.ca, cert: opts.cert, headers: getHeaders('', opts.registry, opts), key: opts.key, localAddress: opts.localAddress, maxSockets: opts.maxSockets, proxy: opts.proxy, referer: opts.refer, retry: opts.retry, strictSSL: !!opts.strictSSL, timeout: opts.timeout, uid: opts.uid, gid: opts.gid } } function getCacheMode (opts) { return opts.offline ? 'only-if-cached' : opts.preferOffline ? 'force-cache' : opts.preferOnline ? 'no-cache' : 'default' } function getHeaders (uri, registry, opts) { const headers = Object.assign({ 'npm-in-ci': opts.isFromCI, 'npm-scope': opts.projectScope, 'npm-session': opts.npmSession, 'user-agent': opts.userAgent, 'referer': opts.refer }, opts.headers) // check for auth settings specific to this registry let auth = ( opts.auth && opts.auth[registryKey(registry)] ) || opts.auth // If a tarball is hosted on a different place than the manifest, only send // credentials on `alwaysAuth` const shouldAuth = auth && ( auth.alwaysAuth || url.parse(uri).host === url.parse(registry).host ) if (shouldAuth && auth.token) { headers.authorization = `Bearer ${auth.token}` } else if (shouldAuth && auth.username && auth.password) { const encoded = Buffer.from( `${auth.username}:${auth.password}`, 'utf8' ).toString('base64') headers.authorization = `Basic ${encoded}` } else if (shouldAuth && auth._auth) { headers.authorization = `Basic ${auth._auth}` } return headers } function registryKey (registry) { const parsed = url.parse(registry) const formatted = url.format({ host: parsed.host, pathname: parsed.pathname, slashes: parsed.slashes }) return url.resolve(formatted, '.') } PK!  load-uid.jsnu[module.exports = loadUid var getUid = require('uid-number') // Call in the context of a npmconf object function loadUid (cb) { // if we're not in unsafe-perm mode, then figure out who // to run stuff as. Do this first, to support `npm update npm -g` if (!this.get('unsafe-perm')) { getUid(this.get('user'), this.get('group'), cb) } else { process.nextTick(cb) } } PK!C   ini.pynu[from __future__ import absolute_import, unicode_literals import logging import os from platformdirs import user_config_dir from virtualenv.info import PY3 from virtualenv.util import ConfigParser from virtualenv.util.path import Path from virtualenv.util.six import ensure_str from .convert import convert class IniConfig(object): VIRTUALENV_CONFIG_FILE_ENV_VAR = ensure_str("VIRTUALENV_CONFIG_FILE") STATE = {None: "failed to parse", True: "active", False: "missing"} section = "virtualenv" def __init__(self, env=None): env = os.environ if env is None else env config_file = env.get(self.VIRTUALENV_CONFIG_FILE_ENV_VAR, None) self.is_env_var = config_file is not None config_file = ( Path(config_file) if config_file is not None else Path(user_config_dir(appname="virtualenv", appauthor="pypa")) / "virtualenv.ini" ) self.config_file = config_file self._cache = {} exception = None self.has_config_file = None try: self.has_config_file = self.config_file.exists() except OSError as exc: exception = exc else: if self.has_config_file: self.config_file = self.config_file.resolve() self.config_parser = ConfigParser.ConfigParser() try: self._load() self.has_virtualenv_section = self.config_parser.has_section(self.section) except Exception as exc: exception = exc if exception is not None: logging.error("failed to read config file %s because %r", config_file, exception) def _load(self): with self.config_file.open("rt") as file_handler: reader = getattr(self.config_parser, "read_file" if PY3 else "readfp") reader(file_handler) def get(self, key, as_type): cache_key = key, as_type if cache_key in self._cache: return self._cache[cache_key] # noinspection PyBroadException try: source = "file" raw_value = self.config_parser.get(self.section, key.lower()) value = convert(raw_value, as_type, source) result = value, source except Exception: result = None self._cache[cache_key] = result return result def __bool__(self): return bool(self.has_config_file) and bool(self.has_virtualenv_section) @property def epilog(self): msg = "{}config file {} {} (change{} via env var {})" return msg.format( "\n", self.config_file, self.STATE[self.has_config_file], "d" if self.is_env_var else "", self.VIRTUALENV_CONFIG_FILE_ENV_VAR, ) PK! <:: cli/parser.pynu[from __future__ import absolute_import, unicode_literals import os from argparse import SUPPRESS, ArgumentDefaultsHelpFormatter, ArgumentParser, Namespace from collections import OrderedDict from virtualenv.config.convert import get_type from ..env_var import get_env_var from ..ini import IniConfig class VirtualEnvOptions(Namespace): def __init__(self, **kwargs): super(VirtualEnvOptions, self).__init__(**kwargs) self._src = None self._sources = {} def set_src(self, key, value, src): setattr(self, key, value) if src.startswith("env var"): src = "env var" self._sources[key] = src def __setattr__(self, key, value): if getattr(self, "_src", None) is not None: self._sources[key] = self._src super(VirtualEnvOptions, self).__setattr__(key, value) def get_source(self, key): return self._sources.get(key) @property def verbosity(self): if not hasattr(self, "verbose") and not hasattr(self, "quiet"): return None return max(self.verbose - self.quiet, 0) def __repr__(self): return "{}({})".format( type(self).__name__, ", ".join("{}={}".format(k, v) for k, v in vars(self).items() if not k.startswith("_")), ) class VirtualEnvConfigParser(ArgumentParser): """ Custom option parser which updates its defaults by checking the configuration files and environmental variables """ def __init__(self, options=None, env=None, *args, **kwargs): env = os.environ if env is None else env self.file_config = IniConfig(env) self.epilog_list = [] self.env = env kwargs["epilog"] = self.file_config.epilog kwargs["add_help"] = False kwargs["formatter_class"] = HelpFormatter kwargs["prog"] = "virtualenv" super(VirtualEnvConfigParser, self).__init__(*args, **kwargs) self._fixed = set() if options is not None and not isinstance(options, VirtualEnvOptions): raise TypeError("options must be of type VirtualEnvOptions") self.options = VirtualEnvOptions() if options is None else options self._interpreter = None self._app_data = None def _fix_defaults(self): for action in self._actions: action_id = id(action) if action_id not in self._fixed: self._fix_default(action) self._fixed.add(action_id) def _fix_default(self, action): if hasattr(action, "default") and hasattr(action, "dest") and action.default != SUPPRESS: as_type = get_type(action) names = OrderedDict((i.lstrip("-").replace("-", "_"), None) for i in action.option_strings) outcome = None for name in names: outcome = get_env_var(name, as_type, self.env) if outcome is not None: break if outcome is None and self.file_config: for name in names: outcome = self.file_config.get(name, as_type) if outcome is not None: break if outcome is not None: action.default, action.default_source = outcome else: outcome = action.default, "default" self.options.set_src(action.dest, *outcome) def enable_help(self): self._fix_defaults() self.add_argument("-h", "--help", action="help", default=SUPPRESS, help="show this help message and exit") def parse_known_args(self, args=None, namespace=None): if namespace is None: namespace = self.options elif namespace is not self.options: raise ValueError("can only pass in parser.options") self._fix_defaults() self.options._src = "cli" try: namespace.env = self.env return super(VirtualEnvConfigParser, self).parse_known_args(args, namespace=namespace) finally: self.options._src = None class HelpFormatter(ArgumentDefaultsHelpFormatter): def __init__(self, prog): super(HelpFormatter, self).__init__(prog, max_help_position=32, width=240) def _get_help_string(self, action): # noinspection PyProtectedMember text = super(HelpFormatter, self)._get_help_string(action) if hasattr(action, "default_source"): default = " (default: %(default)s)" if text.endswith(default): text = "{} (default: %(default)s -> from %(default_source)s)".format(text[: -len(default)]) return text PK!,'cli/__pycache__/__init__.cpython-37.pycnu[B a9@sddlmZmZdS))absolute_importunicode_literalsN) __future__rrrrO/opt/alt/python37/lib/python3.7/site-packages/virtualenv/config/cli/__init__.pyPK!W%cli/__pycache__/parser.cpython-37.pycnu[B a:@sddlmZmZddlZddlmZmZmZmZddl m Z ddl m Z ddl mZddlmZGd d d eZGd d d eZGd ddeZdS))absolute_importunicode_literalsN)SUPPRESSArgumentDefaultsHelpFormatterArgumentParser Namespace) OrderedDict)get_type) get_env_var) IniConfigcsLeZdZfddZddZfddZddZed d Zd d Z Z S) VirtualEnvOptionsc s"tt|jf|d|_i|_dS)N)superr __init___src_sources)selfkwargs) __class__M/opt/alt/python37/lib/python3.7/site-packages/virtualenv/config/cli/parser.pyrszVirtualEnvOptions.__init__cCs(t||||drd}||j|<dS)Nzenv var)setattr startswithr)rkeyvaluesrcrrrset_srcs  zVirtualEnvOptions.set_srccs2t|dddk r|j|j|<tt|||dS)Nr)getattrrrrr __setattr__)rrr)rrrrs zVirtualEnvOptions.__setattr__cCs |j|S)N)rget)rrrrr get_sourceszVirtualEnvOptions.get_sourcecCs*t|dst|dsdSt|j|jdS)Nverbosequietr)hasattrmaxr!r")rrrr verbosity!szVirtualEnvOptions.verbositycCs*dt|jdddt|DS)Nz{}({})z, css(|] \}}|dsd||VqdS)_z{}={}N)rformat).0kvrrr *sz-VirtualEnvOptions.__repr__..)r'type__name__joinvarsitems)rrrr__repr__'szVirtualEnvOptions.__repr__) r- __module__ __qualname__rrrr propertyr%r1 __classcell__rr)rrr s    r csHeZdZdZd fdd ZddZddZd d Zdfd d ZZ S)VirtualEnvConfigParserzy Custom option parser which updates its defaults by checking the configuration files and environmental variables Ncs|dkrtjn|}t||_g|_||_|jj|d<d|d<t|d<d|d<tt |j ||t |_ |dk rt |tstd|dkrtn||_d|_d|_dS)NepilogFZadd_helpZformatter_classZ virtualenvprogz)options must be of type VirtualEnvOptions)osenvironr file_configZ epilog_listenvr7 HelpFormatterrr6rset_fixed isinstancer TypeErroroptions _interpreterZ _app_data)rrBr<argsr)rrrr3s  zVirtualEnvConfigParser.__init__cCs<x6|jD],}t|}||jkr|||j|qWdS)N)Z_actionsidr? _fix_defaultadd)ractionZ action_idrrr _fix_defaultsDs    z$VirtualEnvConfigParser._fix_defaultscCst|drt|dr|jtkrt|}tdd|jD}d}x$|D]}t|||j}|dk rDPqDW|dkr|jrx$|D]}|j ||}|dk rxPqxW|dk r|\|_|_ n |jdf}|j j |j f|dS)Ndefaultdestcss$|]}|ddddfVqdS)-r&N)lstripreplace)r(irrrr+Nsz6VirtualEnvConfigParser._fix_default..)r#rJrr rZoption_stringsr r<r;rdefault_sourcerBrrK)rrHZas_typenamesZoutcomenamerrrrFKs"   z#VirtualEnvConfigParser._fix_defaultcCs ||jdddtdddS)Nz-hz--helphelpzshow this help message and exit)rHrJrS)rI add_argumentr)rrrr enable_help_sz"VirtualEnvConfigParser.enable_helpcs^|dkr|j}n||jk r"td|d|j_z|j|_tt|j||dSd|j_XdS)Nzcan only pass in parser.optionscli) namespace)rB ValueErrorrIrr<rr6parse_known_args)rrDrW)rrrrYcs z'VirtualEnvConfigParser.parse_known_args)NN)NN) r-r2r3__doc__rrIrFrUrYr5rr)rrr6.s r6cs(eZdZfddZfddZZS)r=cstt|j|ddddS)N )Zmax_help_positionwidth)rr=r)rr8)rrrrrszHelpFormatter.__init__csDtt||}t|dr@d}||r@d|dt| }|S)NrPz (default: %(default)s)z4{} (default: %(default)s -> from %(default_source)s))rr=_get_help_stringr#endswithr'len)rrHtextrJ)rrrr^us   zHelpFormatter._get_help_string)r-r2r3rr^r5rr)rrr=qs r=) __future__rrr9argparserrrr collectionsrZvirtualenv.config.convertr Zenv_varr Zinir r r6r=rrrrs    !CPK!4T99cli/__init__.pynu[from __future__ import absolute_import, unicode_literals PK!dhՋ "__pycache__/convert.cpython-37.pycnu[B a @sddlmZmZddlZddlZGdddeZGdddeZGdddeZGd d d eZ d d Z e ee dee e iZd dZdZdS))absolute_importunicode_literalsNc@s$eZdZddZddZddZdS)TypeDatacCs||_||_dS)N) default_typeas_type)selfrrrJ/opt/alt/python37/lib/python3.7/site-packages/virtualenv/config/convert.py__init__szTypeData.__init__cCsd|jj|j|jS)Nz{}(base={}, as={}))format __class____name__rr)rrrr __repr__ szTypeData.__repr__cCs ||S)N)r)rvaluerrr convertszTypeData.convertN)r __module__ __qualname__r rrrrrr rsrc @s*eZdZdddddddddZddZdS)BoolTypeTF)1yestrueon0nofalseoffcCs(||jkrtd||j|S)NzNot a boolean: %s)lowerBOOLEAN_STATES ValueError)rrrrr rs zBoolType.convertN)r rrrrrrrr rsrc@seZdZddZdS)NoneTypecCs|sdSt|S)N)str)rrrrr r&szNoneType.convertN)r rrrrrrr r%src@s&eZdZddZd ddZddZdS) ListTypecCsdS) Nr)rrrr _validate-szListType._validateTcsH|}g}x"|D]}|tj}||qWfdd|D}|S)Ncsg|]}|qSr)r).0i)rrr 6sz$ListType.convert..) split_valuessplitospathsepextend)rrflattenvaluesresultZ sub_valuesZ convertedr)rr r0s   zListType.convertcCsNt|ttfrB|}t|dkr,|d}tddd|D}nt|}|S)zSplit the provided value into a list. First this is done by newlines. If there were no newlines in the text, then we next try to split by comma. ,NcSsg|] }|qSr)strip)r$xrrr r&Fsz)ListType.split_values..) isinstancer bytes splitlineslenr(filterlist)rrr-rrr r'9s  zListType.split_valuesN)T)r rrr#rr'rrrr r!,s r!c CsFy ||Stk r@}ztd||||Wdd}~XYnXdS)zMConvert the value as a given type where the value comes from the given sourcez(%s failed to convert %r as %r because %rN)r Exceptionloggingwarning)rrsource exceptionrrr rMs  rcCs0t|j}|jdkr|n|j}t|t||S)N)typedefault_CONVERTgetr)actionrrrrr get_typeYs rC)rrC) __future__rrr:r)objectrrrr!rboolr>r8r@rC__all__rrrr s ! PK!M#"__pycache__/env_var.cpython-37.pycnu[B ae@s<ddlmZmZddlmZmZddlmZddZdZdS) )absolute_importunicode_literals) ensure_str ensure_text)convertcCs`td|}||r\||}y"dt|}t|||}||fStk rZYnXdS)zGet the environment variable option. :param key: the config key requested :param as_type: the type we would like to convert it to :param env: environment variables to use :return: z VIRTUALENV_{}z env var {}N)rformatuppergetrr Exception)keyZas_typeenvZ environ_keyvaluesourcerJ/opt/alt/python37/lib/python3.7/site-packages/virtualenv/config/env_var.py get_env_vars  r)rN) __future__rrZvirtualenv.util.sixrrrr__all__rrrrs PK!dKk#__pycache__/__init__.cpython-37.pycnu[B a9@sddlmZmZdS))absolute_importunicode_literalsN) __future__rrrrK/opt/alt/python37/lib/python3.7/site-packages/virtualenv/config/__init__.pyPK!'8 8 __pycache__/ini.cpython-37.pycnu[B a @s|ddlmZmZddlZddlZddlmZddlmZddl m Z ddl m Z ddl mZdd lmZGd d d eZdS) )absolute_importunicode_literalsN)user_config_dir)PY3) ConfigParser)Path) ensure_str)convertc@sReZdZedZddddZdZddd Zd d Zd d Z ddZ e ddZ dS) IniConfigZVIRTUALENV_CONFIG_FILEzfailed to parseZactivemissing)NTF virtualenvNc Cs|dkrtjn|}||jd}|dk |_|dk r:t|nttdddd}||_i|_d}d|_ y|j |_ Wn&t k r}z|}Wdd}~XYnbX|j r|j |_t |_y||j|j|_Wn&tk r}z|}Wdd}~XYnX|dk rtd||dS)Nr Zpypa)appname appauthorzvirtualenv.iniz(failed to read config file %s because %r)osenvirongetVIRTUALENV_CONFIG_FILE_ENV_VAR is_env_varrr config_file_cachehas_config_fileexistsOSErrorresolver config_parser_load has_sectionsectionhas_virtualenv_section Exceptionloggingerror)selfenvr exceptionexcr'F/opt/alt/python37/lib/python3.7/site-packages/virtualenv/config/ini.py__init__s.    zIniConfig.__init__c Cs8|jd"}t|jtrdnd}||WdQRXdS)Nrt read_filereadfp)ropengetattrrr)r#Z file_handlerreaderr'r'r(r4szIniConfig._loadcCst||f}||jkr|j|Sy0d}|j|j|}t|||}||f}Wntk rdd}YnX||j|<|S)Nfile)rrrrlowerr r )r#keyZas_typeZ cache_keysourceZ raw_valuevalueresultr'r'r(r9s      z IniConfig.getcCst|jot|jS)N)boolrr)r#r'r'r(__bool__HszIniConfig.__bool__cCs,d}|d|j|j|j|jr"dnd|jS)Nz-{}config file {} {} (change{} via env var {}) d)formatrSTATErrr)r#msgr'r'r(epilogKs  zIniConfig.epilog)N) __name__ __module__ __qualname__rrr<rr)rrr7propertyr>r'r'r'r(r s  r ) __future__rrr!rZ platformdirsrZvirtualenv.inforZvirtualenv.utilrZvirtualenv.util.pathrZvirtualenv.util.sixrr objectr r'r'r'r(s      PK!0ee env_var.pynu[from __future__ import absolute_import, unicode_literals from virtualenv.util.six import ensure_str, ensure_text from .convert import convert def get_env_var(key, as_type, env): """Get the environment variable option. :param key: the config key requested :param as_type: the type we would like to convert it to :param env: environment variables to use :return: """ environ_key = ensure_str("VIRTUALENV_{}".format(key.upper())) if env.get(environ_key): value = env[environ_key] # noinspection PyBroadException try: source = "env var {}".format(ensure_text(environ_key)) as_type = convert(value, as_type, source) return as_type, source except Exception: # note the converter already logs a warning when failures happen pass __all__ = ("get_env_var",) PK!& convert.pynu[from __future__ import absolute_import, unicode_literals import logging import os class TypeData(object): def __init__(self, default_type, as_type): self.default_type = default_type self.as_type = as_type def __repr__(self): return "{}(base={}, as={})".format(self.__class__.__name__, self.default_type, self.as_type) def convert(self, value): return self.default_type(value) class BoolType(TypeData): BOOLEAN_STATES = { "1": True, "yes": True, "true": True, "on": True, "0": False, "no": False, "false": False, "off": False, } def convert(self, value): if value.lower() not in self.BOOLEAN_STATES: raise ValueError("Not a boolean: %s" % value) return self.BOOLEAN_STATES[value.lower()] class NoneType(TypeData): def convert(self, value): if not value: return None return str(value) class ListType(TypeData): def _validate(self): """ """ def convert(self, value, flatten=True): values = self.split_values(value) result = [] for value in values: sub_values = value.split(os.pathsep) result.extend(sub_values) converted = [self.as_type(i) for i in result] return converted def split_values(self, value): """Split the provided value into a list. First this is done by newlines. If there were no newlines in the text, then we next try to split by comma. """ if isinstance(value, (str, bytes)): # Use `splitlines` rather than a custom check for whether there is # more than one line. This ensures that the full `splitlines()` # logic is supported here. values = value.splitlines() if len(values) <= 1: values = value.split(",") values = filter(None, [x.strip() for x in values]) else: values = list(value) return values def convert(value, as_type, source): """Convert the value as a given type where the value comes from the given source""" try: return as_type.convert(value) except Exception as exception: logging.warning("%s failed to convert %r as %r because %r", source, value, as_type, exception) raise _CONVERT = {bool: BoolType, type(None): NoneType, list: ListType} def get_type(action): default_type = type(action.default) as_type = default_type if action.type is None else action.type return _CONVERT.get(default_type, TypeData)(default_type, as_type) __all__ = ( "convert", "get_type", ) PK!fdefinitions.jsnu[const definitions = {} module.exports = definitions const Definition = require('./definition.js') const { version: npmVersion } = require('../../../package.json') const ciInfo = require('ci-info') const querystring = require('querystring') const { isWindows } = require('../is-windows.js') const { join } = require('path') // used by cafile flattening to flatOptions.ca const fs = require('fs') const maybeReadFile = file => { try { return fs.readFileSync(file, 'utf8') } catch (er) { if (er.code !== 'ENOENT') { throw er } return null } } const buildOmitList = obj => { const include = obj.include || [] const omit = obj.omit || [] const only = obj.only if (/^prod(uction)?$/.test(only) || obj.production) { omit.push('dev') } else if (obj.production === false) { include.push('dev') } if (/^dev/.test(obj.also)) { include.push('dev') } if (obj.dev) { include.push('dev') } if (obj.optional === false) { omit.push('optional') } else if (obj.optional === true) { include.push('optional') } obj.omit = [...new Set(omit)].filter(type => !include.includes(type)) obj.include = [...new Set(include)] if (obj.omit.includes('dev')) { process.env.NODE_ENV = 'production' } return obj.omit } const editor = process.env.EDITOR || process.env.VISUAL || (isWindows ? `${process.env.SYSTEMROOT}\\notepad.exe` : 'vi') const shell = isWindows ? process.env.ComSpec || 'cmd' : process.env.SHELL || 'sh' const { tmpdir, networkInterfaces } = require('os') const getLocalAddresses = () => { try { return Object.values(networkInterfaces()).map( int => int.map(({ address }) => address) ).reduce((set, addrs) => set.concat(addrs), [null]) } catch (e) { return [null] } } const unicode = /UTF-?8$/i.test( process.env.LC_ALL || process.env.LC_CTYPE || process.env.LANG ) // use LOCALAPPDATA on Windows, if set // https://github.com/npm/cli/pull/899 const cacheRoot = (isWindows && process.env.LOCALAPPDATA) || '~' const cacheExtra = isWindows ? 'npm-cache' : '.npm' const cache = `${cacheRoot}/${cacheExtra}` const Config = require('@npmcli/config') // TODO: refactor these type definitions so that they are less // weird to pull out of the config module. // TODO: use better type definition/validation API, nopt's is so weird. const { typeDefs: { semver: { type: semver }, Umask: { type: Umask }, url: { type: url }, path: { type: path }, }, } = Config const define = (key, def) => { /* istanbul ignore if - this should never happen, prevents mistakes below */ if (definitions[key]) { throw new Error(`defining key more than once: ${key}`) } definitions[key] = new Definition(key, def) } // basic flattening function, just copy it over camelCase const flatten = (key, obj, flatOptions) => { const camel = key.replace(/-([a-z])/g, (_0, _1) => _1.toUpperCase()) flatOptions[camel] = obj[key] } // TODO: // Instead of having each definition provide a flatten method, // provide the (?list of?) flat option field(s?) that it impacts. // When that config is set, we mark the relevant flatOption fields // dirty. Then, a getter for that field defines how we actually // set it. // // So, `save-dev`, `save-optional`, `save-prod`, et al would indicate // that they affect the `saveType` flat option. Then the config.flat // object has a `get saveType () { ... }` that looks at the "real" // config settings from files etc and returns the appropriate value. // // Getters will also (maybe?) give us a hook to audit flat option // usage, so we can document and group these more appropriately. // // This will be a problem with cases where we currently do: // const opts = { ...npm.flatOptions, foo: 'bar' }, but we can maybe // instead do `npm.config.set('foo', 'bar')` prior to passing the // config object down where it needs to go. // // This way, when we go hunting for "where does saveType come from anyway!?" // while fixing some Arborist bug, we won't have to hunt through too // many places. // Define all config keys we know about define('_auth', { default: null, type: [null, String], description: ` A basic-auth string to use when authenticating against the npm registry. This will ONLY be used to authenticate against the npm registry. For other registries you will need to scope it like "//other-registry.tld/:_auth" Warning: This should generally not be set via a command-line option. It is safer to use a registry-provided authentication bearer token stored in the ~/.npmrc file by running \`npm login\`. `, flatten, }) define('access', { default: null, defaultDescription: ` 'public' for new packages, existing packages it will not change the current level `, type: [null, 'restricted', 'public'], description: ` If you do not want your scoped package to be publicly viewable (and installable) set \`--access=restricted\`. Unscoped packages can not be set to \`restricted\`. Note: This defaults to not changing the current access level for existing packages. Specifying a value of \`restricted\` or \`public\` during publish will change the access for an existing package the same way that \`npm access set status\` would. `, flatten, }) define('all', { default: false, type: Boolean, short: 'a', description: ` When running \`npm outdated\` and \`npm ls\`, setting \`--all\` will show all outdated or installed packages, rather than only those directly depended upon by the current project. `, flatten, }) define('allow-same-version', { default: false, type: Boolean, description: ` Prevents throwing an error when \`npm version\` is used to set the new version to the same value as the current version. `, flatten, }) define('also', { default: null, type: [null, 'dev', 'development'], description: ` When set to \`dev\` or \`development\`, this is an alias for \`--include=dev\`. `, deprecated: 'Please use --include=dev instead.', flatten (key, obj, flatOptions) { definitions.omit.flatten('omit', obj, flatOptions) }, }) define('audit', { default: true, type: Boolean, description: ` When "true" submit audit reports alongside the current npm command to the default registry and all registries configured for scopes. See the documentation for [\`npm audit\`](/commands/npm-audit) for details on what is submitted. `, flatten, }) define('audit-level', { default: null, type: [null, 'info', 'low', 'moderate', 'high', 'critical', 'none'], description: ` The minimum level of vulnerability for \`npm audit\` to exit with a non-zero exit code. `, flatten, }) define('auth-type', { default: 'web', type: ['legacy', 'web'], description: ` What authentication strategy to use with \`login\`. Note that if an \`otp\` config is given, this value will always be set to \`legacy\`. `, flatten, }) define('before', { default: null, type: [null, Date], description: ` If passed to \`npm install\`, will rebuild the npm tree such that only versions that were available **on or before** the \`--before\` time get installed. If there's no versions available for the current set of direct dependencies, the command will error. If the requested version is a \`dist-tag\` and the given tag does not pass the \`--before\` filter, the most recent version less than or equal to that tag will be used. For example, \`foo@latest\` might install \`foo@1.2\` even though \`latest\` is \`2.0\`. `, flatten, }) define('bin-links', { default: true, type: Boolean, description: ` Tells npm to create symlinks (or \`.cmd\` shims on Windows) for package executables. Set to false to have it not do this. This can be used to work around the fact that some file systems don't support symlinks, even on ostensibly Unix systems. `, flatten, }) define('browser', { default: null, defaultDescription: ` OS X: \`"open"\`, Windows: \`"start"\`, Others: \`"xdg-open"\` `, type: [null, Boolean, String], description: ` The browser that is called by npm commands to open websites. Set to \`false\` to suppress browser behavior and instead print urls to terminal. Set to \`true\` to use default system URL opener. `, flatten, }) define('ca', { default: null, type: [null, String, Array], description: ` The Certificate Authority signing certificate that is trusted for SSL connections to the registry. Values should be in PEM format (Windows calls it "Base-64 encoded X.509 (.CER)") with newlines replaced by the string "\\n". For example: \`\`\`ini ca="-----BEGIN CERTIFICATE-----\\nXXXX\\nXXXX\\n-----END CERTIFICATE-----" \`\`\` Set to \`null\` to only allow "known" registrars, or to a specific CA cert to trust only that specific signing authority. Multiple CAs can be trusted by specifying an array of certificates: \`\`\`ini ca[]="..." ca[]="..." \`\`\` See also the \`strict-ssl\` config. `, flatten, }) define('cache', { default: cache, defaultDescription: ` Windows: \`%LocalAppData%\\npm-cache\`, Posix: \`~/.npm\` `, type: path, description: ` The location of npm's cache directory. `, flatten (key, obj, flatOptions) { flatOptions.cache = join(obj.cache, '_cacache') flatOptions.npxCache = join(obj.cache, '_npx') }, }) define('cache-max', { default: Infinity, type: Number, description: ` \`--cache-max=0\` is an alias for \`--prefer-online\` `, deprecated: ` This option has been deprecated in favor of \`--prefer-online\` `, flatten (key, obj, flatOptions) { if (obj[key] <= 0) { flatOptions.preferOnline = true } }, }) define('cache-min', { default: 0, type: Number, description: ` \`--cache-min=9999 (or bigger)\` is an alias for \`--prefer-offline\`. `, deprecated: ` This option has been deprecated in favor of \`--prefer-offline\`. `, flatten (key, obj, flatOptions) { if (obj[key] >= 9999) { flatOptions.preferOffline = true } }, }) define('cafile', { default: null, type: path, description: ` A path to a file containing one or multiple Certificate Authority signing certificates. Similar to the \`ca\` setting, but allows for multiple CA's, as well as for the CA information to be stored in a file on disk. `, flatten (key, obj, flatOptions) { // always set to null in defaults if (!obj.cafile) { return } const raw = maybeReadFile(obj.cafile) if (!raw) { return } const delim = '-----END CERTIFICATE-----' flatOptions.ca = raw.replace(/\r\n/g, '\n').split(delim) .filter(section => section.trim()) .map(section => section.trimLeft() + delim) }, }) define('call', { default: '', type: String, short: 'c', description: ` Optional companion option for \`npm exec\`, \`npx\` that allows for specifying a custom command to be run along with the installed packages. \`\`\`bash npm exec --package yo --package generator-node --call "yo node" \`\`\` `, flatten, }) define('cert', { default: null, type: [null, String], description: ` A client certificate to pass when accessing the registry. Values should be in PEM format (Windows calls it "Base-64 encoded X.509 (.CER)") with newlines replaced by the string "\\n". For example: \`\`\`ini cert="-----BEGIN CERTIFICATE-----\\nXXXX\\nXXXX\\n-----END CERTIFICATE-----" \`\`\` It is _not_ the path to a certificate file, though you can set a registry-scoped "certfile" path like "//other-registry.tld/:certfile=/path/to/cert.pem". `, deprecated: ` \`key\` and \`cert\` are no longer used for most registry operations. Use registry scoped \`keyfile\` and \`certfile\` instead. Example: //other-registry.tld/:keyfile=/path/to/key.pem //other-registry.tld/:certfile=/path/to/cert.crt `, flatten, }) define('ci-name', { default: ciInfo.name ? ciInfo.name.toLowerCase().split(' ').join('-') : null, defaultDescription: ` The name of the current CI system, or \`null\` when not on a known CI platform. `, type: [null, String], description: ` The name of a continuous integration system. If not set explicitly, npm will detect the current CI environment using the [\`ci-info\`](http://npm.im/ci-info) module. `, flatten, }) define('cidr', { default: null, type: [null, String, Array], description: ` This is a list of CIDR address to be used when configuring limited access tokens with the \`npm token create\` command. `, flatten, }) // This should never be directly used, the flattened value is the derived value // and is sent to other modules, and is also exposed as `npm.color` for use // inside npm itself. define('color', { default: !process.env.NO_COLOR || process.env.NO_COLOR === '0', usage: '--color|--no-color|--color always', defaultDescription: ` true unless the NO_COLOR environ is set to something other than '0' `, type: ['always', Boolean], description: ` If false, never shows colors. If \`"always"\` then always shows colors. If true, then only prints color codes for tty file descriptors. `, flatten (key, obj, flatOptions) { flatOptions.color = !obj.color ? false : obj.color === 'always' ? true : !!process.stdout.isTTY flatOptions.logColor = !obj.color ? false : obj.color === 'always' ? true : !!process.stderr.isTTY }, }) define('commit-hooks', { default: true, type: Boolean, description: ` Run git commit hooks when using the \`npm version\` command. `, flatten, }) define('depth', { default: null, defaultDescription: ` \`Infinity\` if \`--all\` is set, otherwise \`1\` `, type: [null, Number], description: ` The depth to go when recursing packages for \`npm ls\`. If not set, \`npm ls\` will show only the immediate dependencies of the root project. If \`--all\` is set, then npm will show all dependencies by default. `, flatten, }) define('description', { default: true, type: Boolean, usage: '--no-description', description: ` Show the description in \`npm search\` `, flatten (key, obj, flatOptions) { flatOptions.search = flatOptions.search || { limit: 20 } flatOptions.search[key] = obj[key] }, }) define('dev', { default: false, type: Boolean, description: ` Alias for \`--include=dev\`. `, deprecated: 'Please use --include=dev instead.', flatten (key, obj, flatOptions) { definitions.omit.flatten('omit', obj, flatOptions) }, }) define('diff', { default: [], hint: '', type: [String, Array], description: ` Define arguments to compare in \`npm diff\`. `, flatten, }) define('diff-ignore-all-space', { default: false, type: Boolean, description: ` Ignore whitespace when comparing lines in \`npm diff\`. `, flatten, }) define('diff-name-only', { default: false, type: Boolean, description: ` Prints only filenames when using \`npm diff\`. `, flatten, }) define('diff-no-prefix', { default: false, type: Boolean, description: ` Do not show any source or destination prefix in \`npm diff\` output. Note: this causes \`npm diff\` to ignore the \`--diff-src-prefix\` and \`--diff-dst-prefix\` configs. `, flatten, }) define('diff-dst-prefix', { default: 'b/', hint: '', type: String, description: ` Destination prefix to be used in \`npm diff\` output. `, flatten, }) define('diff-src-prefix', { default: 'a/', hint: '', type: String, description: ` Source prefix to be used in \`npm diff\` output. `, flatten, }) define('diff-text', { default: false, type: Boolean, description: ` Treat all files as text in \`npm diff\`. `, flatten, }) define('diff-unified', { default: 3, type: Number, description: ` The number of lines of context to print in \`npm diff\`. `, flatten, }) define('dry-run', { default: false, type: Boolean, description: ` Indicates that you don't want npm to make any changes and that it should only report what it would have done. This can be passed into any of the commands that modify your local installation, eg, \`install\`, \`update\`, \`dedupe\`, \`uninstall\`, as well as \`pack\` and \`publish\`. Note: This is NOT honored by other network related commands, eg \`dist-tags\`, \`owner\`, etc. `, flatten, }) define('editor', { default: editor, defaultDescription: ` The EDITOR or VISUAL environment variables, or '%SYSTEMROOT%\\notepad.exe' on Windows, or 'vi' on Unix systems `, type: String, description: ` The command to run for \`npm edit\` and \`npm config edit\`. `, flatten, }) define('engine-strict', { default: false, type: Boolean, description: ` If set to true, then npm will stubbornly refuse to install (or even consider installing) any package that claims to not be compatible with the current Node.js version. This can be overridden by setting the \`--force\` flag. `, flatten, }) define('fetch-retries', { default: 2, type: Number, description: ` The "retries" config for the \`retry\` module to use when fetching packages from the registry. npm will retry idempotent read requests to the registry in the case of network failures or 5xx HTTP errors. `, flatten (key, obj, flatOptions) { flatOptions.retry = flatOptions.retry || {} flatOptions.retry.retries = obj[key] }, }) define('fetch-retry-factor', { default: 10, type: Number, description: ` The "factor" config for the \`retry\` module to use when fetching packages. `, flatten (key, obj, flatOptions) { flatOptions.retry = flatOptions.retry || {} flatOptions.retry.factor = obj[key] }, }) define('fetch-retry-maxtimeout', { default: 60000, defaultDescription: '60000 (1 minute)', type: Number, description: ` The "maxTimeout" config for the \`retry\` module to use when fetching packages. `, flatten (key, obj, flatOptions) { flatOptions.retry = flatOptions.retry || {} flatOptions.retry.maxTimeout = obj[key] }, }) define('fetch-retry-mintimeout', { default: 10000, defaultDescription: '10000 (10 seconds)', type: Number, description: ` The "minTimeout" config for the \`retry\` module to use when fetching packages. `, flatten (key, obj, flatOptions) { flatOptions.retry = flatOptions.retry || {} flatOptions.retry.minTimeout = obj[key] }, }) define('fetch-timeout', { default: 5 * 60 * 1000, defaultDescription: `${5 * 60 * 1000} (5 minutes)`, type: Number, description: ` The maximum amount of time to wait for HTTP requests to complete. `, flatten (key, obj, flatOptions) { flatOptions.timeout = obj[key] }, }) define('force', { default: false, type: Boolean, short: 'f', description: ` Removes various protections against unfortunate side effects, common mistakes, unnecessary performance degradation, and malicious input. * Allow clobbering non-npm files in global installs. * Allow the \`npm version\` command to work on an unclean git repository. * Allow deleting the cache folder with \`npm cache clean\`. * Allow installing packages that have an \`engines\` declaration requiring a different version of npm. * Allow installing packages that have an \`engines\` declaration requiring a different version of \`node\`, even if \`--engine-strict\` is enabled. * Allow \`npm audit fix\` to install modules outside your stated dependency range (including SemVer-major changes). * Allow unpublishing all versions of a published package. * Allow conflicting peerDependencies to be installed in the root project. * Implicitly set \`--yes\` during \`npm init\`. * Allow clobbering existing values in \`npm pkg\` * Allow unpublishing of entire packages (not just a single version). If you don't have a clear idea of what you want to do, it is strongly recommended that you do not use this option! `, flatten, }) define('foreground-scripts', { default: false, type: Boolean, description: ` Run all build scripts (ie, \`preinstall\`, \`install\`, and \`postinstall\`) scripts for installed packages in the foreground process, sharing standard input, output, and error with the main npm process. Note that this will generally make installs run slower, and be much noisier, but can be useful for debugging. `, flatten, }) define('format-package-lock', { default: true, type: Boolean, description: ` Format \`package-lock.json\` or \`npm-shrinkwrap.json\` as a human readable file. `, flatten, }) define('fund', { default: true, type: Boolean, description: ` When "true" displays the message at the end of each \`npm install\` acknowledging the number of dependencies looking for funding. See [\`npm fund\`](/commands/npm-fund) for details. `, flatten, }) define('git', { default: 'git', type: String, description: ` The command to use for git commands. If git is installed on the computer, but is not in the \`PATH\`, then set this to the full path to the git binary. `, flatten, }) define('git-tag-version', { default: true, type: Boolean, description: ` Tag the commit when using the \`npm version\` command. Setting this to false results in no commit being made at all. `, flatten, }) define('global', { default: false, type: Boolean, short: 'g', description: ` Operates in "global" mode, so that packages are installed into the \`prefix\` folder instead of the current working directory. See [folders](/configuring-npm/folders) for more on the differences in behavior. * packages are installed into the \`{prefix}/lib/node_modules\` folder, instead of the current working directory. * bin files are linked to \`{prefix}/bin\` * man pages are linked to \`{prefix}/share/man\` `, flatten: (key, obj, flatOptions) => { flatten(key, obj, flatOptions) if (flatOptions.global) { flatOptions.location = 'global' } }, }) // the globalconfig has its default defined outside of this module define('globalconfig', { type: path, default: '', defaultDescription: ` The global --prefix setting plus 'etc/npmrc'. For example, '/usr/local/etc/npmrc' `, description: ` The config file to read for global config options. `, flatten, }) define('global-style', { default: false, type: Boolean, description: ` Only install direct dependencies in the top level \`node_modules\`, but hoist on deeper dependencies. Sets \`--install-strategy=shallow\`. `, deprecated: ` This option has been deprecated in favor of \`--install-strategy=shallow\` `, flatten (key, obj, flatOptions) { if (obj[key]) { obj['install-strategy'] = 'shallow' flatOptions.installStrategy = 'shallow' } }, }) define('heading', { default: 'npm', type: String, description: ` The string that starts all the debugging log output. `, flatten, }) define('https-proxy', { default: null, type: [null, url], description: ` A proxy to use for outgoing https requests. If the \`HTTPS_PROXY\` or \`https_proxy\` or \`HTTP_PROXY\` or \`http_proxy\` environment variables are set, proxy settings will be honored by the underlying \`make-fetch-happen\` library. `, flatten, }) define('if-present', { default: false, type: Boolean, envExport: false, description: ` If true, npm will not exit with an error code when \`run-script\` is invoked for a script that isn't defined in the \`scripts\` section of \`package.json\`. This option can be used when it's desirable to optionally run a script when it's present and fail if the script fails. This is useful, for example, when running scripts that may only apply for some builds in an otherwise generic CI setup. `, flatten, }) define('ignore-scripts', { default: false, type: Boolean, description: ` If true, npm does not run scripts specified in package.json files. Note that commands explicitly intended to run a particular script, such as \`npm start\`, \`npm stop\`, \`npm restart\`, \`npm test\`, and \`npm run-script\` will still run their intended script if \`ignore-scripts\` is set, but they will *not* run any pre- or post-scripts. `, flatten, }) define('include', { default: [], type: [Array, 'prod', 'dev', 'optional', 'peer'], description: ` Option that allows for defining which types of dependencies to install. This is the inverse of \`--omit=\`. Dependency types specified in \`--include\` will not be omitted, regardless of the order in which omit/include are specified on the command-line. `, flatten (key, obj, flatOptions) { // just call the omit flattener, it reads from obj.include definitions.omit.flatten('omit', obj, flatOptions) }, }) define('include-staged', { default: false, type: Boolean, description: ` Allow installing "staged" published packages, as defined by [npm RFC PR #92](https://github.com/npm/rfcs/pull/92). This is experimental, and not implemented by the npm public registry. `, flatten, }) define('include-workspace-root', { default: false, type: Boolean, envExport: false, description: ` Include the workspace root when workspaces are enabled for a command. When false, specifying individual workspaces via the \`workspace\` config, or all workspaces via the \`workspaces\` flag, will cause npm to operate only on the specified workspaces, and not on the root project. `, flatten, }) define('init-author-email', { default: '', type: String, description: ` The value \`npm init\` should use by default for the package author's email. `, }) define('init-author-name', { default: '', type: String, description: ` The value \`npm init\` should use by default for the package author's name. `, }) define('init-author-url', { default: '', type: ['', url], description: ` The value \`npm init\` should use by default for the package author's homepage. `, }) define('init-license', { default: 'ISC', type: String, description: ` The value \`npm init\` should use by default for the package license. `, }) define('init-module', { default: '~/.npm-init.js', type: path, description: ` A module that will be loaded by the \`npm init\` command. See the documentation for the [init-package-json](https://github.com/npm/init-package-json) module for more information, or [npm init](/commands/npm-init). `, }) define('init-version', { default: '1.0.0', type: semver, description: ` The value that \`npm init\` should use by default for the package version number, if not already set in package.json. `, }) // these "aliases" are historically supported in .npmrc files, unfortunately // They should be removed in a future npm version. define('init.author.email', { default: '', type: String, deprecated: ` Use \`--init-author-email\` instead.`, description: ` Alias for \`--init-author-email\` `, }) define('init.author.name', { default: '', type: String, deprecated: ` Use \`--init-author-name\` instead. `, description: ` Alias for \`--init-author-name\` `, }) define('init.author.url', { default: '', type: ['', url], deprecated: ` Use \`--init-author-url\` instead. `, description: ` Alias for \`--init-author-url\` `, }) define('init.license', { default: 'ISC', type: String, deprecated: ` Use \`--init-license\` instead. `, description: ` Alias for \`--init-license\` `, }) define('init.module', { default: '~/.npm-init.js', type: path, deprecated: ` Use \`--init-module\` instead. `, description: ` Alias for \`--init-module\` `, }) define('init.version', { default: '1.0.0', type: semver, deprecated: ` Use \`--init-version\` instead. `, description: ` Alias for \`--init-version\` `, }) define('install-links', { default: false, type: Boolean, description: ` When set file: protocol dependencies will be packed and installed as regular dependencies instead of creating a symlink. This option has no effect on workspaces. `, flatten, }) define('install-strategy', { default: 'hoisted', type: ['hoisted', 'nested', 'shallow', 'linked'], description: ` Sets the strategy for installing packages in node_modules. hoisted (default): Install non-duplicated in top-level, and duplicated as necessary within directory structure. nested: (formerly --legacy-bundling) install in place, no hoisting. shallow (formerly --global-style) only install direct deps at top-level. linked: (experimental) install in node_modules/.store, link in place, unhoisted. `, flatten, }) define('json', { default: false, type: Boolean, description: ` Whether or not to output JSON data, rather than the normal output. * In \`npm pkg set\` it enables parsing set values with JSON.parse() before saving them to your \`package.json\`. Not supported by all npm commands. `, flatten, }) define('key', { default: null, type: [null, String], description: ` A client key to pass when accessing the registry. Values should be in PEM format with newlines replaced by the string "\\n". For example: \`\`\`ini key="-----BEGIN PRIVATE KEY-----\\nXXXX\\nXXXX\\n-----END PRIVATE KEY-----" \`\`\` It is _not_ the path to a key file, though you can set a registry-scoped "keyfile" path like "//other-registry.tld/:keyfile=/path/to/key.pem". `, deprecated: ` \`key\` and \`cert\` are no longer used for most registry operations. Use registry scoped \`keyfile\` and \`certfile\` instead. Example: //other-registry.tld/:keyfile=/path/to/key.pem //other-registry.tld/:certfile=/path/to/cert.crt `, flatten, }) define('legacy-bundling', { default: false, type: Boolean, description: ` Instead of hoisting package installs in \`node_modules\`, install packages in the same manner that they are depended on. This may cause very deep directory structures and duplicate package installs as there is no de-duplicating. Sets \`--install-strategy=nested\`. `, deprecated: ` This option has been deprecated in favor of \`--install-strategy=nested\` `, flatten (key, obj, flatOptions) { if (obj[key]) { obj['install-strategy'] = 'nested' flatOptions.installStrategy = 'nested' } }, }) define('legacy-peer-deps', { default: false, type: Boolean, description: ` Causes npm to completely ignore \`peerDependencies\` when building a package tree, as in npm versions 3 through 6. If a package cannot be installed because of overly strict \`peerDependencies\` that collide, it provides a way to move forward resolving the situation. This differs from \`--omit=peer\`, in that \`--omit=peer\` will avoid unpacking \`peerDependencies\` on disk, but will still design a tree such that \`peerDependencies\` _could_ be unpacked in a correct place. Use of \`legacy-peer-deps\` is not recommended, as it will not enforce the \`peerDependencies\` contract that meta-dependencies may rely on. `, flatten, }) define('link', { default: false, type: Boolean, description: ` Used with \`npm ls\`, limiting output to only those packages that are linked. `, }) define('local-address', { default: null, type: getLocalAddresses(), typeDescription: 'IP Address', description: ` The IP address of the local interface to use when making connections to the npm registry. Must be IPv4 in versions of Node prior to 0.12. `, flatten, }) define('location', { default: 'user', short: 'L', type: [ 'global', 'user', 'project', ], defaultDescription: ` "user" unless \`--global\` is passed, which will also set this value to "global" `, description: ` When passed to \`npm config\` this refers to which config file to use. When set to "global" mode, packages are installed into the \`prefix\` folder instead of the current working directory. See [folders](/configuring-npm/folders) for more on the differences in behavior. * packages are installed into the \`{prefix}/lib/node_modules\` folder, instead of the current working directory. * bin files are linked to \`{prefix}/bin\` * man pages are linked to \`{prefix}/share/man\` `, flatten: (key, obj, flatOptions) => { flatten(key, obj, flatOptions) if (flatOptions.global) { flatOptions.location = 'global' } if (obj.location === 'global') { flatOptions.global = true } }, }) define('lockfile-version', { default: null, type: [null, 1, 2, 3, '1', '2', '3'], defaultDescription: ` Version 3 if no lockfile, auto-converting v1 lockfiles to v3, otherwise maintain current lockfile version.`, description: ` Set the lockfile format version to be used in package-lock.json and npm-shrinkwrap-json files. Possible options are: 1: The lockfile version used by npm versions 5 and 6. Lacks some data that is used during the install, resulting in slower and possibly less deterministic installs. Prevents lockfile churn when interoperating with older npm versions. 2: The default lockfile version used by npm version 7 and 8. Includes both the version 1 lockfile data and version 3 lockfile data, for maximum determinism and interoperability, at the expense of more bytes on disk. 3: Only the new lockfile information introduced in npm version 7. Smaller on disk than lockfile version 2, but not interoperable with older npm versions. Ideal if all users are on npm version 7 and higher. `, flatten: (key, obj, flatOptions) => { flatOptions.lockfileVersion = obj[key] && parseInt(obj[key], 10) }, }) define('loglevel', { default: 'notice', type: [ 'silent', 'error', 'warn', 'notice', 'http', 'info', 'verbose', 'silly', ], description: ` What level of logs to report. All logs are written to a debug log, with the path to that file printed if the execution of a command fails. Any logs of a higher level than the setting are shown. The default is "notice". See also the \`foreground-scripts\` config. `, flatten (key, obj, flatOptions) { flatOptions.silent = obj[key] === 'silent' }, }) define('logs-dir', { default: null, type: [null, path], defaultDescription: ` A directory named \`_logs\` inside the cache `, description: ` The location of npm's log directory. See [\`npm logging\`](/using-npm/logging) for more information. `, }) define('logs-max', { default: 10, type: Number, description: ` The maximum number of log files to store. If set to 0, no log files will be written for the current run. `, }) define('long', { default: false, type: Boolean, short: 'l', description: ` Show extended information in \`ls\`, \`search\`, and \`help-search\`. `, }) define('maxsockets', { default: 15, type: Number, description: ` The maximum number of connections to use per origin (protocol/host/port combination). `, flatten (key, obj, flatOptions) { flatOptions.maxSockets = obj[key] }, }) define('message', { default: '%s', type: String, short: 'm', description: ` Commit message which is used by \`npm version\` when creating version commit. Any "%s" in the message will be replaced with the version number. `, flatten, }) define('node-options', { default: null, type: [null, String], description: ` Options to pass through to Node.js via the \`NODE_OPTIONS\` environment variable. This does not impact how npm itself is executed but it does impact how lifecycle scripts are called. `, }) define('noproxy', { default: '', defaultDescription: ` The value of the NO_PROXY environment variable `, type: [String, Array], description: ` Domain extensions that should bypass any proxies. Also accepts a comma-delimited string. `, flatten (key, obj, flatOptions) { if (Array.isArray(obj[key])) { flatOptions.noProxy = obj[key].join(',') } else { flatOptions.noProxy = obj[key] } }, }) define('offline', { default: false, type: Boolean, description: ` Force offline mode: no network requests will be done during install. To allow the CLI to fill in missing cache data, see \`--prefer-offline\`. `, flatten, }) define('omit', { default: process.env.NODE_ENV === 'production' ? ['dev'] : [], defaultDescription: ` 'dev' if the \`NODE_ENV\` environment variable is set to 'production', otherwise empty. `, type: [Array, 'dev', 'optional', 'peer'], description: ` Dependency types to omit from the installation tree on disk. Note that these dependencies _are_ still resolved and added to the \`package-lock.json\` or \`npm-shrinkwrap.json\` file. They are just not physically installed on disk. If a package type appears in both the \`--include\` and \`--omit\` lists, then it will be included. If the resulting omit list includes \`'dev'\`, then the \`NODE_ENV\` environment variable will be set to \`'production'\` for all lifecycle scripts. `, flatten (key, obj, flatOptions) { flatOptions.omit = buildOmitList(obj) }, }) define('omit-lockfile-registry-resolved', { default: false, type: Boolean, description: ` This option causes npm to create lock files without a \`resolved\` key for registry dependencies. Subsequent installs will need to resolve tarball endpoints with the configured registry, likely resulting in a longer install time. `, flatten, }) define('only', { default: null, type: [null, 'prod', 'production'], deprecated: ` Use \`--omit=dev\` to omit dev dependencies from the install. `, description: ` When set to \`prod\` or \`production\`, this is an alias for \`--omit=dev\`. `, flatten (key, obj, flatOptions) { definitions.omit.flatten('omit', obj, flatOptions) }, }) define('optional', { default: null, type: [null, Boolean], deprecated: ` Use \`--omit=optional\` to exclude optional dependencies, or \`--include=optional\` to include them. Default value does install optional deps unless otherwise omitted. `, description: ` Alias for --include=optional or --omit=optional `, flatten (key, obj, flatOptions) { definitions.omit.flatten('omit', obj, flatOptions) }, }) define('otp', { default: null, type: [null, String], description: ` This is a one-time password from a two-factor authenticator. It's needed when publishing or changing package permissions with \`npm access\`. If not set, and a registry response fails with a challenge for a one-time password, npm will prompt on the command line for one. `, flatten (key, obj, flatOptions) { flatten(key, obj, flatOptions) if (obj.otp) { obj['auth-type'] = 'legacy' flatten('auth-type', obj, flatOptions) } }, }) define('package', { default: [], hint: '', type: [String, Array], description: ` The package or packages to install for [\`npm exec\`](/commands/npm-exec) `, flatten, }) define('package-lock', { default: true, type: Boolean, description: ` If set to false, then ignore \`package-lock.json\` files when installing. This will also prevent _writing_ \`package-lock.json\` if \`save\` is true. This configuration does not affect \`npm ci\`. `, flatten: (key, obj, flatOptions) => { flatten(key, obj, flatOptions) if (flatOptions.packageLockOnly) { flatOptions.packageLock = true } }, }) define('package-lock-only', { default: false, type: Boolean, description: ` If set to true, the current operation will only use the \`package-lock.json\`, ignoring \`node_modules\`. For \`update\` this means only the \`package-lock.json\` will be updated, instead of checking \`node_modules\` and downloading dependencies. For \`list\` this means the output will be based on the tree described by the \`package-lock.json\`, rather than the contents of \`node_modules\`. `, flatten: (key, obj, flatOptions) => { flatten(key, obj, flatOptions) if (flatOptions.packageLockOnly) { flatOptions.packageLock = true } }, }) define('pack-destination', { default: '.', type: String, description: ` Directory in which \`npm pack\` will save tarballs. `, flatten, }) define('parseable', { default: false, type: Boolean, short: 'p', description: ` Output parseable results from commands that write to standard output. For \`npm search\`, this will be tab-separated table format. `, flatten, }) define('prefer-offline', { default: false, type: Boolean, description: ` If true, staleness checks for cached data will be bypassed, but missing data will be requested from the server. To force full offline mode, use \`--offline\`. `, flatten, }) define('prefer-online', { default: false, type: Boolean, description: ` If true, staleness checks for cached data will be forced, making the CLI look for updates immediately even for fresh package data. `, flatten, }) // `prefix` has its default defined outside of this module define('prefix', { type: path, short: 'C', default: '', defaultDescription: ` In global mode, the folder where the node executable is installed. Otherwise, the nearest parent folder containing either a package.json file or a node_modules folder. `, description: ` The location to install global items. If set on the command line, then it forces non-global commands to run in the specified folder. `, }) define('preid', { default: '', hint: 'prerelease-id', type: String, description: ` The "prerelease identifier" to use as a prefix for the "prerelease" part of a semver. Like the \`rc\` in \`1.2.0-rc.8\`. `, flatten, }) define('production', { default: null, type: [null, Boolean], deprecated: 'Use `--omit=dev` instead.', description: 'Alias for `--omit=dev`', flatten (key, obj, flatOptions) { definitions.omit.flatten('omit', obj, flatOptions) }, }) define('progress', { default: !ciInfo.isCI, defaultDescription: ` \`true\` unless running in a known CI system `, type: Boolean, description: ` When set to \`true\`, npm will display a progress bar during time intensive operations, if \`process.stderr\` is a TTY. Set to \`false\` to suppress the progress bar. `, flatten (key, obj, flatOptions) { flatOptions.progress = !obj.progress ? false : !!process.stderr.isTTY && process.env.TERM !== 'dumb' }, }) define('provenance', { default: false, type: Boolean, description: ` Indicates that a provenance statement should be generated. `, flatten, }) define('proxy', { default: null, type: [null, false, url], // allow proxy to be disabled explicitly description: ` A proxy to use for outgoing http requests. If the \`HTTP_PROXY\` or \`http_proxy\` environment variables are set, proxy settings will be honored by the underlying \`request\` library. `, flatten, }) define('read-only', { default: false, type: Boolean, description: ` This is used to mark a token as unable to publish when configuring limited access tokens with the \`npm token create\` command. `, flatten, }) define('rebuild-bundle', { default: true, type: Boolean, description: ` Rebuild bundled dependencies after installation. `, flatten, }) define('registry', { default: 'https://registry.npmjs.org/', type: url, description: ` The base URL of the npm registry. `, flatten, }) define('replace-registry-host', { default: 'npmjs', hint: ' | hostname', type: ['npmjs', 'never', 'always', String], description: ` Defines behavior for replacing the registry host in a lockfile with the configured registry. The default behavior is to replace package dist URLs from the default registry (https://registry.npmjs.org) to the configured registry. If set to "never", then use the registry value. If set to "always", then replace the registry host with the configured host every time. You may also specify a bare hostname (e.g., "registry.npmjs.org"). `, flatten, }) define('save', { default: true, defaultDescription: `\`true\` unless when using \`npm update\` where it defaults to \`false\``, usage: '-S|--save|--no-save|--save-prod|--save-dev|--save-optional|--save-peer|--save-bundle', type: Boolean, short: 'S', description: ` Save installed packages to a \`package.json\` file as dependencies. When used with the \`npm rm\` command, removes the dependency from \`package.json\`. Will also prevent writing to \`package-lock.json\` if set to \`false\`. `, flatten, }) define('save-bundle', { default: false, type: Boolean, short: 'B', description: ` If a package would be saved at install time by the use of \`--save\`, \`--save-dev\`, or \`--save-optional\`, then also put it in the \`bundleDependencies\` list. Ignored if \`--save-peer\` is set, since peerDependencies cannot be bundled. `, flatten (key, obj, flatOptions) { // XXX update arborist to just ignore it if resulting saveType is peer // otherwise this won't have the expected effect: // // npm config set save-peer true // npm i foo --save-bundle --save-prod <-- should bundle flatOptions.saveBundle = obj['save-bundle'] && !obj['save-peer'] }, }) // XXX: We should really deprecate all these `--save-blah` switches // in favor of a single `--save-type` option. The unfortunate shortcut // we took for `--save-peer --save-optional` being `--save-type=peerOptional` // makes this tricky, and likely a breaking change. define('save-dev', { default: false, type: Boolean, short: 'D', description: ` Save installed packages to a package.json file as \`devDependencies\`. `, flatten (key, obj, flatOptions) { if (!obj[key]) { if (flatOptions.saveType === 'dev') { delete flatOptions.saveType } return } flatOptions.saveType = 'dev' }, }) define('save-exact', { default: false, type: Boolean, short: 'E', description: ` Dependencies saved to package.json will be configured with an exact version rather than using npm's default semver range operator. `, flatten (key, obj, flatOptions) { // just call the save-prefix flattener, it reads from obj['save-exact'] definitions['save-prefix'].flatten('save-prefix', obj, flatOptions) }, }) define('save-optional', { default: false, type: Boolean, short: 'O', description: ` Save installed packages to a package.json file as \`optionalDependencies\`. `, flatten (key, obj, flatOptions) { if (!obj[key]) { if (flatOptions.saveType === 'optional') { delete flatOptions.saveType } else if (flatOptions.saveType === 'peerOptional') { flatOptions.saveType = 'peer' } return } if (flatOptions.saveType === 'peerOptional') { return } if (flatOptions.saveType === 'peer') { flatOptions.saveType = 'peerOptional' } else { flatOptions.saveType = 'optional' } }, }) define('save-peer', { default: false, type: Boolean, description: ` Save installed packages to a package.json file as \`peerDependencies\` `, flatten (key, obj, flatOptions) { if (!obj[key]) { if (flatOptions.saveType === 'peer') { delete flatOptions.saveType } else if (flatOptions.saveType === 'peerOptional') { flatOptions.saveType = 'optional' } return } if (flatOptions.saveType === 'peerOptional') { return } if (flatOptions.saveType === 'optional') { flatOptions.saveType = 'peerOptional' } else { flatOptions.saveType = 'peer' } }, }) define('save-prefix', { default: '^', type: String, description: ` Configure how versions of packages installed to a package.json file via \`--save\` or \`--save-dev\` get prefixed. For example if a package has version \`1.2.3\`, by default its version is set to \`^1.2.3\` which allows minor upgrades for that package, but after \`npm config set save-prefix='~'\` it would be set to \`~1.2.3\` which only allows patch upgrades. `, flatten (key, obj, flatOptions) { flatOptions.savePrefix = obj['save-exact'] ? '' : obj['save-prefix'] obj['save-prefix'] = flatOptions.savePrefix }, }) define('save-prod', { default: false, type: Boolean, short: 'P', description: ` Save installed packages into \`dependencies\` specifically. This is useful if a package already exists in \`devDependencies\` or \`optionalDependencies\`, but you want to move it to be a non-optional production dependency. This is the default behavior if \`--save\` is true, and neither \`--save-dev\` or \`--save-optional\` are true. `, flatten (key, obj, flatOptions) { if (!obj[key]) { if (flatOptions.saveType === 'prod') { delete flatOptions.saveType } return } flatOptions.saveType = 'prod' }, }) define('scope', { default: '', defaultDescription: ` the scope of the current project, if any, or "" `, type: String, hint: '<@scope>', description: ` Associate an operation with a scope for a scoped registry. Useful when logging in to or out of a private registry: \`\`\` # log in, linking the scope to the custom registry npm login --scope=@mycorp --registry=https://registry.mycorp.com # log out, removing the link and the auth token npm logout --scope=@mycorp \`\`\` This will cause \`@mycorp\` to be mapped to the registry for future installation of packages specified according to the pattern \`@mycorp/package\`. This will also cause \`npm init\` to create a scoped package. \`\`\` # accept all defaults, and create a package named "@foo/whatever", # instead of just named "whatever" npm init --scope=@foo --yes \`\`\` `, flatten (key, obj, flatOptions) { const value = obj[key] const scope = value && !/^@/.test(value) ? `@${value}` : value flatOptions.scope = scope // projectScope is kept for compatibility with npm-registry-fetch flatOptions.projectScope = scope }, }) define('script-shell', { default: null, defaultDescription: ` '/bin/sh' on POSIX systems, 'cmd.exe' on Windows `, type: [null, String], description: ` The shell to use for scripts run with the \`npm exec\`, \`npm run\` and \`npm init \` commands. `, flatten (key, obj, flatOptions) { flatOptions.scriptShell = obj[key] || undefined }, }) define('searchexclude', { default: '', type: String, description: ` Space-separated options that limit the results from search. `, flatten (key, obj, flatOptions) { flatOptions.search = flatOptions.search || { limit: 20 } flatOptions.search.exclude = obj[key].toLowerCase() }, }) define('searchlimit', { default: 20, type: Number, description: ` Number of items to limit search results to. Will not apply at all to legacy searches. `, flatten (key, obj, flatOptions) { flatOptions.search = flatOptions.search || {} flatOptions.search.limit = obj[key] }, }) define('searchopts', { default: '', type: String, description: ` Space-separated options that are always passed to search. `, flatten (key, obj, flatOptions) { flatOptions.search = flatOptions.search || { limit: 20 } flatOptions.search.opts = querystring.parse(obj[key]) }, }) define('searchstaleness', { default: 15 * 60, type: Number, description: ` The age of the cache, in seconds, before another registry request is made if using legacy search endpoint. `, flatten (key, obj, flatOptions) { flatOptions.search = flatOptions.search || { limit: 20 } flatOptions.search.staleness = obj[key] }, }) define('shell', { default: shell, defaultDescription: ` SHELL environment variable, or "bash" on Posix, or "cmd.exe" on Windows `, type: String, description: ` The shell to run for the \`npm explore\` command. `, flatten, }) define('shrinkwrap', { default: true, type: Boolean, deprecated: ` Use the --package-lock setting instead. `, description: ` Alias for --package-lock `, flatten (key, obj, flatOptions) { obj['package-lock'] = obj.shrinkwrap definitions['package-lock'].flatten('package-lock', obj, flatOptions) }, }) define('sign-git-commit', { default: false, type: Boolean, description: ` If set to true, then the \`npm version\` command will commit the new package version using \`-S\` to add a signature. Note that git requires you to have set up GPG keys in your git configs for this to work properly. `, flatten, }) define('sign-git-tag', { default: false, type: Boolean, description: ` If set to true, then the \`npm version\` command will tag the version using \`-s\` to add a signature. Note that git requires you to have set up GPG keys in your git configs for this to work properly. `, flatten, }) define('strict-peer-deps', { default: false, type: Boolean, description: ` If set to \`true\`, and \`--legacy-peer-deps\` is not set, then _any_ conflicting \`peerDependencies\` will be treated as an install failure, even if npm could reasonably guess the appropriate resolution based on non-peer dependency relationships. By default, conflicting \`peerDependencies\` deep in the dependency graph will be resolved using the nearest non-peer dependency specification, even if doing so will result in some packages receiving a peer dependency outside the range set in their package's \`peerDependencies\` object. When such an override is performed, a warning is printed, explaining the conflict and the packages involved. If \`--strict-peer-deps\` is set, then this warning is treated as a failure. `, flatten, }) define('strict-ssl', { default: true, type: Boolean, description: ` Whether or not to do SSL key validation when making requests to the registry via https. See also the \`ca\` config. `, flatten (key, obj, flatOptions) { flatOptions.strictSSL = obj[key] }, }) define('tag', { default: 'latest', type: String, description: ` If you ask npm to install a package and don't tell it a specific version, then it will install the specified tag. Also the tag that is added to the package@version specified by the \`npm tag\` command, if no explicit tag is given. When used by the \`npm diff\` command, this is the tag used to fetch the tarball that will be compared with the local files by default. `, flatten (key, obj, flatOptions) { flatOptions.defaultTag = obj[key] }, }) define('tag-version-prefix', { default: 'v', type: String, description: ` If set, alters the prefix used when tagging a new version when performing a version increment using \`npm version\`. To remove the prefix altogether, set it to the empty string: \`""\`. Because other tools may rely on the convention that npm version tags look like \`v1.0.0\`, _only use this property if it is absolutely necessary_. In particular, use care when overriding this setting for public packages. `, flatten, }) define('timing', { default: false, type: Boolean, description: ` If true, writes timing information to a process specific json file in the cache or \`logs-dir\`. The file name ends with \`-timing.json\`. You can quickly view it with this [json](https://npm.im/json) command line: \`cat ~/.npm/_logs/*-timing.json | npm exec -- json -g\`. Timing information will also be reported in the terminal. To suppress this while still writing the timing file, use \`--silent\`. `, }) define('tmp', { default: tmpdir(), defaultDescription: ` The value returned by the Node.js \`os.tmpdir()\` method `, type: path, deprecated: ` This setting is no longer used. npm stores temporary files in a special location in the cache, and they are managed by [\`cacache\`](http://npm.im/cacache). `, description: ` Historically, the location where temporary files were stored. No longer relevant. `, }) define('umask', { default: 0, type: Umask, description: ` The "umask" value to use when setting the file creation mode on files and folders. Folders and executables are given a mode which is \`0o777\` masked against this value. Other files are given a mode which is \`0o666\` masked against this value. Note that the underlying system will _also_ apply its own umask value to files and folders that are created, and npm does not circumvent this, but rather adds the \`--umask\` config to it. Thus, the effective default umask value on most POSIX systems is 0o22, meaning that folders and executables are created with a mode of 0o755 and other files are created with a mode of 0o644. `, flatten, }) define('unicode', { default: unicode, defaultDescription: ` false on windows, true on mac/unix systems with a unicode locale, as defined by the \`LC_ALL\`, \`LC_CTYPE\`, or \`LANG\` environment variables. `, type: Boolean, description: ` When set to true, npm uses unicode characters in the tree output. When false, it uses ascii characters instead of unicode glyphs. `, flatten, }) define('update-notifier', { default: true, type: Boolean, description: ` Set to false to suppress the update notification when using an older version of npm than the latest. `, }) define('usage', { default: false, type: Boolean, short: ['?', 'H', 'h'], description: ` Show short usage output about the command specified. `, }) define('user-agent', { default: 'npm/{npm-version} ' + 'node/{node-version} ' + '{platform} ' + '{arch} ' + 'workspaces/{workspaces} ' + '{ci}', type: String, description: ` Sets the User-Agent request header. The following fields are replaced with their actual counterparts: * \`{npm-version}\` - The npm version in use * \`{node-version}\` - The Node.js version in use * \`{platform}\` - The value of \`process.platform\` * \`{arch}\` - The value of \`process.arch\` * \`{workspaces}\` - Set to \`true\` if the \`workspaces\` or \`workspace\` options are set. * \`{ci}\` - The value of the \`ci-name\` config, if set, prefixed with \`ci/\`, or an empty string if \`ci-name\` is empty. `, flatten (key, obj, flatOptions) { const value = obj[key] const ciName = obj['ci-name'] let inWorkspaces = false if (obj.workspaces || obj.workspace && obj.workspace.length) { inWorkspaces = true } flatOptions.userAgent = value.replace(/\{node-version\}/gi, process.version) .replace(/\{npm-version\}/gi, npmVersion) .replace(/\{platform\}/gi, process.platform) .replace(/\{arch\}/gi, process.arch) .replace(/\{workspaces\}/gi, inWorkspaces) .replace(/\{ci\}/gi, ciName ? `ci/${ciName}` : '') .trim() // We can't clobber the original or else subsequent flattening will fail // (i.e. when we change the underlying config values) // obj[key] = flatOptions.userAgent // user-agent is a unique kind of config item that gets set from a template // and ends up translated. Because of this, the normal "should we set this // to process.env also doesn't work process.env.npm_config_user_agent = flatOptions.userAgent }, }) define('userconfig', { default: '~/.npmrc', type: path, description: ` The location of user-level configuration settings. This may be overridden by the \`npm_config_userconfig\` environment variable or the \`--userconfig\` command line option, but may _not_ be overridden by settings in the \`globalconfig\` file. `, }) define('version', { default: false, type: Boolean, short: 'v', description: ` If true, output the npm version and exit successfully. Only relevant when specified explicitly on the command line. `, }) define('versions', { default: false, type: Boolean, description: ` If true, output the npm version as well as node's \`process.versions\` map and the version in the current working directory's \`package.json\` file if one exists, and exit successfully. Only relevant when specified explicitly on the command line. `, }) define('viewer', { default: isWindows ? 'browser' : 'man', defaultDescription: ` "man" on Posix, "browser" on Windows `, type: String, description: ` The program to use to view help content. Set to \`"browser"\` to view html help content in the default web browser. `, }) define('which', { default: null, hint: '', type: [null, Number], description: ` If there are multiple funding sources, which 1-indexed source URL to open. `, }) define('workspace', { default: [], type: [String, Array], hint: '', short: 'w', envExport: false, description: ` Enable running a command in the context of the configured workspaces of the current project while filtering by running only the workspaces defined by this configuration option. Valid values for the \`workspace\` config are either: * Workspace names * Path to a workspace directory * Path to a parent workspace directory (will result in selecting all workspaces within that folder) When set for the \`npm init\` command, this may be set to the folder of a workspace which does not yet exist, to create the folder and set it up as a brand new workspace within the project. `, flatten: (key, obj, flatOptions) => { definitions['user-agent'].flatten('user-agent', obj, flatOptions) }, }) define('workspaces', { default: null, type: [null, Boolean], short: 'ws', envExport: false, description: ` Set to true to run the command in the context of **all** configured workspaces. Explicitly setting this to false will cause commands like \`install\` to ignore workspaces altogether. When not set explicitly: - Commands that operate on the \`node_modules\` tree (install, update, etc.) will link workspaces into the \`node_modules\` folder. - Commands that do other things (test, exec, publish, etc.) will operate on the root project, _unless_ one or more workspaces are specified in the \`workspace\` config. `, flatten: (key, obj, flatOptions) => { definitions['user-agent'].flatten('user-agent', obj, flatOptions) // TODO: this is a derived value, and should be reworked when we have a // pattern for derived value // workspacesEnabled is true whether workspaces is null or true // commands contextually work with workspaces or not regardless of // configuration, so we need an option specifically to disable workspaces flatOptions.workspacesEnabled = obj[key] !== false }, }) define('workspaces-update', { default: true, type: Boolean, description: ` If set to true, the npm cli will run an update after operations that may possibly change the workspaces installed to the \`node_modules\` folder. `, flatten, }) define('yes', { default: null, type: [null, Boolean], short: 'y', description: ` Automatically answer "yes" to any prompts that npm might print on the command line. `, }) PK! _ index.jsnu[const definitions = require('./definitions.js') // use the defined flattening function, and copy over any scoped // registries and registry-specific "nerfdart" configs verbatim // // TODO: make these getters so that we only have to make dirty // the thing that changed, and then flatten the fields that // could have changed when a config.set is called. // // TODO: move nerfdart auth stuff into a nested object that // is only passed along to paths that end up calling npm-registry-fetch. const flatten = (obj, flat = {}) => { for (const [key, val] of Object.entries(obj)) { const def = definitions[key] if (def && def.flatten) { def.flatten(key, obj, flat) } else if (/@.*:registry$/i.test(key) || /^\/\//.test(key)) { flat[key] = val } } // XXX make this the bin/npm-cli.js file explicitly instead // otherwise using npm programmatically is a bit of a pain. flat.npmBin = require.main ? require.main.filename : /* istanbul ignore next - not configurable property */ undefined flat.nodeBin = process.env.NODE || process.execPath // XXX should this be sha512? is it even relevant? flat.hashAlgorithm = 'sha1' return flat } // aliases where they get expanded into a completely different thing // these are NOT supported in the environment or npmrc files, only // expanded on the CLI. // TODO: when we switch off of nopt, use an arg parser that supports // more reasonable aliasing and short opts right in the definitions set. const shorthands = { 'enjoy-by': ['--before'], d: ['--loglevel', 'info'], dd: ['--loglevel', 'verbose'], ddd: ['--loglevel', 'silly'], quiet: ['--loglevel', 'warn'], q: ['--loglevel', 'warn'], s: ['--loglevel', 'silent'], silent: ['--loglevel', 'silent'], verbose: ['--loglevel', 'verbose'], desc: ['--description'], help: ['--usage'], local: ['--no-global'], n: ['--no-yes'], no: ['--no-yes'], porcelain: ['--parseable'], readonly: ['--read-only'], reg: ['--registry'], iwr: ['--include-workspace-root'], ...Object.entries(definitions).reduce((acc, [key, { short = [] }]) => { // can be either an array or string for (const s of [].concat(short)) { acc[s] = [`--${key}`] } return acc }, {}), } module.exports = { get defaults () { // NB: 'default' is a reserved word return Object.entries(definitions).reduce((acc, [key, { default: d }]) => { acc[key] = d return acc }, {}) }, definitions, flatten, shorthands, } PK!];mm definition.jsnu[// class that describes a config key we know about // this keeps us from defining a config key and not // providing a default, description, etc. // // TODO: some kind of categorization system, so we can // say "these are for registry access", "these are for // version resolution" etc. const required = ['type', 'description', 'default', 'key'] const allowed = [ 'default', 'defaultDescription', 'deprecated', 'description', 'flatten', 'hint', 'key', 'short', 'type', 'typeDescription', 'usage', 'envExport', ] const { typeDefs: { semver: { type: semver }, Umask: { type: Umask }, url: { type: url }, path: { type: path }, }, } = require('@npmcli/config') class Definition { constructor (key, def) { this.key = key // if it's set falsey, don't export it, otherwise we do by default this.envExport = true Object.assign(this, def) this.validate() if (!this.defaultDescription) { this.defaultDescription = describeValue(this.default) } if (!this.typeDescription) { this.typeDescription = describeType(this.type) } // hint is only used for non-boolean values if (!this.hint) { if (this.type === Number) { this.hint = '' } else { this.hint = `<${this.key}>` } } if (!this.usage) { this.usage = describeUsage(this) } } validate () { for (const req of required) { if (!Object.prototype.hasOwnProperty.call(this, req)) { throw new Error(`config lacks ${req}: ${this.key}`) } } if (!this.key) { throw new Error(`config lacks key: ${this.key}`) } for (const field of Object.keys(this)) { if (!allowed.includes(field)) { throw new Error(`config defines unknown field ${field}: ${this.key}`) } } } // a textual description of this config, suitable for help output describe () { const description = unindent(this.description) const noEnvExport = this.envExport ? '' : ` This value is not exported to the environment for child processes. ` const deprecated = !this.deprecated ? '' : `* DEPRECATED: ${unindent(this.deprecated)}\n` return wrapAll(`#### \`${this.key}\` * Default: ${unindent(this.defaultDescription)} * Type: ${unindent(this.typeDescription)} ${deprecated} ${description} ${noEnvExport}`) } } const describeUsage = def => { let key = '' // Single type if (!Array.isArray(def.type)) { if (def.short) { key = `-${def.short}|` } if (def.type === Boolean && def.default !== false) { key = `${key}--no-${def.key}` } else { key = `${key}--${def.key}` } if (def.type !== Boolean) { key = `${key} ${def.hint}` } return key } key = `--${def.key}` if (def.short) { key = `-${def.short}|--${def.key}` } // Multiple types let types = def.type const multiple = types.includes(Array) const bool = types.includes(Boolean) // null type means optional and doesn't currently affect usage output since // all non-optional params have defaults so we render everything as optional types = types.filter(t => t !== null && t !== Array && t !== Boolean) if (!types.length) { return key } let description if (!types.some(t => typeof t !== 'string')) { // Specific values, use specifics given description = `<${types.filter(d => d).join('|')}>` } else { // Generic values, use hint description = def.hint } if (bool) { // Currently none of our multi-type configs with boolean values default to // false so all their hints should show `--no-`, if we ever add ones that // default to false we can branch the logic here key = `--no-${def.key}|${key}` } const usage = `${key} ${description}` if (multiple) { return `${usage} [${usage} ...]` } else { return usage } } const describeType = type => { if (Array.isArray(type)) { const descriptions = type.filter(t => t !== Array).map(t => describeType(t)) // [a] => "a" // [a, b] => "a or b" // [a, b, c] => "a, b, or c" // [a, Array] => "a (can be set multiple times)" // [a, Array, b] => "a or b (can be set multiple times)" const last = descriptions.length > 1 ? [descriptions.pop()] : [] const oxford = descriptions.length > 1 ? ', or ' : ' or ' const words = [descriptions.join(', ')].concat(last).join(oxford) const multiple = type.includes(Array) ? ' (can be set multiple times)' : '' return `${words}${multiple}` } // Note: these are not quite the same as the description printed // when validation fails. In that case, we want to give the user // a bit more information to help them figure out what's wrong. switch (type) { case String: return 'String' case Number: return 'Number' case Umask: return 'Octal numeric string in range 0000..0777 (0..511)' case Boolean: return 'Boolean' case Date: return 'Date' case path: return 'Path' case semver: return 'SemVer string' case url: return 'URL' default: return describeValue(type) } } // if it's a string, quote it. otherwise, just cast to string. const describeValue = val => (typeof val === 'string' ? JSON.stringify(val) : String(val)) const unindent = s => { // get the first \n followed by a bunch of spaces, and pluck off // that many spaces from the start of every line. const match = s.match(/\n +/) return !match ? s.trim() : s.split(match[0]).join('\n').trim() } const wrap = s => { const cols = Math.min(Math.max(20, process.stdout.columns) || 80, 80) - 5 return unindent(s) .split(/[ \n]+/) .reduce((left, right) => { const last = left.split('\n').pop() const join = last.length && last.length + right.length > cols ? '\n' : ' ' return left + join + right }) } const wrapAll = s => { let inCodeBlock = false return s .split('\n\n') .map(block => { if (inCodeBlock || block.startsWith('```')) { inCodeBlock = !block.endsWith('```') return block } if (block.charAt(0) === '*') { return ( '* ' + block .slice(1) .trim() .split('\n* ') .map(li => { return wrap(li).replace(/\n/g, '\n ') }) .join('\n* ') ) } else { return wrap(block) } }) .join('\n\n') } module.exports = Definition PK!~pp$__pycache__/__init__.cpython-311.pycnu[ idZddlmZddlmZmZmZddlmZddl m Z ede Z d Z d e d e fd Z e e jZe e jZdS)zVFor backward compatibility, expose main functions from ``setuptools.config.setupcfg`` )wraps)CallableTypeVarcast)SetuptoolsDeprecationWarning)setupcfgFn)bound)parse_configurationread_configurationfnreturncbtfd}tt|S)Nc ztjddtdjdtjd|i|S)NzDeprecated API usage.zZ As setuptools moves its configuration towards `pyproject.toml`, `.zG` became deprecated. For the time being, you can use the `a` module to access a backward compatible API, but this module is provisional and might be removed in the future. To read project metadata, consider using ``build.util.project_wheel_metadata`` (https://pypi.org/project/build/). For simple scenarios, you can also try parsing the file directly with the help of ``configparser``. )remit__name__r )argskwargsrs Q/opt/imunify360/venv/lib64/python3.11/site-packages/setuptools/config/__init__.py_wrapperz%_deprecation_notice.._wrappersj$) #     3;2C      $r4"6""")rrr )rrs` r_deprecation_noticers> 2YY####Y#* H  rN)__doc__ functoolsrtypingrrrwarningsrr r __all__rrr rrr#s**********333333 WT""" 7B24)()DEE))(*FGGrPK! ~::)__pycache__/configuration.cpython-311.pycnu[ |oiQ6ddlZddlZddlmZddlmZddlmZm Z dZ ej dj Z dZdZd d ZdS) N) OutputChoice) FORMATTERS) DEFAULT_TOOLSTOOLS) build_manager prospectorc v tjd}|tjdd|tjdd|tjdtjg|tjdd|tjd d|tjd d|tjd d|tjd d|tjd d|tjdd|tjdd|tjdd|tjdd|tjdtttj d|tjdd|tjdtj ttj d|tjdtjg|tjdtjg|tjdtjg|tjdtjg|tj dgdd|tjdd|tjdd|tjdd|tjdd|tjdd|tjd tjg|tjd!tjg|tjd"d|tjd#d|tjd$d|S)%Nr zero_exitF)default autodetectTusesblending doc_warnings test_warningsno_style_warningsmember_warnings full_pep8max_line_length messages_only summary_onlyquiet output_formatabsolute_pathstools with_tools without_toolsprofiles profile_path strictness)veryhighhighmediumlowverylow show_profileno_external_configlegacy_tool_namespylint_config_filepathignore_patterns ignore_pathsdie_on_tool_errorinclude_tool_stdoutdirect_tool_stdout)socConfigurationManageraddBooleanSetting ListSettingStringIntegerSettingrsortedrkeysChoicer ChoiceSetting StringSetting)managers q/builddir/build/BUILD/cloudlinux-venv-1.0.10/venv/lib/python3.11/site-packages/prospector/config/configuration.pyrrs&|44G KK";>>>??? KK"<>>>??? KK B???@@@ KK":t<<<=== KK">4@@@AAA KK"?DAAABBB KK"#6EEEFFF KK"#4dCCCDDD KK";===>>> KK"#4dCCCDDD KK"?EBBBCCC KK">5AAABBB KK"7E:::;;; KK     1 122 3 3    KK"#3UCCCDDD KK   Jvejll++ , ,    KK cj"EEEFFF KKRHHHIII KK CJCCCDDD KK BGGGHHH KK   < < <    KK">5AAABBB KK"#7GGGHHH KK"#6FFFGGG KK!"6EEEFFF KK!&$777888 KK 13:rJJJKKK KK BGGGHHH KK"#6FFFGGG KK"#8%HHHIII KK"#7GGGHHH Nc ttjtjdtjtjdtjdfg}|S)N) .prospectorrcz setup.cfgztox.inir?)build_command_line_sourcer/EnvironmentVariableSourceConfigFileSourceConfigDirectory HomeDirectory)sourcess r<build_default_sourcesrFOsm!## %''     #O44!/22   G$ Nr='Performs static analysis of Python codeci}|||d<|||d<idddgdddd d gd dd d dgdddddgdddddgdddddgddddgdddd d!gd"dd#d$d%gd&dd'd(d)gd*dd+d,d-gd.dd/d0gd1dd2d3d4gd5dd6d7d8gd9dd:d;dttjd?dd@dAdBidCdDdEgdFd>tt jdGd>tt ddHdIgdJd>tt jzddKdLgdMd>tt jzddNdOgdPddQgdRddSgdTddUdVgdWddXdYgdZdd[gd\dd]d^gd_dd`dagdbddcddgdeddfgdgddhgdiddjdkgdlddm}dndodpdqdrff}t j|t||sS)tNprog descriptionr z-0z --zero-exitaIProspector will exit with a code of 1 (one) if any messages are found. This makes automation easier; if there are any problems at all, the exit code is non-zero. However this behaviour is not always desirable, so if this flag is set, prospector will exit with a code of 0 if it ran successfully, and non-zero if it failed to run.)flagshelpr z-Az--no-autodetectzTurn off auto-detection of frameworks and libraries used. By default, autodetection will be used. To specify manually, see the --uses option.r z-uz--useszA list of one or more libraries or frameworks that the project uses. Possible values are: django, celery, flask. This will be autodetected by default, but if autodetection doesn't work, manually specify them using this flag.rz-Bz --no-blendingzTurn off blending of messages. Prospector will merge together messages from different tools if they represent the same error. Use this option to see all unmerged messages.rz-Dz--doc-warningsz%Include warnings about documentation.rz-Tz--test-warningsz%Also check test modules and packages.r'z--legacy-tool-nameszcOutput deprecated names for tools (pep8, pep257) instead of updated names (pycodestyle, pydocstyle)rz-8z--no-style-warningszeDon't create any warnings about style. This disables the PEP8 tool and similar checks for formatting.rz-mz--member-warningszAttempt to warn when code tries to access an attribute of a class or member of a module which does not exist. This is disabled by default as it tends to be quite inaccurate.rz-qz--quietzqRun but do not output anything to stdout. Useful to suppress output in scripts without sending to a file (via -o)rz-Fz --full-pep8zNEnables every PEP8 warning, so that all PEP8 style violation will be reported.rz--max-line-lengthzgThe maximum line length allowed. This will be set by the strictness if no value is explicitly specifiedrz-Mz--messages-onlyzSOnly output message information (don't output summary information about the checks)rz-Sz--summary-onlyzROnly output summary information about the checks (don'toutput message information)rz-oz--output-formatz%The output format. Valid values are: z, z. This will output to stdout by default, however a target file can be used instead by adding :path-to-output-file, eg, -o json:output.jsonrrLz{Whether to output absolute paths when referencing files in messages. By default, paths will be relative to the project pathrz-tz--toolzA list of tools to run. This lets you set exactly which tools to run. To add extra tools to the defaults, see --with-tool. Possible values are: z/. By default, the following tools will be run: z-wz --with-toolzA list of tools to run in addition to the default tools. To specify all tools explicitly, use the --tool argument. Possible values are %s.z-Wz--without-toolzA list of tools that should not be run. Useful to turn off only a single tool from the defaults. To specify all tools explicitly, use the --tool argument. Possible values are %s.z-Pz --profilea The list of profiles to load. A profile is a certain 'type' of behaviour for prospector, and is represented by a YAML configuration file. Either a full path to the YAML file describing the profile must be provided, or it must be on the profile path (see --profile-path)z--profile-pathzAdditional paths to search for profile files. By default this is the path that prospector will check, and a directory called ".prospector" in the path that prospector will check.z--show-profilea-Include the computed profile in the summary. This will show what prospector has decided the overall profile is once all profiles have been combined and inherited from. This will produce a large output in most cases so is only useful when trying to debug why prospector is not behaving like you expect.z-sz --strictnesszHow strict the checker should be. This affects how harshly the checker will enforce coding guidelines. The default value is "medium", possible values are "veryhigh", "high", "medium", "low" and "verylow".z-Ez--no-external-configa]Determines how prospector should behave when configuration already exists for a tool. By default, prospector will use existing configuration. This flag will cause prospector to ignore existing configuration and use its own settings for every tool. Note that prospector will always use its own config for tools which do not have custom configuration.z--pylint-config-filezThe path to a pylintrc file to use to configure pylint. Prospector will find .pylintrc files in the root of the project, but you can use this option to specify manually where it is.z-Iz--ignore-patternszA list of paths to ignore, as a list of regular expressions. Files and folders will be ignored if their full path contains any of these patterns.z-iz--ignore-pathszA list of file or directory names to ignore. If the complete name matches any of the items in this list, the file or directory (and all subdirectories) will be ignored.z-Xz--die-on-tool-errorzIf a tool fails to run, prospector will try to carry on. Use this flag to cause prospector to die and raise the exception the tool generated. Mostly useful for development on prospector.z--include-tool-stdouta^There are various places where tools will output warnings to stdout/stderr, which breaks parsing of JSON output. Therefore while tols is running, this is suppressed. For developing, it is sometimes useful to see this. This flag will cause stdout/stderr from a tool to be shown as a normal message amongst other warnings. See also --direct-tool-stdoutz--direct-tool-stdoutziSame as --include-tool-stdout, except the output will be printed directly rather than shown as a message.z-pz--pathzThe path to a Python project to inspect. Defaults to PWD if not specified. Note: This command line argument is deprecated and will be removed in a future update. Please use the positional PATH argument instead.)rrrrr%rr&r(r*r+r,zinclude-tool-stdoutzdirect-tool-stdoutr) checkpathzThe path to a Python project to inspect. Defaults to PWD if not specified. If multiple paths are specified, they must all be files (no directories).PATH*)rLmetavarnargs)optionsversionparser_options positional) joinr6rr7rrr/CommandLineSource_VERSION)rIrJrTrRrUs r<r@r@esN !%v(3}%DM*!  D -.0  D H%<  !D. O,  /D< ,-;  =DD -.;  EDL +,A  MDV 12<  WD` /0=  aDl I&C  mDv M*d  wD~ )*-  DH -.l  IDP ,-k  QDX -..yy  1 12233336  YDd   eDn H%%  &..//// &//000    oDFM*&)-6%*,,3G3G)H)HJ  ,-&*.6%*,,3G3G)H)HJ  K(8  ''L  '';  N+B  231   --,  /09  ,-  12*  ..U  --7  H%9  {DDDGP ="     J  %    r=)NrG) pkg_resources setoptconfr/prospector.config.datatyperprospector.formattersrprospector.toolsrr__all__get_distributionrSrXrrFr@r=r<ras333333,,,,,,11111111  )= ), 7 7 ?>>>B,______r=PK!dII$__pycache__/datatype.cpython-311.pycnu[ |oitFddlZddlZddlZddlmZGddeZdS)N)ChoiceceZdZfdZxZS) OutputChoicectjd|}|d|dd}}g}|D]}tjdrI|t jjt jjfr|dxxd|zz cc<j| |t |}||fS)Nz[;:]rwin:) resplitsysplatform startswithospathsepaltsepappendsupersanitize) selfvalueparsed output_formatoutput_targetschecked_targetstargetvalidated_format __class__s l/builddir/build/BUILD/cloudlinux-venv-1.0.10/venv/lib/python3.11/site-packages/prospector/config/datatype.pyrzOutputChoice.sanitize s'5))(.q 6!"":~ $ / /F|&&u-- /&2C2CRW[RTRYR`Da2b2b /###sV|3####&&v.... 77++M::00)__name__ __module__ __qualname__r __classcell__)rs@r rrs8 1 1 1 1 1 1 1 1 1r!r)rr r setoptconf.datatyperrr!r r(sf &&&&&& 1 1 1 1 16 1 1 1 1 1r!PK!2Q6Q6configuration.pynu[# flake8: noqa import pkg_resources import setoptconf as soc from prospector.config.datatype import OutputChoice from prospector.formatters import FORMATTERS from prospector.tools import DEFAULT_TOOLS, TOOLS __all__ = ("build_manager",) _VERSION = pkg_resources.get_distribution("prospector").version def build_manager(): manager = soc.ConfigurationManager("prospector") manager.add(soc.BooleanSetting("zero_exit", default=False)) manager.add(soc.BooleanSetting("autodetect", default=True)) manager.add(soc.ListSetting("uses", soc.String, default=[])) manager.add(soc.BooleanSetting("blending", default=True)) manager.add(soc.BooleanSetting("doc_warnings", default=None)) manager.add(soc.BooleanSetting("test_warnings", default=None)) manager.add(soc.BooleanSetting("no_style_warnings", default=None)) manager.add(soc.BooleanSetting("member_warnings", default=None)) manager.add(soc.BooleanSetting("full_pep8", default=None)) manager.add(soc.IntegerSetting("max_line_length", default=None)) manager.add(soc.BooleanSetting("messages_only", default=False)) manager.add(soc.BooleanSetting("summary_only", default=False)) manager.add(soc.BooleanSetting("quiet", default=False)) manager.add( soc.ListSetting( "output_format", OutputChoice(sorted(FORMATTERS.keys())), default=None, ) ) manager.add(soc.BooleanSetting("absolute_paths", default=False)) manager.add( soc.ListSetting( "tools", soc.Choice(sorted(TOOLS.keys())), default=None, ) ) manager.add(soc.ListSetting("with_tools", soc.String, default=[])) manager.add(soc.ListSetting("without_tools", soc.String, default=[])) manager.add(soc.ListSetting("profiles", soc.String, default=[])) manager.add(soc.ListSetting("profile_path", soc.String, default=[])) manager.add( soc.ChoiceSetting( "strictness", ["veryhigh", "high", "medium", "low", "verylow"], default=None, ) ) manager.add(soc.BooleanSetting("show_profile", default=False)) manager.add(soc.BooleanSetting("no_external_config", default=False)) manager.add(soc.BooleanSetting("legacy_tool_names", default=False)) manager.add(soc.StringSetting("pylint_config_file", default=None)) manager.add(soc.StringSetting("path", default=None)) manager.add(soc.ListSetting("ignore_patterns", soc.String, default=[])) manager.add(soc.ListSetting("ignore_paths", soc.String, default=[])) manager.add(soc.BooleanSetting("die_on_tool_error", default=False)) manager.add(soc.BooleanSetting("include_tool_stdout", default=False)) manager.add(soc.BooleanSetting("direct_tool_stdout", default=False)) return manager def build_default_sources(): sources = [ build_command_line_source(), soc.EnvironmentVariableSource(), soc.ConfigFileSource( ( ".prospectorrc", "setup.cfg", "tox.ini", ) ), soc.ConfigFileSource( ( soc.ConfigDirectory(".prospectorrc"), soc.HomeDirectory(".prospectorrc"), ) ), ] return sources def build_command_line_source(prog=None, description="Performs static analysis of Python code"): parser_options = {} if prog is not None: parser_options["prog"] = prog if description is not None: parser_options["description"] = description options = { "zero_exit": { "flags": ["-0", "--zero-exit"], "help": "Prospector will exit with a code of 1 (one) if any messages" " are found. This makes automation easier; if there are any" " problems at all, the exit code is non-zero. However this behaviour" " is not always desirable, so if this flag is set, prospector will" " exit with a code of 0 if it ran successfully, and non-zero if" " it failed to run.", }, "autodetect": { "flags": ["-A", "--no-autodetect"], "help": "Turn off auto-detection of frameworks and libraries used." " By default, autodetection will be used. To specify" " manually, see the --uses option.", }, "uses": { "flags": ["-u", "--uses"], "help": "A list of one or more libraries or frameworks that the" " project uses. Possible values are: django, celery, flask. This will be" " autodetected by default, but if autodetection doesn't" " work, manually specify them using this flag.", }, "blending": { "flags": ["-B", "--no-blending"], "help": "Turn off blending of messages. Prospector will merge" " together messages from different tools if they represent" " the same error. Use this option to see all unmerged" " messages.", }, "doc_warnings": { "flags": ["-D", "--doc-warnings"], "help": "Include warnings about documentation.", }, "test_warnings": { "flags": ["-T", "--test-warnings"], "help": "Also check test modules and packages.", }, "legacy_tool_names": { "flags": ["--legacy-tool-names"], "help": "Output deprecated names for tools (pep8, pep257) " "instead of updated names (pycodestyle, pydocstyle)", }, "no_style_warnings": { "flags": ["-8", "--no-style-warnings"], "help": "Don't create any warnings about style. This disables the" " PEP8 tool and similar checks for formatting.", }, "member_warnings": { "flags": ["-m", "--member-warnings"], "help": "Attempt to warn when code tries to access an attribute of a " "class or member of a module which does not exist. This is disabled " "by default as it tends to be quite inaccurate.", }, "quiet": { "flags": ["-q", "--quiet"], "help": "Run but do not output anything to stdout. Useful to suppress " "output in scripts without sending to a file (via -o)", }, "full_pep8": { "flags": ["-F", "--full-pep8"], "help": "Enables every PEP8 warning, so that all PEP8 style violation will be reported.", }, "max_line_length": { "flags": ["--max-line-length"], "help": "The maximum line length allowed. This will be set by the strictness if no" " value is explicitly specified", }, "messages_only": { "flags": ["-M", "--messages-only"], "help": "Only output message information (don't output summary" " information about the checks)", }, "summary_only": { "flags": ["-S", "--summary-only"], "help": "Only output summary information about the checks (don't" "output message information)", }, "output_format": { "flags": ["-o", "--output-format"], "help": "The output format. Valid values are: %s. This will output to stdout by default, " "however a target file can be used instead by adding :path-to-output-file, eg, -o json:output.json" % (", ".join(sorted(FORMATTERS.keys())),), }, "absolute_paths": { "help": "Whether to output absolute paths when referencing files " "in messages. By default, paths will be relative to the " "project path", }, "tools": { "flags": ["-t", "--tool"], "help": "A list of tools to run. This lets you set exactly which " "tools to run. To add extra tools to the defaults, see " "--with-tool. Possible values are: %s. By " "default, the following tools will be run: %s" % ( ", ".join(sorted(TOOLS.keys())), ", ".join(sorted(DEFAULT_TOOLS)), ), }, "with_tools": { "flags": ["-w", "--with-tool"], "help": "A list of tools to run in addition to the default tools. " "To specify all tools explicitly, use the --tool argument. " "Possible values are %s." % (", ".join(sorted(TOOLS.keys()))), }, "without_tools": { "flags": ["-W", "--without-tool"], "help": "A list of tools that should not be run. Useful to turn off " "only a single tool from the defaults. " "To specify all tools explicitly, use the --tool argument. " "Possible values are %s." % (", ".join(sorted(TOOLS.keys()))), }, "profiles": { "flags": ["-P", "--profile"], "help": "The list of profiles to load. A profile is a certain" " 'type' of behaviour for prospector, and is represented" " by a YAML configuration file. Either a full path to the YAML" " file describing the profile must be provided, or it must be" " on the profile path (see --profile-path)", }, "profile_path": { "flags": ["--profile-path"], "help": "Additional paths to search for profile files. By default this" " is the path that prospector will check, and a directory " ' called ".prospector" in the path that prospector will check.', }, "show_profile": { "flags": ["--show-profile"], "help": "Include the computed profile in the summary. This will show what" " prospector has decided the overall profile is once all profiles" " have been combined and inherited from. This will produce a large" " output in most cases so is only useful when trying to debug why" " prospector is not behaving like you expect.", }, "strictness": { "flags": ["-s", "--strictness"], "help": "How strict the checker should be. This affects how" " harshly the checker will enforce coding guidelines. The" ' default value is "medium", possible values are' ' "veryhigh", "high", "medium", "low" and "verylow".', }, "no_external_config": { "flags": ["-E", "--no-external-config"], "help": "Determines how prospector should behave when" " configuration already exists for a tool. By default," " prospector will use existing configuration. This flag" " will cause prospector to ignore existing configuration" " and use its own settings for every tool. Note that" " prospector will always use its own config for tools which" " do not have custom configuration.", }, "pylint_config_file": { "flags": ["--pylint-config-file"], "help": "The path to a pylintrc file to use to configure pylint. Prospector will find" " .pylintrc files in the root of the project, but you can use this option to " "specify manually where it is.", }, "ignore_patterns": { "flags": ["-I", "--ignore-patterns"], "help": "A list of paths to ignore, as a list of regular" " expressions. Files and folders will be ignored if their" " full path contains any of these patterns.", }, "ignore_paths": { "flags": ["-i", "--ignore-paths"], "help": "A list of file or directory names to ignore. If the" " complete name matches any of the items in this list, the" " file or directory (and all subdirectories) will be" " ignored.", }, "die_on_tool_error": { "flags": ["-X", "--die-on-tool-error"], "help": "If a tool fails to run, prospector will try to carry on." " Use this flag to cause prospector to die and raise the" " exception the tool generated. Mostly useful for" " development on prospector.", }, "include-tool-stdout": { "flags": ["--include-tool-stdout"], "help": "There are various places where tools will output warnings to " "stdout/stderr, which breaks parsing of JSON output. Therefore while tols " "is running, this is suppressed. For developing, it is sometimes useful to " "see this. This flag will cause stdout/stderr from a tool to be shown as " "a normal message amongst other warnings. See also --direct-tool-stdout", }, "direct-tool-stdout": { "flags": ["--direct-tool-stdout"], "help": "Same as --include-tool-stdout, except the output will be printed " "directly rather than shown as a message.", }, "path": { "flags": ["-p", "--path"], "help": "The path to a Python project to inspect. Defaults to PWD" " if not specified. Note: This command line argument is" " deprecated and will be removed in a future update. Please" " use the positional PATH argument instead.", }, } positional = ( ( "checkpath", { "help": "The path to a Python project to inspect. Defaults to PWD" " if not specified. If multiple paths are specified," " they must all be files (no directories).", "metavar": "PATH", "nargs": "*", }, ), ) return soc.CommandLineSource( options=options, version=_VERSION, parser_options=parser_options, positional=positional, ) PK!GSTtt datatype.pynu[import os import re import sys from setoptconf.datatype import Choice class OutputChoice(Choice): def sanitize(self, value): parsed = re.split(r"[;:]", value) output_format, output_targets = parsed[0], parsed[1:] checked_targets = [] for target in output_targets: if sys.platform.startswith("win") and target.startswith((os.path.sep, os.path.altsep)): checked_targets[-1] += ":" + target else: checked_targets.append(target) validated_format = super().sanitize(output_format) return validated_format, checked_targets PK!{)##_validate_pyproject/formats.pynu[import logging import os import re import string import typing from itertools import chain as _chain if typing.TYPE_CHECKING: from typing_extensions import Literal _logger = logging.getLogger(__name__) # ------------------------------------------------------------------------------------- # PEP 440 VERSION_PATTERN = r""" v? (?: (?:(?P[0-9]+)!)? # epoch (?P[0-9]+(?:\.[0-9]+)*) # release segment (?P
                                              # pre-release
                [-_\.]?
                (?P(a|b|c|rc|alpha|beta|pre|preview))
                [-_\.]?
                (?P[0-9]+)?
            )?
            (?P                                         # post release
                (?:-(?P[0-9]+))
                |
                (?:
                    [-_\.]?
                    (?Ppost|rev|r)
                    [-_\.]?
                    (?P[0-9]+)?
                )
            )?
            (?P                                          # dev release
                [-_\.]?
                (?Pdev)
                [-_\.]?
                (?P[0-9]+)?
            )?
        )
        (?:\+(?P[a-z0-9]+(?:[-_\.][a-z0-9]+)*))?       # local version
    """
    
    VERSION_REGEX = re.compile(r"^\s*" + VERSION_PATTERN + r"\s*$", re.X | re.I)
    
    
    def pep440(version: str) -> bool:
        return VERSION_REGEX.match(version) is not None
    
    
    # -------------------------------------------------------------------------------------
    # PEP 508
    
    PEP508_IDENTIFIER_PATTERN = r"([A-Z0-9]|[A-Z0-9][A-Z0-9._-]*[A-Z0-9])"
    PEP508_IDENTIFIER_REGEX = re.compile(f"^{PEP508_IDENTIFIER_PATTERN}$", re.I)
    
    
    def pep508_identifier(name: str) -> bool:
        return PEP508_IDENTIFIER_REGEX.match(name) is not None
    
    
    try:
        try:
            from packaging import requirements as _req
        except ImportError:  # pragma: no cover
            # let's try setuptools vendored version
            from setuptools._vendor.packaging import requirements as _req  # type: ignore
    
        def pep508(value: str) -> bool:
            try:
                _req.Requirement(value)
                return True
            except _req.InvalidRequirement:
                return False
    
    except ImportError:  # pragma: no cover
        _logger.warning(
            "Could not find an installation of `packaging`. Requirements, dependencies and "
            "versions might not be validated. "
            "To enforce validation, please install `packaging`."
        )
    
        def pep508(value: str) -> bool:
            return True
    
    
    def pep508_versionspec(value: str) -> bool:
        """Expression that can be used to specify/lock versions (including ranges)"""
        if any(c in value for c in (";", "]", "@")):
            # In PEP 508:
            # conditional markers, extras and URL specs are not included in the
            # versionspec
            return False
        # Let's pretend we have a dependency called `requirement` with the given
        # version spec, then we can reuse the pep508 function for validation:
        return pep508(f"requirement{value}")
    
    
    # -------------------------------------------------------------------------------------
    # PEP 517
    
    
    def pep517_backend_reference(value: str) -> bool:
        module, _, obj = value.partition(":")
        identifiers = (i.strip() for i in _chain(module.split("."), obj.split(".")))
        return all(python_identifier(i) for i in identifiers if i)
    
    
    # -------------------------------------------------------------------------------------
    # Classifiers - PEP 301
    
    
    def _download_classifiers() -> str:
        import ssl
        from email.message import Message
        from urllib.request import urlopen
    
        url = "https://pypi.org/pypi?:action=list_classifiers"
        context = ssl.create_default_context()
        with urlopen(url, context=context) as response:
            headers = Message()
            headers["content_type"] = response.getheader("content-type", "text/plain")
            return response.read().decode(headers.get_param("charset", "utf-8"))
    
    
    class _TroveClassifier:
        """The ``trove_classifiers`` package is the official way of validating classifiers,
        however this package might not be always available.
        As a workaround we can still download a list from PyPI.
        We also don't want to be over strict about it, so simply skipping silently is an
        option (classifiers will be validated anyway during the upload to PyPI).
        """
    
        downloaded: typing.Union[None, "Literal[False]", typing.Set[str]]
    
        def __init__(self):
            self.downloaded = None
            self._skip_download = False
            # None => not cached yet
            # False => cache not available
            self.__name__ = "trove_classifier"  # Emulate a public function
    
        def _disable_download(self):
            # This is a private API. Only setuptools has the consent of using it.
            self._skip_download = True
    
        def __call__(self, value: str) -> bool:
            if self.downloaded is False or self._skip_download is True:
                return True
    
            if os.getenv("NO_NETWORK") or os.getenv("VALIDATE_PYPROJECT_NO_NETWORK"):
                self.downloaded = False
                msg = (
                    "Install ``trove-classifiers`` to ensure proper validation. "
                    "Skipping download of classifiers list from PyPI (NO_NETWORK)."
                )
                _logger.debug(msg)
                return True
    
            if self.downloaded is None:
                msg = (
                    "Install ``trove-classifiers`` to ensure proper validation. "
                    "Meanwhile a list of classifiers will be downloaded from PyPI."
                )
                _logger.debug(msg)
                try:
                    self.downloaded = set(_download_classifiers().splitlines())
                except Exception:
                    self.downloaded = False
                    _logger.debug("Problem with download, skipping validation")
                    return True
    
            return value in self.downloaded or value.lower().startswith("private ::")
    
    
    try:
        from trove_classifiers import classifiers as _trove_classifiers
    
        def trove_classifier(value: str) -> bool:
            return value in _trove_classifiers or value.lower().startswith("private ::")
    
    except ImportError:  # pragma: no cover
        trove_classifier = _TroveClassifier()
    
    
    # -------------------------------------------------------------------------------------
    # Stub packages - PEP 561
    
    
    def pep561_stub_name(value: str) -> bool:
        top, *children = value.split(".")
        if not top.endswith("-stubs"):
            return False
        return python_module_name(".".join([top[: -len("-stubs")], *children]))
    
    
    # -------------------------------------------------------------------------------------
    # Non-PEP related
    
    
    def url(value: str) -> bool:
        from urllib.parse import urlparse
    
        try:
            parts = urlparse(value)
            if not parts.scheme:
                _logger.warning(
                    "For maximum compatibility please make sure to include a "
                    "`scheme` prefix in your URL (e.g. 'http://'). "
                    f"Given value: {value}"
                )
                if not (value.startswith("/") or value.startswith("\\") or "@" in value):
                    parts = urlparse(f"http://{value}")
    
            return bool(parts.scheme and parts.netloc)
        except Exception:
            return False
    
    
    # https://packaging.python.org/specifications/entry-points/
    ENTRYPOINT_PATTERN = r"[^\[\s=]([^=]*[^\s=])?"
    ENTRYPOINT_REGEX = re.compile(f"^{ENTRYPOINT_PATTERN}$", re.I)
    RECOMMEDED_ENTRYPOINT_PATTERN = r"[\w.-]+"
    RECOMMEDED_ENTRYPOINT_REGEX = re.compile(f"^{RECOMMEDED_ENTRYPOINT_PATTERN}$", re.I)
    ENTRYPOINT_GROUP_PATTERN = r"\w+(\.\w+)*"
    ENTRYPOINT_GROUP_REGEX = re.compile(f"^{ENTRYPOINT_GROUP_PATTERN}$", re.I)
    
    
    def python_identifier(value: str) -> bool:
        return value.isidentifier()
    
    
    def python_qualified_identifier(value: str) -> bool:
        if value.startswith(".") or value.endswith("."):
            return False
        return all(python_identifier(m) for m in value.split("."))
    
    
    def python_module_name(value: str) -> bool:
        return python_qualified_identifier(value)
    
    
    def python_entrypoint_group(value: str) -> bool:
        return ENTRYPOINT_GROUP_REGEX.match(value) is not None
    
    
    def python_entrypoint_name(value: str) -> bool:
        if not ENTRYPOINT_REGEX.match(value):
            return False
        if not RECOMMEDED_ENTRYPOINT_REGEX.match(value):
            msg = f"Entry point `{value}` does not follow recommended pattern: "
            msg += RECOMMEDED_ENTRYPOINT_PATTERN
            _logger.warning(msg)
        return True
    
    
    def python_entrypoint_reference(value: str) -> bool:
        module, _, rest = value.partition(":")
        if "[" in rest:
            obj, _, extras_ = rest.partition("[")
            if extras_.strip()[-1] != "]":
                return False
            extras = (x.strip() for x in extras_.strip(string.whitespace + "[]").split(","))
            if not all(pep508_identifier(e) for e in extras):
                return False
            _logger.warning(f"`{value}` - using extras for entry points is not recommended")
        else:
            obj = rest
    
        module_parts = module.split(".")
        identifiers = _chain(module_parts, obj.split(".")) if rest else module_parts
        return all(python_identifier(i.strip()) for i in identifiers)
    PK!SaC;C;7_validate_pyproject/__pycache__/formats.cpython-311.pycnu[
    
    i#fddlZddlZddlZddlZddlZddlmZejrddl	m
    Z
    ejeZ
    dZejdezdzejejzZdedefd	Zd
    ZejdedejZd
    edefdZ		ddlmZn#e$r	ddlmZYnwxYwdedefdZn(#e$r e
    ddedefdZYnwxYwdedefdZ dedefdZ!defdZ"GddZ#	ddl$m%Z&dedefdZ'n#e$r
    e#Z'YnwxYwdedefdZ(dedefdZ)dZ*ejde*dejZ+dZ,ejde,dejZ-dZ.ejde.dejZ/dedefd Z0dedefd!Z1dedefd"Z2dedefd#Z3dedefd$Z4dedefd%Z5dS)&N)chain)Literala
        v?
        (?:
            (?:(?P[0-9]+)!)?                           # epoch
            (?P[0-9]+(?:\.[0-9]+)*)                  # release segment
            (?P
                                              # pre-release
                [-_\.]?
                (?P(a|b|c|rc|alpha|beta|pre|preview))
                [-_\.]?
                (?P[0-9]+)?
            )?
            (?P                                         # post release
                (?:-(?P[0-9]+))
                |
                (?:
                    [-_\.]?
                    (?Ppost|rev|r)
                    [-_\.]?
                    (?P[0-9]+)?
                )
            )?
            (?P                                          # dev release
                [-_\.]?
                (?Pdev)
                [-_\.]?
                (?P[0-9]+)?
            )?
        )
        (?:\+(?P[a-z0-9]+(?:[-_\.][a-z0-9]+)*))?       # local version
    z^\s*z\s*$versionreturnc:t|duSN)
    VERSION_REGEXmatch)rs /builddir/build/BUILD/imunify360-venv-2.6.2/opt/imunify360/venv/lib/python3.11/site-packages/setuptools/config/_validate_pyproject/formats.pypep440r2sw''t33z'([A-Z0-9]|[A-Z0-9][A-Z0-9._-]*[A-Z0-9])^$namec:t|duSr)PEP508_IDENTIFIER_REGEXr
    )rs rpep508_identifierr=s"((..d::r
    )requirementsvaluec\	tj|dS#tj$rYdSwxYw)NTF)_reqRequirementInvalidRequirementrs rpep508rHsB	U###4&			55	s++zCould not find an installation of `packaging`. Requirements, dependencies and versions might not be validated. To enforce validation, please install `packaging`.cdSNTrs rrrVstr
    cbtfddDrdStdS)zGExpression that can be used to specify/lock versions (including ranges)c3 K|]}|vV	dSrr).0crs  r	z%pep508_versionspec..\s'
    /
    /!1:
    /
    /
    /
    /
    /
    /r
    );]@Frequirement)anyrrs`rpep508_versionspecr)ZsH
    
    /
    /
    /
    /
    /
    /
    ///u'''(((r
    c|d\}}}dt|d|dD}td|DS)N:c3>K|]}|VdSrstripr!is  rr#z+pep517_backend_reference..ls*PP17799PPPPPPr
    .c38K|]}|t|VdSrpython_identifierr/s  rr#z+pep517_backend_reference..ms0>>A> ##>>>>>>r
    )	partition_chainsplitall)rmodule_objidentifierss     rpep517_backend_referencer=jsi__S))NFAsPPfV\\#->->		#&O&OPPPK>>[>>>>>>r
    cXddl}ddlm}ddlm}d}|}|||5}|}|dd|d<||	d	d
    cdddS#1swxYwYdS)Nr)Message)urlopenz.https://pypi.org/pypi?:action=list_classifiers)contextzcontent-typez
    text/plaincontent_typecharsetzutf-8)
    ssl
    email.messager?urllib.requestr@create_default_context	getheaderreaddecode	get_param)rDr?r@urlrAresponseheaderss       r_download_classifiersrOtsJJJ%%%%%%&&&&&&
    :C((**G	g	&	&	&M('))"*"4"4^\"R"R}}%%g&7&7	7&K&KLLMMMMMMMMMMMMMMMMMMsABB#&B#cleZdZUdZejddejefed<dZ	dZ
    dedefd	ZdS)
    _TroveClassifierakThe ``trove_classifiers`` package is the official way of validating classifiers,
        however this package might not be always available.
        As a workaround we can still download a list from PyPI.
        We also don't want to be over strict about it, so simply skipping silently is an
        option (classifiers will be validated anyway during the upload to PyPI).
        NzLiteral[False]
    downloadedc0d|_d|_d|_dS)NFtrove_classifier)rR_skip_download__name__selfs r__init__z_TroveClassifier.__init__s#+
    
    
    r
    cd|_dSr)rUrWs r_disable_downloadz"_TroveClassifier._disable_downloads"r
    rrc6|jdus	|jdurdStjdstjdr%d|_d}t|dS|jd}t|	t
    t|_n2#t$r%d|_tdYdSwxYw||jvp&|
    dS)	NFT
    NO_NETWORKVALIDATE_PYPROJECT_NO_NETWORKzxInstall ``trove-classifiers`` to ensure proper validation. Skipping download of classifiers list from PyPI (NO_NETWORK).zxInstall ``trove-classifiers`` to ensure proper validation. Meanwhile a list of classifiers will be downloaded from PyPI.z*Problem with download, skipping validation
    private ::)rRrUosgetenv_loggerdebugsetrO
    splitlines	Exceptionlower
    startswith)rXrmsgs   r__call__z_TroveClassifier.__call__s&?e##t':d'B'B4
    9\""	bi0O&P&P	#DOP
    
    MM#4?"P
    
    MM#
    "%&;&=&=&H&H&J&J"K"K
    
    
    "'
    
    JKKKtt
    
    'Q5;;==+C+CL+Q+QQs2B99+C('C()
    rV
    __module____qualname____doc__typingUnionSetstr__annotations__rYr[boolrjrr
    rrQrQsT#3VZ_DEEEE+++###RcRdRRRRRRr
    rQ)classifierscb|tvp&|dS)Nr_)_trove_classifiersrgrhrs rrTrTs)**Tekkmm.F.F|.T.TTr
    c	|d^}}|dsdStd|dt	dg|S)Nr1z-stubsF)r7endswithpython_module_namejoinlen)rtopchildrens   rpep561_stub_namer~se[[%%NC(<<!!uchh,ddlm}	||}|jsYtd||ds'|dsd|vs|d|}t
    |jo|jS#t$rYdSwxYw)	Nr)urlparsezsFor maximum compatibility please make sure to include a `scheme` prefix in your URL (e.g. 'http://'). Given value: /\r&zhttp://F)	urllib.parserschemerbwarningrhrsnetlocrf)rrpartss   rrLrLs%%%%%%
    |	4OO( %((
    
    
    
    $$S))
    4U-=-=d-C-C
    4se|| !25!2!233EL1U\222uusBB
    BBz[^\[\s=]([^=]*[^\s=])?z[\w.-]+z\w+(\.\w+)*c*|Sr)isidentifierrs rr4r4sr
    c|ds|drdStd|dDS)Nr1Fc34K|]}t|VdSrr3)r!ms  rr#z.python_qualified_identifier..s+>> ##>>>>>>r
    )rhrxr8r7rs rpython_qualified_identifierrsYs 3 3u>>U[[-=-=>>>>>>r
    c t|Sr)rrs rryrys&u---r
    c:t|duSr)ENTRYPOINT_GROUP_REGEXr
    rs rpython_entrypoint_grouprs!''..d::r
    ct|sdSt|s*d|d}|tz
    }t|dS)NFz
    Entry point `z'` does not follow recommended pattern: T)ENTRYPOINT_REGEXr
    RECOMMEDED_ENTRYPOINT_REGEXRECOMMEDED_ENTRYPOINT_PATTERNrbr)rris  rpython_entrypoint_namerse!!%((u&,,U33LeLLL,,4r
    cN|d\}}}d|vr|d\}}}|ddkrdSd|tjdzdD}td	|DsdStd
    |dn|}|d}|r#t||dn|}td
    |DS)Nr+[r%Fc3>K|]}|VdSrr-)r!xs  rr#z.python_entrypoint_reference..
    s*XX!''))XXXXXXr
    z[],c34K|]}t|VdSr)r)r!es  rr#z.python_entrypoint_reference..s+88A$Q''888888r
    `z4` - using extras for entry points is not recommendedr1c3XK|]%}t|V&dSr)r4r.r/s  rr#z.python_entrypoint_reference..s3AA ++AAAAAAr
    )	r5r.string
    whitespacer7r8rbrr6)	rr9r:restr;extras_extrasmodule_partsr<s	         rpython_entrypoint_referencers'ooc**OFAt
    d{{..--Q==??2#%%5XXW]]63Dt3K%L%L%R%RSV%W%WXXX8888888	5WEWWWXXXX<<$$L:>P&syy~~666LKAA[AAAAAAr
    )6loggingr`rerrn	itertoolsrr6
    TYPE_CHECKINGtyping_extensionsr	getLoggerrVrbVERSION_PATTERNcompileXIr	rqrsrPEP508_IDENTIFIER_PATTERNrr	packagingrrImportErrorsetuptools._vendor.packagingrrr)r=rOrQtrove_classifiersrtrvrTr~rLENTRYPOINT_PATTERNrrrENTRYPOINT_GROUP_PATTERNrr4rryrrrrr
    rrs								
    
    
    
    
    
    
    
    %%%%%%	*))))))
    '
    H
    %
    %
    >
    7_4w>rtLL
    4C4D4444G$"*%E)B%E%E%ErtLL;C;D;;;;F2222222FFFEEEEEEEEFcdOO	=cd	)c	)d	)	)	)	) ?C?D????
    Ms
    M
    M
    M
    M/R/R/R/R/R/R/R/Rd*CCCCCCUUUUUUU***''))*LCLDLLLLst(/2:7"4777>> *(bj)M-J)M)M)MrtTT)#$C(@$C$C$CRTJJ S T    ?s?t????.c.d....;3;4;;;;#$BsBtBBBBBBsBBB-B!B- B!!B--"CC9DDDPK!4	4	8_validate_pyproject/__pycache__/__init__.cpython-311.pycnu[
    
    iUddlmZddlmZmZmZddlmZddlm	Z	m
    Z
    ddlmZddl
    mZmZddlmZgd	Zd
    ejDZeeeegeffed<ded
    efdZdS))reduce)AnyCallableDict)formats)detailed_errorsValidationError)EXTRA_VALIDATIONS)JsonSchemaExceptionJsonSchemaValueException)validate)rFORMAT_FUNCTIONSrr
    rr
    ci|]G}t||jd+|jdd|HS)_-)callable__name__
    startswithreplace).0fns  /builddir/build/BUILD/imunify360-venv-2.6.2/opt/imunify360/venv/lib/python3.11/site-packages/setuptools/config/_validate_pyproject/__init__.py
    rsb666
    ||6K223776KS!!2666rdatareturnct5t|tdddn#1swxYwYtdt|dS)z~Validate the given ``data`` object using JSON Schema
        This function raises ``ValidationError`` if ``data`` is invalid.
        )custom_formatsNc||S)N)accrs  rzvalidate..!s22c77rT)r		_validaterrr)rs rrrs
    		99$'78888999999999999999
    ""$5t<<<4s266N)	functoolsrtypingrrrrerror_reportingr	r
    extra_validationsrfastjsonschema_exceptionsrr
    fastjsonschema_validationsrr$__all____dict__valuesrstrbool__annotations__r!rrr2s/&&&&&&&&&&========000000TTTTTTTT======66%%''666$sHcUD[11234rPK!lI_validate_pyproject/__pycache__/fastjsonschema_exceptions.cpython-311.pycnu[
    
    iLddlZejdZGddeZGddeZGddeZdS)	Nz	[\.\[\]]+ceZdZdZdS)JsonSchemaExceptionz7
        Base exception of ``fastjsonschema`` library.
        N__name__
    __module____qualname____doc__/builddir/build/BUILD/imunify360-venv-2.6.2/opt/imunify360/venv/lib/python3.11/site-packages/setuptools/config/_validate_pyproject/fastjsonschema_exceptions.pyrrrrcPeZdZdZdfd	ZedZedZxZS)JsonSchemaValueExceptiona
        Exception raised by validation function. Available properties:
    
         * ``message`` containing human-readable information what is wrong (e.g. ``data.property[index] must be smaller than or equal to 42``),
         * invalid ``value`` (e.g. ``60``),
         * ``name`` of a path in the data structure (e.g. ``data.property[index]``),
         * ``path`` as an array in the data structure (e.g. ``['data', 'property', 'index']``),
         * the whole ``definition`` which the ``value`` has to fulfil (e.g. ``{'type': 'number', 'maximum': 42}``),
         * ``rule`` which the ``value`` is breaking (e.g. ``maximum``)
         * and ``rule_definition`` (e.g. ``42``).
    
        .. versionchanged:: 2.14.0
            Added all extra properties.
        Nct|||_||_||_||_||_dSN)super__init__messagevaluename
    definitionrule)selfrrrrr	__class__s      rrz!JsonSchemaValueException.__init__sB
    !!!
    	$			rcTdt|jDS)Ncg|]
    }|dk|S)r
    ).0items  r
    z1JsonSchemaValueException.path..'sIIIdbjjjjjr)SPLIT_REsplitrrs rpathzJsonSchemaValueException.path%s$II	!:!:IIIIrc`|jr|jsdS|j|jSr)rrgetr#s rrule_definitionz(JsonSchemaValueException.rule_definition)s2y		4""49---r)NNNN)	rrrr	rpropertyr$r'
    __classcell__)rs@rrr
    s
    
    JJXJ..X.....rrceZdZdZdS)JsonSchemaDefinitionExceptionz?
        Exception raised by generator of validation function.
        Nrr
    rrr+r+0r
    rr+)recompiler!
    ValueErrorrrr+r
    rrr/s				2:l##* . . . . .2 . . .F$7rPK!]G=J_validate_pyproject/__pycache__/fastjsonschema_validations.cpython-311.pycnu[
    
    i1BdZddlZddlmZejdejdejdejdd	ZedZidfd
    ZidfdZ	idfdZ
    idfd
    ZidfdZidfdZ
    idfdZidfdZidfdZidfdZidfdZidfdZdS)z2.16.3N)JsonSchemaValueException^.*$.+^.+$z^[^@]+@[^@]+\.[^@]+\Z)rrridn-email_re_patternc2t|||pddz|S)Ndata)[validate_https___packaging_python_org_en_latest_specifications_declaring_build_dependenciesr
    custom_formatsname_prefixs   /builddir/build/BUILD/imunify360-venv-2.6.2/opt/imunify360/venv/lib/python3.11/site-packages/setuptools/config/_validate_pyproject/fastjsonschema_validations.pyvalidatersE_`dftxCxMGMQSwSTTTKc'"t|tstd|pdzdz|d|pdzdzdddgddd	dd
    d	dgdd
    diddddddddgddddddgddddddgdidddd dd!dd"d#dd$dd%d&gd'd(gd)dgd*d'dd+d,dd-d.gd'id,gd/d0dd1d2id0gd/gid3dgd4d5d6id3gd/gd7gd8d9dd:d;dd?d,dd@dAgd'id,gd/d0dgdBd'id0gd/gdCdDddEdFigdGdHdIddEdFidJdKgdHdLdd
    didMdNdOdddPdQdRdSdTgdHdUddVd	dWddXdYidZd[d\d]d^gd_d`d\gdad_dbgdcdddeid	dWdEd\iidfdgddhdEdiidjdkddlddd id	dWddEdiidmidndoddpdqgdrgdsiddgd	dogdodtd!idugdvidwgdxdyd!gdzgd{dFd|d}dd	dd~dgd'ddddRddd\ddgddddid	dWdddgdddiddidddddddddddgdddddd2idd
    diidddddgddd	iddd
    didmdddgddd dYddddgddd dYddddddddd
    didddddgdd
    diddgddddEdiddEdigd8dgddd	ddtdidEdigidd
    diiddgddd	ddddidtdigiddd
    didmiddgddddgdâdd	ddddidtdigiddd
    didmiddddddYddƜddddddYdddgdˢdddd
    didmid̜dgd΢dddddYid̜ddd
    digdѢddӜdoddd	ddgdEdidEdigd8dEdidEdidEdidEdiddddid	ddEdiidڜdEdidd3d
    diiigd,gdܜdݜdޜdddddddidddigdddddd	d,dd
    didd
    didmgiid,gdddddgdd	dd
    diidgddddd	ddddgd	ddd
    diddddgd
    diddddgd
    diddddgd'ddidddddddddddgdidddd dd!dd"d#dd$dd%d&gd'd(gd)dgd*d'dd+d,dd-d.gd'id,gd/d0dd1d2id0gd/gid3dgd4d5d6id3gd/gd7gd8d9dd:d;dd?d,dd@dAgd'id,gd/d0dgdBd'id0gd/gdCdDddEdFigdGdHdIddEdFidJdKgdHdLdd
    didMdNdOdddPdQdRdSdTgdHdUddVd	dWddXdYidZd[d\d]d^gd_d`d\gdad_dbgdcdddeid	dWdEd\iidfdgddhdEdiidjdkddlddd id	dWddEdiidmidndoddpdqgdrgdsiddgd	dogdodtd!idugdvidwgdxdyd!gdzgd{dFd|d}dd	dd~dgd'ddddRddd\ddgddddid	dWdddgdddiddiddddddddd
    t|t}|r@t|}d|vr|d|dttsFtd|pdzdzd|pdzdzdd
    d	dgdd
    diddddddddgddddddgdd
    tt}|rt
    }tfddDsGtd|pdzdzd|pdzdzdd
    d	dgdd
    diddddddddgddddddgddt}d|vr|dd}t|ttfs.td|pdzdz|d|pdzdzdgdd
    didd
    t|ttf}	|	rt
    |}
    t|D]y\}}t|ts_td|pdzd	jd itzd
    z|d|pdzd	jd itzdzd
    did
    zd|vr|dd}
    t|
    ts*td|pdzdz|
    d|pdzd
    zddddd
    t|
    tr;|d|
    s*td|pdzdz|
    d|pdzd
    zddddddd|vr!|dd}t|ttfs/td|pdzdz|d|pdzdzdddgddddd
    t|ttf}|rt
    |}t|D]z\}}t|ts`td|pdzdjd itzd
    z|d|pdzdjd itzdzdddd
    {|r[td|pdzdzt|zdzd|pdzdzdd
    d	dgdd
    diddddddddgddddddgddd|vr6|d|d}t|||pddzd|vr|d|d}t|tstd|pdzdz|d|pdzdzddddgdddddd2idd
    diidddddgddd	iddd
    didmdddgddd dYddddgddd dYddddddddd
    didddddgdd
    diddgddddEdiddEdigd8dgddd	ddtdidEdigidd
    diiddgddd	ddddidtdigiddd
    didmiddgddddgdâdd	ddddidtdigiddd
    didmiddddddYddƜddddddYdddgdˢdddd
    didmid̜dgd΢dddddYid̜ddd
    digdѢddӜdoddd	ddgdEdidEdigd8dEdidEdidEdidEdiddddid	ddEdiidڜdEdidd3d
    diiigd,gdܜdݜdޜdddddddidddigdddddd	d,dd
    didd
    didmgiid,gdddddgdd	dd
    diidgddddd	ddddgd	ddd
    diddddgd
    diddddgd
    diddddgd'ddidddddd
    t|t}|rt|}d|vr6|d|d}t|||pddzd|vr6|d|d}t!|||pddz|rtd|pdzdzt|zdz|d|pdzdzdddgddd	dd
    d	dgdd
    diddddddddgddddddgddddddgdidddd dd!dd"d#dd$dd%d&gd'd(gd)dgd*d'dd+d,dd-d.gd'id,gd/d0dd1d2id0gd/gid3dgd4d5d6id3gd/gd7gd8d9dd:d;dd?d,dd@dAgd'id,gd/d0dgdBd'id0gd/gdCdDddEdFigdGdHdIddEdFidJdKgdHdLdd
    didMdNdOdddPdQdRdSdTgdHdUddVd	dWddXdYidZd[d\d]d^gd_d`d\gdad_dbgdcdddeid	dWdEd\iidfdgddhdEdiidjdkddlddd id	dWddEdiidmidndoddpdqgdrgdsiddgd	dogdodtd!idugdvidwgdxdyd!gdzgd{dFd|d}dd	dd~dgd'ddddRddd\ddgddddid	dWdddgdddiddidddddddddddgdddddd2idd
    diidddddgddd	iddd
    didmdddgddd dYddddgddd dYddddddddd
    didddddgdd
    diddgddddEdiddEdigd8dgddd	ddtdidEdigidd
    diiddgddd	ddddidtdigiddd
    didmiddgddddgdâdd	ddddidtdigiddd
    didmiddddddYddƜddddddYdddgdˢdddd
    didmid̜dgd΢dddddYid̜ddd
    digdѢddӜdoddd	ddgdEdidEdigd8dEdidEdidEdidEdiddddid	ddEdiidڜdEdidd3d
    diiigd,gdܜdݜdޜdddddddidddigdddddd	d,dd
    didd
    didmgiid,gdddddgdd	dd
    diidgddddd	ddddgd	ddd
    diddddgd
    diddddgd
    diddddgd'ddidddddddddddgdidddd dd!dd"d#dd$dd%d&gd'd(gd)dgd*d'dd+d,dd-d.gd'id,gd/d0dd1d2id0gd/gid3dgd4d5d6id3gd/gd7gd8d9dd:d;dd?d,dd@dAgd'id,gd/d0dgdBd'id0gd/gdCdDddEdFigdGdHdIddEdFidJdKgdHdLdd
    didMdNdOdddPdQdRdSdTgdHdUddVd	dWddXdYidZd[d\d]d^gd_d`d\gdad_dbgdcdddeid	dWdEd\iidfdgddhdEdiidjdkddlddd id	dWddEdiidmidndoddpdqgdrgdsiddgd	dogdodtd!idugdvidwgdxdyd!gdzgd{dFd|d}dd	dd~dgd'ddddRddd\ddgddddid	dWdddgdddiddiddddddddd|S(!Nrr
     must be object&http://json-schema.org/draft-07/schemazShttps://packaging.python.org/en/latest/specifications/declaring-build-dependencies/z+Data structure for ``pyproject.toml`` files)zKFile format containing build-time configurations for the Python ecosystem. zO:pep:`517` initially defined a build-system independent format for source treeszQwhich was complemented by :pep:`518` to provide a way of specifying dependencies zfor building Python projects.zYPlease notice the ``project`` table (as initially defined in  :pep:`621`) is not includedz3in this schema and should be considered separately.objectFz&Table used to store build-related dataarray)zKList of dependencies in the :pep:`508` format required to execute the buildz9system. Please notice that the resulting dependency graphz**MUST NOT contain cycles**typestringr
    $$descriptionitemszLPython object that will be used to perform the build according to :pep:`517`zpep517-backend-referencerdescriptionformatzDList of directories to be prepended to ``sys.path`` when loading thezback-end, and running its hooksz0Should be a path (TODO: enforce it with format?))r$comment)requires
    build-backendbackend-pathr!)rradditionalProperties
    propertiesrequiredQhttps://packaging.python.org/en/latest/specifications/declaring-project-metadata/0Package metadata stored in the ``project`` tableBData structure for the **project** table inside ``pyproject.toml``$(as initially defined in :pep:`621`)nameIThe name (primary identifier) of the project. MUST be statically defined.pep508-identifierversion6The version of the project as supported by :pep:`440`.pep440r'The `summary description of the projectF`_rrreadmezA`Full/detailed description of the project in the form of a READMEz,`_zGwith meaning similar to the one defined in `core metadata's DescriptionzJ`_zDRelative path to a text file (UTF-8) containing the full descriptionzDof the project. If the file path ends in case-insensitive ``.md`` orz8``.rst`` suffixes, then the content-type is respectivelyz#``text/markdown`` or ``text/x-rst``anyOffile(e.g. ``text/markdown``). The ``charset`` parameter is assumedzUTF-8 when not present."TODO: add regex pattern or format?rrr rallOfroneOfrequires-pythonpep508-versionspec/`The Python version requirements of the projectO`_.rrrlicense?`Project license `_.DRelative path to the file (UTF-8) which contains the license for theproject.z7The license of the project whose meaning is that of thez%`License field from the core metadatazG`_.rrFauthors$ref#/definitions/authorzJThe people or organizations considered to be the 'authors' of the project.zNThe exact meaning is open to interpretation (e.g. original or primary authors,z/current maintainers, or owners of the package).rrrmaintainersNThe people or organizations considered to be the 'maintainers' of the project.FSimilarly to ``authors``, the exact meaning is open to interpretation.keywordsNList of keywords to assist searching for the distribution in a larger catalog.rrrclassifierstrove-classifier3`PyPI classifier `_.rrr4`Trove classifiers `_which apply to the project.urls@URLs associated with the project in the form ``label => value``.rurlrrrrr$patternPropertiesscripts#/definitions/entry-point-groupzDInstruct the installer to create command-line wrappers for the givenL`entry points `_.)rSrgui-scripts)z;Instruct the installer to create GUI wrappers for the givenrkzJThe difference between ``scripts`` and ``gui-scripts`` is only relevant inzWindows.entry-pointsz@Instruct the installer to expose the given modules/functions viaz9``entry-point`` discovery mechanism (useful for plugins).z9More information available in the `Python packaging guidez>`_.rpython-entrypoint-groupr
    propertyNamesr$rhdependencies!Project (mandatory) dependencies.#/definitions/dependencyrrroptional-dependencies#Optional dependency for the projectrrrrrqr$rhdynamicGSpecifies which fields are intentionally unspecified and expected to be#dynamically provided by build toolsenumr.rr4rGrLrRrWrZr]rcrirlrmrrrvconst version is listed in ``dynamic``containsrr&r%	zAccording to :pep:`621`:zH    If the core metadata specification lists a field as "Required", thenzH    the metadata MUST specify the field statically or list it in dynamicz"In turn, `core metadata`_ defines:z=    The required fields are: Metadata-Version, Name, Version.z&    All the other fields are optional.zISince ``Metadata-Version`` is defined by the build back-end, ``name`` andzE``version`` are the only mandatory information in ``pyproject.toml``.zM.. _core metadata: https://packaging.python.org/specifications/core-metadata/notz	$$comment=version should be statically defined in the ``version`` fieldr&rAuthor or Maintainer5https://peps.python.org/pep-0621/#authors-maintainersIMUST be a valid email name, i.e. whatever can be put as a name, before anemail, in :rfc:`822`.	idn-emailMUST be a valid email addressr+email$idtitler rr$r%Entry-pointszLEntry-points are grouped together to indicate what sort of capabilities theyzprovide.zSee the `packaging guidesz=`_zand `setuptools docszC`_zfor more information.python-entrypoint-name6Reference to a Python object. It is either in the form<``importable.module``, or ``importable.module:object.attr``.python-entrypoint-reference9https://packaging.python.org/specifications/entry-points/rrrr rrrrrqr$rh
    Dependency5Project dependency specification according to PEP 508pep508rrrrrauthorzentry-point-group
    dependency$schemarrrrr%r&r$ifthendefinitions"https://docs.python.org/3/install/``tool.distutils`` tablezGOriginally, ``distutils`` allowed developers to configure arguments forz7``setup.py`` scripts via `distutils configuration fileszE`_.z@``tool.distutils`` subtables could be used with the same purposez(NOT CURRENTLY IMPLEMENTED).global4Global options applied to all ``distutils`` commandsrCTODO: Is there a practical way of making this schema more specific?rrrrrr%rhr =https://setuptools.pypa.io/en/latest/references/keywords.html``tool.setuptools`` tablezLPlease notice for the time being the ``setuptools`` project does not specifyz3a way of configuring builds via ``pyproject.toml``.zMTherefore this schema should be taken just as a *"thought experiment"* on howz@this *might be done*, by following the principles established inzO`ini2toml `_.z,It considers only ``setuptools`` `parameterszJ`_zTthat can currently be configured via ``setup.cfg`` and are not covered by :pep:`621`zGbut intentionally excludes ``dependency_links`` and ``setup_requires``.zINOTE: ``scripts`` was renamed to ``script-files`` to avoid confusion withz2entry-point based scripts (defined in :pep:`621`).	platformsprovides?Package and virtual package names contained within this package**(not supported by pip)**rrr	obsoletes,Packages which this package renders obsoletezip-safeDWhether the project can be safely installed and run from a zip file.booleanrrscript-files`_.python-module-name*include-package-datazCAutomatically include any data files inside the package directoriesz%that are specified by ``MANIFEST.in``rrrrexclude-package-datazLMapping from package names to lists of glob patterns that should be excludedrrnamespace-packagesEhttps://setuptools.pypa.io/en/latest/userguide/package_discovery.htmlrrr 
    py-modules'Modules that setuptools will manipulate0TODO: clarify the relationship with ``packages``
    data-fileszM**DEPRECATED**: dict-like structure where each key represents a directory andzFthe value is a list of glob patterns that should be installed in them.zBPlease notice this don't work with wheels. See `data files supportzA`_rrrhcmdclasszMMapping of distutils-style command names to ``setuptools.Command`` subclasseszJwhich in turn should be represented by strings with a qualified class namez+(i.e., "dotted" form with module), e.g.::
    
    z;    cmdclass = {mycmd = "pkg.subpkg.module.CommandClass"}
    
    zFThe command class should be a directly defined at the top-level of thez%containing module (no class nesting).python-qualified-identifier
    license-fileszKPROVISIONAL: List of glob patterns for all license files being distributed.z%(might become standard with PEP 639).zBBy default: ``['LICEN[CS]E*', 'COPYING*', 'NOTICE*', 'AUTHORS*']``HTODO: revise if PEP 639 is accepted. Probably ``project.license-files``?rrrr @Instructions for loading :pep:`621`-related metadata dynamicallyBA version dynamically loaded via either the ``attr:`` or ``file:``Mdirectives. Please make sure the given file or attribute respects :pep:`440`.#/definitions/attr-directive#/definitions/file-directivepython-identifierrrqr$rhr%r7r&r.r]rrrrmrvr4rrr$r%Valid package name+Valid package name (importable or PEP 561).pep561-stub-namerrrrr7'file:' directiveBValue is read from a file (or list of files and then concatenated)rrrrr$r%r&'attr:' directiveHValue is read from a module attribute. Supports callables and iterables;(unsupported types are cast via ``str()``attrrrrrr$r%r&'find:' directivefindDynamic `package discoveryJ`_.BDirectories to be searched for packages (Unix-style relative path)rrrznvalidate_https___packaging_python_org_en_latest_specifications_declaring_build_dependencies..-s)NN4#44NNNNNNr)r!z2.build-system must contain ['requires'] propertiesr&z$.build-system.requires must be arrayz.build-system.requiresz7.build-system.requires[{data__buildsystem__requires_x}] must be stringr"z*.build-system.build-backend must be stringz.build-system.build-backendz<.build-system.build-backend must be pep517-backend-referencer#z(.build-system.backend-path must be arrayz.build-system.backend-pathz>.build-system.backend-path[{data__buildsystem__backendpath_x}]z.build-system must not contain  propertiesr$rz.projectrz.tool must be objectz.toolrz.tool.distutilsrz.tool.setuptools must not contain r)
    isinstancedictrsetkeysremovelenalllisttuple	enumeratestrrlocalsYvalidate_https___packaging_python_org_en_latest_specifications_declaring_project_metadata*validate_https___docs_python_org_3_installFvalidate_https___setuptools_pypa_io_en_latest_references_keywords_html)r
    rrdata_is_dict	data_keysdata__buildsystem_is_dictdata__buildsystem_lendata__buildsystem_keysdata__buildsystem__requires#data__buildsystem__requires_is_listdata__buildsystem__requires_lendata__buildsystem__requires_x data__buildsystem__requires_itemdata__buildsystem__buildbackenddata__buildsystem__backendpath&data__buildsystem__backendpath_is_list"data__buildsystem__backendpath_len data__buildsystem__backendpath_x#data__buildsystem__backendpath_item
    data__project
    data__tooldata__tool_is_dictdata__tool_keysdata__tool__distutilsdata__tool__setuptoolsr!s                         @rrrsKjdT##Hy&r[-BF'CFW'W_cjlp{qF@FkGJLkLeMVkvcvbvbvbltN
    S
    }
    EV~X]CJ]H]H]HTZ\dSezfzfBJ[iuOyPyPkrFLNoEpDLZL{M{MbNbNmOmO^h]it
    jt
    jCktGRDX\^D WE O W g [uh n y A!R!]"i"|"p }"p }"g [u"H#S#[#l#d$p$x$J#y$J#y$g [u{$H%S%[%o%X&Z&b'n%c'J%d'J%d'g [uf'n'B(P,B(P,B(P,e,m,@-s0@-s0@-s0\,t0\,t00G1T1[1n1t11G2[2Y3[3l3Z2m3v1n3v1n3m1o3~3D4}3E4^1F4^1F4X4^4i4q4B5e5`4f5`4f5W4g5v5|5u5}5H4~5H4~5]15S1@6R6`6k6s6F7Y9F7Y9F7Y9g9K:b6L:b6L:Q6M:\:j:[:k:B6l:B6l:R1m:v0n:v0n:[,o:p'p:p'p:g [ur:C;N;V;b;v;J<{<}IE;P>E;P>g [uR>[>m>n?J@P@[@c@w@}AAIBv@JBR@KBR@KBI@LB[BaBZBbBz?cBz?cBuB{BFCNCaCPFaCPFaCPF}BQF}BQFtBRFaFgF`FhFeBiFeBiFy?jF]>kF]>kFg [umFvFAGHGTGZG\GrGSGsGFHYKFHYKFHYKxFZKxFZKg [u\KiKtK{KGLMLOLeLFLfLzLJNLNTOyLUOkKVOkKVOg [uXObOmOtO@PFPHPPPOQPbPrQdOsQdOsQg [uuQBRMRTRhRpR|RNS_STT_RUT_RUTiT_UaU~UhTUDR@VDR@Vg [uBVHVSV[VlVnWHXMXeXkXvX~XJYOYmXPYmXPYdXQYJVRYJVRYg [uTY]YhYIZ]Zc[e[s\\Zt\_Yu\_Yu\g [uw\D]O]p]C^laC^laC^laF]maF]mag [uoa}aQbQfQbQfQbQfefmfofHgdfIgcghg@hFhIhOhQhrhHhshgthauhauhg [uwhEiPiWihiKjWj]j_jyjVjzjGi{jGi{jg [u}jTk_kgkxk]lqlyl{lNmplOmimnmFnLnWn^njnpnrnLoinMoNnNoNnNoEnOoVkPoVkPog [uRo[ofomoApJqLqqq@prq~qDrFrXuFrXuFrXu}qYu]oZu]oZug [ujupuiuquKvPvnvwvmvxvIwRwbwiwkwtwawuwIxkxHxlxTwmxTwmxHwnx`vox`vox~xjA~xjA~xjAXvkAXvkACBLBBBMBaB`C`BaCuAbCuAbCFD\DgD}DKEBFLFTFnFsFUG]GqG|H~HUIpGVILGWILGWIkIsIIJJ[JzJbI{JbI{JCG|JCG|J~C}J~C}J\K}KHLVL`LhL{LmQ{LmQ{LmQARIRKRcR@RdR~RCS[SaSlStSHT@UBU@VGTAVMVjVxVsWcStWcStWZSuWTKvWTKvWNXhXsXXIYQYbYYZeZmZFXnZFXnZsCoZsCoZwpZwpZC[K[u[]\f\J]U]o]B^ubB^ubB^ubbGcXc`ckcscDdzdbc{dbc{dWc|dTeXe[eaecekeZeleSeme{e@gi[Agi[Ag]gEhNhMiXisiFjYvFjYvFjYvcvkvEwJwZwzX[wfwqwxwDxJxLxTxCxUxhwVxhwVxZwzXXxbxwxxyzyVzvxWzazhz|zD{P{c{szd{szd{dxe{dxe{ZwzXg{r{G|u|w|S}F|T}^}e}y}A~M~`~p}a~p}a~t{b~t{b~ZwzXd~n~@F@P@Y@p~Z@p~Z@ZwzX\@j@|@zADBKBWB]B_BgBVBhBvBiCl@jCl@jCZwzXlC}CRDZE\EZFQD[FeFlFxF~F@GHGwFIGCJGCJGZwzXLGVGjGVOjGVOjGVOlOQP[PbPnPtPvPRQmPSQbOTQbOTQWQ]Q_Q}QVQ~QaOQXG@RXG@RZwzXBRORcRVVcRVVcRVV`VhVBWGW[WbWfWmWoWqWeWrWuW{W}WYXtWZXdW[XZW\XtXzX}XCYEYMY|XNYsXOYQRPYQRPYZwzXRY`YtYT^tYT^tYT^^^f^@_E_Y_`_d_l_n_B`c_C`F`M`O`R`E`S`b_T`X_U`m`s`~`EaQaWaYaaaPabau`cau`cal`dabYeabYeaZwzXga}aQbXfQbXfQbXfbfkfalfalfZwzXnfDgXgjXgjXgjIkQkkkpkDlKlOlWlYlmlNlnlqlxlzl}lpl~lMllCl@mXm^mimpm|mBnDnLn{mMn`mNn`mNnWmOnFgPnFgPnZwzXRnfnqnxnLoTo`otoCouoCouoCpJqhnKqhnKqZwzXMqYqkqTr^reryrAsMsasprbsprbspsbt[qct[qctZwzXetqtEukyEukyEukyuy}yUz[zfzmzyzzA{I{xzJ{]zK{]zK{TzL{stM{stM{ZwzXO{Y{m{qAm{qAm{qA{ACB[BaBlBtB@C]CcB^CcB^CZB_C[{`C[{`CZwzXbCqC|CCDODUDWD_DND`DsDqGsDqGsDqGGIIsCJIsCJIZwzXLIUI`IhIyI{JUKZKILMMOM^NHL_NlNrNtNROkNSOVO\O^O|OUO}OjN~OvKOvKOQPWPYPwPPPxPJQPQRQpQIQqQDRJRLRjRCRkR~RDSFSdS}ReSITQTeTmToTBUdTCU]UbUzU~UAVGVIVgV@VhVyUiV@TjV@TjVBWHWJWhWAWiWlWxW{WIXLXRXTX\XKX]XzW^XkW_X@W`XoXuXnXvXvVwXvVwXjKxXjKxXWIyXWIyXZwzXdY@ZKZ_ZpZ][g[o[|[D\F\Z\{[[\^\f\h\z\]\{\z[|\\Y}\\Y}\Y]w]B^U^f^j_t_|_V`[`l`r`u`|`@aFaHaPa`Qa\acaoauawaana@bSaAbSaAb~`Bbt`Cbk`DbSbYbRbZbQ][bQ][bybLcUcscGdQeSe}eFd~eHfPfjfof@gFgIgOgQgYgHgZgf[gjgpgigqgobrgobrgNhlhwhJiTi\ivi{iLjRj]jejyjUkWkclxjdl~lCmmmqn{nBoNoToVo^oMo_o]m`o]m`ovo}oQpOqQqIrPpJrVr\r^rfrUrgrmohrmohr~rEsYs]t_tWuXsXudujulutucuuuurvuurvuOvXvlvqwswhxkvixFvjxFvjxSmkxSmkxTjlxTjlxKjmxFhnxFhnxKYoxKYoxQgpxQgpx[[qx[[qxzZrxzZrxc
    sxc
    sxLyty}yP{[{M|a|e}g}M~`|N~X~`~p~dSq~w~BJ[f@r@EAy~FAy~FAp~dSHAQA\AdAuAmByBACSABCSABCp~dSDCQC\CdCxCaDcDkEwClESCmESCmEp~dSoEwEKFYJKFYJKFYJnJvJIK|NIK|NIK|NeJ}NeJ}NHOPO]OdOwO}OHPPPdPbQdQuQcPvQOwQOwQvOxQGRMRFRNRgOORgOORaRgRrRzRKSnSiRoSiRoS`RpSSET~SFTQRGTQRGTfOHT\OIT[TiTtT|TOUbWOUbWOUbWpWTXkTUXkTUXZTVXeXsXdXtXKTuXKTuX[OvXNwXNwXdJxXyEyXyEyXp~dS{XLYWY_YkYYSZD[F[W\RZX\NYY\NYY\p~dS[\d\v\w]S^Y^d^l^@_F`H`R`^S`[^T`[^T`R^U`d`j`c`k`C^l`C^l`~`DaOaWajaYdjaYdjaYdFaZdFaZd}`[djdpdidqdn`rdn`rdB^sdf\tdf\tdp~dSvddJeQe]eceee{e\e|eOfbiOfbiOfbiAeciAecip~dSeiri}iDjPjVjXjnjOjojCkSlUl]mBk^mti_mti_mp~dSamkmvm}mInOnQnYnHnZnkn{omm|omm|op~dS~oKpVp]pqpypEqWqhq]rhp^rhp^rrrhsjsGtqrHtMpItMpItp~dSKtQt\tdtutwuQvVvnvtvvGwSwXwvvYwvvYwmvZwSt[wSt[wp~dS]wfwqwRxfxlyny|zex}zhw~zhw~zp~dS@{M{X{y{L|uL|uL|uO{vO{vp~dSxF@Z@ZDZ@ZDZ@ZDnDvDxDQEmDRElEqEIFOFRFXFZF{FQF|FHF}FH@~FH@~Fp~dS@GNGYG`GqGTH`HfHhHBI_HCIPGDIPGDIp~dSFI]IhIpIAJfJzJBKDKWKyJXKrKwKOLUL`LgLsLyL{LUMrLVMWLWMWLWMNLXM_IYM_IYMp~dS[MdMoMvMJNSOUOzOIN{OGPMPOPaSOPaSOPaSFPbSfMcSfMcSp~dSsSySrSzSTTYTwT@UvTAURU[UkUrUtU}UjU~URVtVQVuV]UvV]UvVQUwViTxViTxVGWs_GWs_GWs_aTt_aTt_L`U`K`V`j`iai`ja~_ka~_kaObebpbFcTcKdUd]dwd|d^efezeEgGg^gye_gUe`gUe`gtg|gHhShdhCikgDikgDiLeEiLeEiGbFiGbFieiFjQj_jijqjDkvoDkvoDkvoJpRpTplpIpmpGqLqdqjquq}qQrIsKsItPrJtVtstAu|ulq}ulq}ucq~u]iu]iuWvqv|vHwRwZwkwbxnxvxOvwxOvwx|axx|axx@yyx@yyxYzxYzxAyGyHyHyHy	HydD))LB|y		$$	Y&&^,,, $^ 4/$88
    L.r[5JF/KNl/luFMOS^ShbhMil{M{QYjRlqW^q\q\q\hnpxgyNzNzV	^	o	}
    IcM	dM	dFZ`
    b
    CYDX`n`OaOavbvbAcAcr|q}H~H~EKLLLL(23Dd(K(K%($
    M(+,=(>(>%NNNNNNNNNj229N3OSG4GO`gimxmB|BgCFUgUksDlFKqxKvKvKvB	H	J	R	A	S	hT	hT	p	x	I
    Wc}g	~g	~Y`tz
    |
    ]s^rzHzi{i{P|P|[}[}LVKWbXbX_ijjjj),->-C-C-E-E)F)F&!777*11*===2CJ2O/%&AD%=QQe6r[=RF7SV|7|E`gimxmB|BgCF^g^t{NyNyNyEKMUDVkWkW^deeee:DE`cginbo:p:p7:K:=>Y:Z:Z7_hjE`F`FKK[9;[#-.NQT#V#VK&>r[EZTZ?[___X___k_kbhbjbj_k_k@kn@GgnpttICInJMMMFMMMYMYPVPXPXMYMYnY\^n^lrt|k}DJ'K'K'K!KK"&<<<*11/BBB6G6X3%&EMM_6r[=RF7SWC8CKjqswBwLFLqMPmqmCK\jvPzQzQX^____!"A3GGwI~.HIJijjw":2AVPV;W[Ya#-.QTW#Y#Y\&>r[EZTZ?[_f___f_r_rioiqiq_r_r@ruF@FNqxz~I~SMSxTW^WWW^WjWjagaiaiWjWjxjmoxoEM[M|N|NU['\'\'\!\\)M229N3ORs3stwyOuPuP4PQ^4^fw~@DODYSY~Z]l~lBJ[C]bHObM	bM	bM	Y	_	a	i	X	j	k	k	G
    O
    `
    nzT~	U~	UpwK
    QStJ
    uIQ_Q@R@RgSgSrTrTcmbnyoyovLMMMM	!!Y''' OMefsvDGRG\V\`jFj
    k
    k
    kYV$$$fJj411
    w`.r[5JF/KNd/dlv}DODYSY~Z]d~dzBlT]ALfyl
    yl
    yl
    v
    ~
    OWbj{qYrYrNsK
    O
    R
    X
    Z
    b
    Q
    c
    J
    d
    r
    w`x`xT|EDOj}P}P}PZb|AQq@R]ho{A C K zL _M _M Qq@O Y n o!q!M"m N"X"_"s"{"G#Z#j"[#j"[#[ \#[ \#Qq@^#i#~#l$n$J%}#K%U%\%p%x%D&W&g%X&g%X&k#Y&k#Y&Qq@[&e&w&}'G(P(g&Q(g&Q(Qq@S(a(s(q){)B*N*T*V*^*M*_*m*`+c(a+c(a+Qq@c+t+I,Q-S-Q.H,R.\.c.o.u.w..n.@/v+A/v+A/Qq@C/M/a/M7a/M7a/M7c7H8R8Y8e8k8m8I9d8J9Y7K9Y7K9N9T9V9t9M9u9X7v9O/w9O/w9Qq@y9F:Z:M>Z:M>Z:M>W>_>y>~>R?Y?]?d?f?h?\?i?l?r?t?P@k?Q@[?R@Q?S@k@q@t@z@|@DAs@EAj@FAH:GAH:GAQq@IAWAkAKFkAKFkAKFUF]FwF|FPGWG[GcGeGyGZGzG}GDHFHIH|GJHYGKHOGLHdHjHuH|HHINIPIXIGIYIlHZIlHZIcH[IYA\IYA\IQq@^ItIHJONHJONHJONYNbNvIcNvIcNQq@eN{NOOvROOvROOvR@SHSbSgS{SBTFTNTPTdTETeThToTqTtTgTuTDTvTzSwTOUUU`UgUsUyU{UCVrUDVWUEVWUEVNUFV}NGV}NGVQq@IV]VhVoVCWKWWWkWzVlWzVlWzWAY_VBY_VBYQq@DYPYbYKZUZ\ZpZxZD[X[gZY[gZY[g[Y\RYZ\RYZ\Qq@\\h\|\ba|\ba|\balataLbRb]bdbpbvbxb@cobAcTbBcTbBcKbCcj\Dcj\DcQq@FcPcdchidchidchiriziRjXjcjkjwjTkZjUkZjUkQjVkRcWkRcWkQq@YkhkskzkFlLlNlVlElWljlhojlhojlhovo@qjkAqjkAqQq@CqLqWq_qpqrrLsQs@tDuFuUvsVvcvivkvIwbvJwMwSwUwswLwtwavuwmsvwmsvwHxNxPxnxGxoxAyGyIygy@yhy{yAzCzazzybzuz{z}z[{tz\{@|H|\|d|f|y|[|z|T}Y}q}u}x}~}@~^~w}_~p}`~w{a~w{a~y~~A_x~`cor@@C@I@K@S@B@T@qU@bV@w~W@f@l@e@m@m~n@m~n@aso@aso@Nqp@Nqp@Qq@[AwABBVBgBTC^CfCsC{C}CQDrCRDUD]D_DqDTDrDqCsDSAtDSAtDPEnEyELF]FaGkGsGMHRHcHiHlHsHwH}HHGIvHHISIZIfIlInIvIeIwIJIxIJIxIuHyIkHzIbH{IJJPJIJQJHERJHERJpJCKLKjK~KHMJMtM}KuMMGNaNfNwN}N@OFOHOPONQOvNROaOgO`OhOfJiOfJiOEPcPnPAQKQSQmQrQCRIRTR\RpRLSNSZToR[TuTzTdUhVrVyVEWKWMWUWDWVWTUWWTUWWmWtWHXFYHY@ZGXAZMZSZUZ]ZLZ^ZdW_ZdW_ZuZ|ZP[T\V\N]O[O][]a]c]k]Z]l]lZm]lZm]F^O^c^h_j__`b^``}]a`}]a`JUb`JUb`KRc`KRc`BRd`}Oe`}Oe`BAf`BAf`Hg`Hg`Rh`Rh`qi`qi`p`v`w`w`w`w`!+J!=!=!	
    q"%joo&7&7"8"8/11#**;777,6{,C)>?TVdgrg|v|ARgRSSS?22#**<888-7-E*Z[qtBEPEZTZ^pDpqqq	|y*21F+GJ^+^_bcl_m_m+mn{+{DHOQU`UjdjOknpOpIqzOZGZF
    ZF
    ZF
    P
    X
    r
    w
    aizb|AgnAlAlAlx~@HwI^J^JfnMYs]t]tOVjprSiThp~p_q_qFrFrQsQsBLAMXNXNgOXkvh|@ B h {i s { K!uL!R!]!e!v!A#M#`#T!a#T!a#K!uc#l#w##P$H%T%\%n#]%n#]%K!u_%l%w%%S&|&~&F(R&G(n%H(n%H(K!uJ(R(f(t,f(t,f(t,I-Q-d-W1d-W1d-W1@-X1@-X1c1k1x11R2X2c2k22}33P4~2Q4Z2R4Z2R4Q2S4b4h4a4i4B2j4B2j4|4B5M5U5f5I6D5J6D5J6{4K6Z6`6Y6a6l4b6l4b6A2c6w1d6v6D7O7W7j7}9j7}9j7}9K:o:F7p:F7p:u6q:@;N;:O;f6P;f6P;v1Q;Z1R;Z1R;,S;T(T;T(T;K!uV;g;r;z;Fmi;t>i;t>K!uv>>Q?R@n@t@@GA[AaBcBmBZAnBv@oBv@oBm@pBBEC~BFC^@GC^@GCYC_CjCrCEDtFEDtFEDtFaCuFaCuFXCvFEGKGDGLGICMGICMG]@NGA?OGA?OGK!uQGZGeGlGxG~G@HVHwGWHjH}KjH}KjH}K\G~K\G~KK!u@LMLXL_LkLqLsLIMjLJM^MnNpNxO]MyOOLzOOLzOK!u|OFPQPXPdPjPlPtPcPuPFQVRHPWRHPWRK!uYRfRqRxRLSTS`SrSCTxTCSyTCSyTMUCVEVbVLUcVhRdVhRdVK!ufVlVwVVPWRXlXqXIYOYZYbYnYsYQYtYQYtYHYuYnVvYnVvYK!uxYAZLZmZA[G\I\W]@[X]CZY]CZY]K!u[]h]s]T^g^Pbg^Pbg^Pbj]Qbj]QbK!uSbabubufubufubufIgQgSglgHgmgGhLhdhjhmhshuhVilhWichXicbYicbYiK!u[iiiti{iLjoj{jAkCk]kzj^kki_kki_kK!uakxkClKl\lAmUm]m_mrmTmsmMnRnjnpn{nBoNoToVopoMoqornrornroinsozktozktoK!uvooJpQpepnqpqUrdpVrbrhrjr|ujr|ujr|uar}uAp~uAp~uK!uNvTvMvUvovtvRw[wQw\wmwvwFxMxOxXxExYxmxOylxPyxwQyxwQylwRyDwSyDwSybyNBbyNBbyNB|vOB|vOBgBpBfBqBECDDDCEDYBFDYBFDjD@EKEaEoEfFpFxFRGWGyGAHUH`IbIyITHzIpG{IpG{IOJWJcJnJJ^KFJ_KFJ_KgG`KgG`KbDaKbDaK@LaLlLzLDMLM_MQR_MQR_MQReRmRoRGSdRHSbSgSSETPTXTlTdUfUdVkTeVqVNW\WWXGTXXGTXX~SYXxKZXxKZXrXLYWYcYmYuYFZ}ZI[Q[jXR[jXR[WDS[WDS[[T[[T[g[o[Y\A]J]n]y]S^f^Ycf^Ycf^Yccckc|cDdOdWdhd^eFd_eFd_e{c`exe|eeEfGfOf~ePfweQf_fdgM\egM\egAhihrhqi|iWjjj}vjj}vjj}vGwOwiwnw~w^YwJxUx\xhxnxpxxxgxyxLxzxLxzx~w^Y|xFy[y\z^zzzZy{zE{L{`{h{t{G|W{H|W{H|HyI|HyI|~w^YK|V|k|Y}[}w}j|x}B~I~]~e~q~DT~ET~EX|FX|F~w^YHRdj@t@}@T~@T~@~w^Y@ANA`A^BhBoB{BACCCKCzBLCZCMDPANDPAND~w^YPDaDvD~E@F~FuDFIGPG\GbGdGlG[GmGcDnGcDnG~w^YpGzGNHzONHzONHzOPPuPPFQRQXQZQvQQQwQFPxQFPxQ{QARCRaRzQbREPcR|GdR|GdR~w^YfRsRGSzVGSzVGSzVDWLWfWkWWFXJXQXSXUXIXVXYX_XaX}XXX~XHXX~W@YXY^YaYgYiYqY`YrYWYsYuRtYuRtY~w^YvYDZXZx^XZx^XZx^B_J_d_i_}_D`H`P`R`f`G`g`j`q`s`v`i`w`F`x`|_y`QaWabaiaua{a}aEbtaFbYaGbYaGbPaHbFZIbFZIb~w^YKbabub|fub|fub|fFgOgcbPgcbPg~w^YRghg|gck|gck|gckmkukOlTlhlolsl{l}lQmrlRmUm\m^mamTmbmqlcmgldm|mBnMnTn`nfnhnpn_nqnDnrnDnrn{msnjgtnjgtn~w^YvnJoUo\opoxoDpXpgoYpgoYpgpnqLooqLooq~w^Yqq}qOrxrBsIs]sesqsEtTsFtTsFtTtFuqGuqGu~w^YIuUuiuOziuOziuOzYzazyzzJ{Q{]{c{e{m{\{n{A{o{A{o{xzp{Wuq{Wuq{~w^Ys{}{Q|UBQ|UBQ|UB_BgBBECPCXCdCADGCBDGCBD~BCD{DD{DD~w^YFDUD`DgDsDyD{DCErDDEWEUHWEUHWEUHcHmIWDnIWDnI~w^YpIyIDJLJ]J_KyK~KmLqMsMBOlLCOPOVOXOvOOOwOzO@PBP`PyOaPNObPZLcPZLcPuP{P}P[QtP\QnQtQvQTRmQURhRnRpRNSgROSbShSjSHTaSITmTuTIUQUSUfUHUgUAVFV^VbVeVkVmVKWdVLW]VMWdTNWdTNWfWlWnWLXeWMXPX\X_XmXpXvXxX@YoXAY^XBYOXCYdWDYSYYYRYZYZW[YZW[YNL\YNL\Y{I]Y{I]Y~w^YHZdZoZC[T[A\K\S\`\h\j\~\_\\B]J]L]^]A]_]^\`]@Za]@Za]}][^f^y^J_N`X```z``PaVaYa`adajalatacaua@bGbSbYb[bcbRbdbwaebwaebbafbXagbOahbwb}bvb~bu]bu]b]cpcycWdkdueweafjdbflftfNgSgdgjgmgsgug}glg~gcggNhThMhUhScVhScVhrhPi[inixi@jZj_jpjvjAkIk]kyk{kGm\kHmbmgmQnUo_oforoxozoBpqoCpAnDpAnDpZpapupsquqmrtpnrzr@sBsJsyrKsQpLsQpLsbsis}sAuCu{u|s|uHvNvPvXvGvYvYsZvYsZvsv|vPwUxWxLyOwMyjvNyjvNywmOywmOyxjPyxjPyojQyjhRyjhRyoYSyoYSyugTyugTy[Uy[Uy^[Vy^[VyGWyGWypyXzazt{{q|E}I~K~q~D}r~|~DTHTU[fnJAVAiA]jA]jATHTlAuA@BHBYBQC]CeCwAfCwAfCTHThCuC@DHD\DEEGEOF[DPFwCQFwCQFTHTSF[FoF}JoF}JoF}JRKZKmK`OmK`OmK`OIKaOIKaOlOtOAPHP[PaPlPtPHQFRHRYRGQZRcP[RcP[RZP\RkRqRjRrRKPsRKPsRESKSVS^SoSRTMSSTMSSTDSTTcTiTbTjTuRkTuRkTJPlT@PmTTMUXU`UsUFXsUFXsUFXTXxXOUyXOUyX~TzXIYWYHYXYoTYYoTYYOZYcO[YcO[YHK\Y]F]Y]F]YTHT_YpY{YCZOZcZwZh[j[{\vZ|\rY}\rY}\THT\H]Z][^w^}^H_P_d_j`l`v`c_w`^x`^x`v^y`HaNaGaOag^Pag^Pabahasa{aNb}dNb}dNb}dja~dja~daadNeTeMeUeRaVeRaVef^WeJ]XeJ]XeTHTZeceneueAfGfIf_f@f`fsfFjsfFjsfFjeeGjeeGjTHTIjVjajhjtjzj|jRksjSkgkwlylAnfkBnXjCnXjCnTHTEnOnZnanmnsnun}nln~nOo_pQn`pQn`pTHTbpopzpAqUq]qiq{qLrAsLqBsLqBsVsLtNtktUsltqpmtqpmtTHTotut@uHuYu[vuvzvRwXwcwkwww|wZw}wZw}wQw~wwtwwtwTHTAxJxUxvxJyPzRz`{Iya{Lxb{Lxb{THTd{q{|{]|p|Y@p|Y@p|Y@s{Z@s{Z@THT\@j@~@~D~@~D~@~DREZE\EuEQEvEPFUFmFsFvF|F~F_GuF`GlFaGl@bGl@bGTHTdGrG}GDHUHxHDIJILIfICIgItGhItGhITHTjIAJLJTJeJJK^KfKhK{K]K|KVL[LsLyLDMKMWM]M_MyMVMzM{L{M{L{MrL|MCJ}MCJ}MTHTMHNSNZNnNwOyO^PmN_PkPqPsPETsPETsPETjPFTJNGTJNGTTHTWT]TVT^TxT}T[UdUZUeUvUUOVVVXVaVNVbVvVXWuVYWAVZWAVZWuU[WMU\WMU\WkWW`kWW`kWW`EUX`EUX`p`y`o`z`NaMbMaNbb`Obb`ObsbIcTcjcxcodydAe[e`eBfJf^figkgBh]fChyeDhyeDhXh`hlhwhHigiOhhiOhhipeiipeiikbjikbjiIjjjujCkMkUkhkZphkZphkZpnpvpxpPqmpQqkqpqHrNrYrarurmsosmttrntztWueu`vPravPravGrbvAjcvAjcv{vUw`wlwvw~wOxFyRyZysv[ysv[y`b\y`b\ydy]ydy]y}^y}^yey{y|y|y|y
    |yKrc$&Txt|tstd|pdzdz|d|pdzdzdddgddd	id
    ddd
    iddddgdd
    ddddddgdd
    dddddddddddd
    idddd d!gddd
    idd"gd#d$dd%d&d'd
    d(d)id(d*igd+d,d-d.dd	d/dd0d1gd	d2ddd
    id3dd4d5gdd
    id6dd7d5gdd
    id6dd8d9gd:d;d<id=gd>d?gd@dd	dAdBdid%d&d'd
    d(d)id(d*igd+gidCdd
    iidDdEgdFdd	dAd(d)idBdGigidCddd
    ididDdHgdIddJdKgdLdd	dAd(d)idBdGigidCddd
    ididDdMdd
    d)ddNdOdPdQdd
    d)ddRddSgdTddCddd
    ididUdVgdWddCd
    dXdidUdYddd
    igdZd[d\d]dd^d	d_d`gdadbdcddgdd	dedd
    iidegdfdgdhdidd	djdAdd
    iddd
    idgiidjgdkgd>dgdhdidd	djdAdd
    iddd
    idgiidjgdkdgdhdidd	djdAdd
    iddd
    idgiidjgdkdgdhdidd	djdAdd
    iddd
    idgiidjgdkdgdhdidd	djdAdd
    iddd
    idgiidjgdkdd(dlid	dmdgdhdidd	djdAdd
    iddd
    idgiidjgdkidndgdhdidd	djdAdd
    iddd
    idgiidjgdkdodpdd
    iiigdjgdqdrdsd%d&d'd
    d(d)id(d*igd+dgdhdidd	djdAdd
    iddd
    idgiidjgdkdadbdcddgdd	dedd
    iidegdfd-d.dd	d/dd0d1gd	d2ddd
    id3dd4d5gdd
    id6dd7d5gdd
    id6dd8d9gd:d;d<id=dtdudvt|t}|'rXt|}d
    |vr|d
    |d
    }t|ttfs)td|pdzdwz|d|pdzdxzddd
    iddvt|ttf}|rt|}t|D]t\}}	t|	tsZtd|pdzdyjditzdzz|	d|pdzdyjditzdzdd
    idvud|vr|d|d}
    t|
    ttfs-td|pdzd{z|
    d|pdzd|zddgdd
    ddddvt|
    ttf}|rt|
    }t|
    D]\}
    }t|ts[td|pdzd}jditzdzz|d|pdzd}jditzdzd
    dddvt|trl|d|s[td|pdzd}jditzd~z|d|pdzd}jditzdzd
    ddd(vd|vr|d|d}t|ttfs-td|pdzdz|d|pdzdzddgdd
    ddddvt|ttf}|rt|}t|D]\}}t|ts[td|pdzdjditzdzz|d|pdzdjditzdzd
    dddvt|trl|d|s[td|pdzdjditzd~z|d|pdzdjditzdzd
    ddd(vd|vrY|d|d}t|ts'td|pdzdz|d|pdzdzddddvd|vr|d|d}t|ttfs+td|pdzdz|d|pdzdzdddd
    idddvt|ttf}|rt|}t|D]t\}}t|tsZtd|pdzdjditzdzz|d|pdzdjditzdzdd
    idvud|vr|d|d}t|ttfs,td|pdzdz|d|pdzdzd d!gddd
    iddvt|ttf}|rt|}t|D]t\}}t|tsZtd|pdzdjditzdzz|d|pdzdjditzdzdd
    idvud"|vr|d"|d"}d} | dkr	t|ttfs4td|pdzdz|d|pdzdzd$dd%d&d'd
    d(d)id(d*igd+d,dvt|ttf}!|!rQt|}"t|D]2\}#}$t|$||pddjditz3| dz
    } n#t$rYnwxYw| dkr-	t|||pddz| dz
    } n#t$rYnwxYw| dkrtd|pdzdzdt| zdzz|d|pdzdzgd#d$dd%d&d'd
    d(d)id(d*igd+d,d-d.dd	d/dd0d1gd	d2ddd
    id3dd4d5gdd
    id6dd7d5gdd
    id6dd8d9gd:d;d<id=gd>dAvd?|vr
    |d?|d?}%t|%tsBtd|pdzdz|%d|pdzdzgd@dd	dAdBdid%d&d'd
    d(d)id(d*igd+gidCdd
    iidDdvt|%t}&|&r~t|%}'|%D]\}(})t"dC|(r|(|'vr|'|(t|)tsZtd|pdzdjditzdzz|)d|pdzdjditzdzdd
    idv|'rUtd|pdzdzt|'zdz|%d|pdzdzgd@dd	dAdBdid%d&d'd
    d(d)id(d*igd+gidCdd
    iidDdvt|%}*|*dkr.d}+|%D]}(	d},|,dkrC	|(dkr&td|pdzdz|(d|pdzdzdBdidBv|,dz
    },n#t$rYnwxYw|,dkr-	t|(||pddz|,dz
    },n#t$rYnwxYw|,dkrLtd|pdzdzdt|,zdzz|(d|pdzdzdAdBdid%d&d'd
    d(d)id(d*igd+gidAv#t$rd	}+YwxYw|+sBtd|pdzdz|%d|pdzdzgd@dd	dAdBdid%d&d'd
    d(d)id(d*igd+gidCdd
    iidDdvdE|vr|dE|dE}-t|-ts;td|pdzdz|-d|pdzdzgdFdd	dAd(d)idBdGigidCddd
    ididDdvt|-t}.|.r]t|-}/|-D]j\}0}1t"dC|0rC|0|/vr|/|0t|1ttfs]td|pdzdjditzdz|1d|pdzdjditzdzddd
    iddvt|1ttf}2|2rt|1}3t|1D]t\}4}5t|5tsZtd|pdzdjditzdzz|5d|pdzdjditzdzdd
    idvul|/rNtd|pdzdzt|/zdz|-d|pdzdzgdFdd	dAd(d)idBdGigidCddd
    ididDdvt|-}6|6dkrVd}7|-D]}0	d}8|8dkrc	t|0tr7|d)|0s&td|pdzdz|0d|pdzdzd(d)id(v|8dz
    }8n#t$rYnwxYw|8dkrC	|0dGkr&td|pdzdz|0d|pdzdzdBdGidBv|8dz
    }8n#t$rYnwxYw|8dkrBtd|pdzdzdt|8zdzz|0d|pdzdzdAd(d)idBdGigidAv#t$rd	}7YwxYw|7s;td|pdzdz|-d|pdzdzgdFdd	dAd(d)idBdGigidCddd
    ididDdvdH|vr[|dH|dH}9t|9ts)td|pdzdz|9d|pdzdzgdIddJdvdK|vr|dK|dK}:t|:ts;td|pdzdz|:d|pdzdzgdLdd	dAd(d)idBdGigidCddd
    ididDdvt|:t};|;r]t|:}<|:D]j\}=}>t"dC|=rC|=|ttfs]td|pdzdjditzdz|>d|pdzdjditzdzddd
    iddvt|>ttf}?|?rt|>}@t|>D]t\}A}Bt|BtsZtd|pdzdjditzdzz|Bd|pdzdjditzdzdd
    idvul|dgdhdidd	djdAdd
    iddd
    idgiidjgdkdgdhdidd	djdAdd
    iddd
    idgiidjgdkdgdhdidd	djdAdd
    iddd
    idgiidjgdkdgdhdidd	djdAdd
    iddd
    idgiidjgdkdd(dlid	dmdgdhdidd	djdAdd
    iddd
    idgiidjgdkidndgdhdidd	djdAdd
    iddd
    idgiidjgdkdodpdd
    iiigdjgdqdrdsdvt|ct}d|drt|c}ed|evr|edǦ|cd}fd}g|gdkr-	t'|f||pddz|gdz
    }gn#t$rYnwxYw|gdkr-	t)|f||pddz|gdz
    }gn#t$rYnwxYw|gdkrftd|pdzdzdt|gzdzz|fd|pdzdzd_d`gdadbdcddgdd	dedd
    iidegdfdgdhdidd	djdAdd
    iddd
    idgiidjgdkgd>dAvd|evr3|edʦ|cd}ht)|h||pddzd|evr3|ed̦|cd}it)|i||pddzd|evr3|edΦ|cd}jt)|j||pddzd|evr3|edЦ|cd}kt)|k||pddzd|evrF|edҦ|cd}lt|ltsCtd|pdzdz|ld|pdzdzdd(dlid	dmdgdhdidd	djdAdd
    iddd
    idgiidjgdkidndvt|lt}m|mrt|l}n|lD]k\}o}pt"dm|orF|o|nvr|n|ot)|p||pddjditzl|nrVtd|pdzdzt|nzdz|ld|pdzdzdd(dlid	dmdgdhdidd	djdAdd
    iddd
    idgiidjgdkidndvt|l}q|qdkrd}r|lD]a}o	t|otr7|dl|os&td|pdzdz|od|pdzdzd(dlid(vP#t$rd	}rY^wxYw|rsCtd|pdzdz|ld|pdzdzdd(dlid	dmdgdhdidd	djdAdd
    iddd
    idgiidjgdkidndvd|evr|ed٦|cdxd}s|ss-	t)x||pddz|sdz
    }sn#t$rYnwxYw|ss	txt}t|tr}tx}udp|uvrX|udpxdp}vt|vts&td|pdzdz|vd|pdzdzdd
    idv|sdz
    }sn#t$rYnwxYw|ssFtd|pdzdzxd|pdzdzdgdhdidd	djdAdd
    iddd
    idgiidjgdkdodpdd
    iiigdjgdqdެvtxt}t|trptx}wt+xfd߄dDsFtd|pdzdzxd|pdzdzdgdhdidd	djdAdd
    iddd
    idgiidjgdkdodpdd
    iiigdjgdqdv|er	td|pdzdzt|ezdz|cd|pdzdzdd^d	d_d`gdadbdcddgdd	dedd
    iidegdfdgdhdidd	djdAdd
    iddd
    idgiidjgdkgd>dgdhdidd	djdAdd
    iddd
    idgiidjgdkdgdhdidd	djdAdd
    iddd
    idgiidjgdkdgdhdidd	djdAdd
    iddd
    idgiidjgdkdgdhdidd	djdAdd
    iddd
    idgiidjgdkdd(dlid	dmdgdhdidd	djdAdd
    iddd
    idgiidjgdkidndgdhdidd	djdAdd
    iddd
    idgiidjgdkdodpdd
    iiigdjgdqdrdsdv|rtd|pdzdzt|zdz|d|pdzdzdddgddd	id
    ddd
    iddddgdd
    ddddddgdd
    dddddddddddd
    idddd d!gddd
    idd"gd#d$dd%d&d'd
    d(d)id(d*igd+d,d-d.dd	d/dd0d1gd	d2ddd
    id3dd4d5gdd
    id6dd7d5gdd
    id6dd8d9gd:d;d<id=gd>d?gd@dd	dAdBdid%d&d'd
    d(d)id(d*igd+gidCdd
    iidDdEgdFdd	dAd(d)idBdGigidCddd
    ididDdHgdIddJdKgdLdd	dAd(d)idBdGigidCddd
    ididDdMdd
    d)ddNdOdPdQdd
    d)ddRddSgdTddCddd
    ididUdVgdWddCd
    dXdidUdYddd
    igdZd[d\d]dd^d	d_d`gdadbdcddgdd	dedd
    iidegdfdgdhdidd	djdAdd
    iddd
    idgiidjgdkgd>dgdhdidd	djdAdd
    iddd
    idgiidjgdkdgdhdidd	djdAdd
    iddd
    idgiidjgdkdgdhdidd	djdAdd
    iddd
    idgiidjgdkdgdhdidd	djdAdd
    iddd
    idgiidjgdkdd(dlid	dmdgdhdidd	djdAdd
    iddd
    idgiidjgdkidndgdhdidd	djdAdd
    iddd
    idgiidjgdkdodpdd
    iiigdjgdqdrdsd%d&d'd
    d(d)id(d*igd+dgdhdidd	djdAdd
    iddd
    idgiidjgdkdadbdcddgdd	dedd
    iidegdfd-d.dd	d/dd0d1gd	d2ddd
    id3dd4d5gdd
    id6dd7d5gdd
    id6dd8d9gd:d;d<id=dtdudv|S)Nrr
    rrrrrrFrrrrrxrrrr-rfrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr	r3r
    rrrErrrFrrrrrrrrrrrrrrrrrrrrrrrrrrrrzrrrrrrrrrrrrr8rrrrr%r?rrrrrrz.platforms must be arrayz
    .platformsz.platforms[{data__platforms_x}]r#z.provides must be arrayz	.providesz.provides[{data__provides_x}]z must be pep508-identifierz.obsoletes must be arrayz
    .obsoletesz.obsoletes[{data__obsoletes_x}]z.zip-safe must be booleanz	.zip-safez.script-files must be arrayz
    .script-filesz$.script-files[{data__scriptfiles_x}]z.eager-resources must be arrayz.eager-resourcesz*.eager-resources[{data__eagerresources_x}]rz.packages must be arrayz	.packagesz.packages[{data__packages_x}]rz1.packages must be valid exactly by one definition ( matches found)z.package-dir must be objectz.package-dirz#.package-dir.{data__packagedir_key}z.package-dir must not contain r$r$Tz/.package-dir must be same as const definition: z4.package-dir must be valid exactly by one definitionz5.package-dir must be named by propertyName definitionrqz.package-data must be objectz
    .package-dataz%.package-data.{data__packagedata_key} must be arrayz@.package-data.{data__packagedata_key}[{data__packagedata_val_x}]z.package-data must not contain z(.package-data must be python-module-namez1.package-data must be same as const definition: *z5.package-data must be valid exactly by one definitionz6.package-data must be named by propertyName definitionz%.include-package-data must be booleanz.include-package-dataz$.exclude-package-data must be objectz.exclude-package-dataz4.exclude-package-data.{data__excludepackagedata_key}zV.exclude-package-data.{data__excludepackagedata_key}[{data__excludepackagedata_val_x}]z'.exclude-package-data must not contain z0.exclude-package-data must be python-module-namez9.exclude-package-data must be same as const definition: *z=.exclude-package-data must be valid exactly by one definitionz>.exclude-package-data must be named by propertyName definitionz!.namespace-packages must be arrayz.namespace-packagesz0.namespace-packages[{data__namespacepackages_x}] must be python-module-namez.py-modules must be arrayz.py-modulesz .py-modules[{data__pymodules_x}]z.data-files must be objectz.data-filesz!.data-files.{data__datafiles_key}z:.data-files.{data__datafiles_key}[{data__datafiles_val_x}]z.cmdclass must be objectz	.cmdclassz.cmdclass.{data__cmdclass_key}z$ must be python-qualified-identifierz.license-files must be arrayz.license-filesz&.license-files[{data__licensefiles_x}]z.dynamic must be object.dynamicr.z.dynamic.versionz8.dynamic.version must be valid exactly by one definitionr]z.dynamic.classifiersrz.dynamic.descriptionrrz.dynamic.dependenciesrmz.dynamic.entry-pointsrvz-.dynamic.optional-dependencies must be objectz.dynamic.optional-dependencieszH.dynamic.optional-dependencies.{data__dynamic__optionaldependencies_key}z0.dynamic.optional-dependencies must not contain z8.dynamic.optional-dependencies must be python-identifierzG.dynamic.optional-dependencies must be named by propertyName definitionr4z.dynamic.readmez+.dynamic.readme.content-type must be stringz.dynamic.readme.content-typez5.dynamic.readme cannot be validated by any definitionr7c3 K|]}|vV	dSrr)rr data__dynamic__readmes  rr"zYvalidate_https___setuptools_pypa_io_en_latest_references_keywords_html..s)"V"VT4+@#@"V"V"V"V"V"Vrr8z0.dynamic.readme must contain ['file'] propertiesr&z.dynamic must not contain r%r)r&r'rr(r)r*r-r.r+r/r0rr1bool`validate_https___setuptools_pypa_io_en_latest_references_keywords_html__definitions_package_namebvalidate_https___setuptools_pypa_io_en_latest_references_keywords_html__definitions_find_directiverREGEX_PATTERNSsearchbvalidate_https___setuptools_pypa_io_en_latest_references_keywords_html__definitions_attr_directivebvalidate_https___setuptools_pypa_io_en_latest_references_keywords_html__definitions_file_directiver,)yr
    rrr5r6data__platformsdata__platforms_is_listdata__platforms_lendata__platforms_xdata__platforms_itemdata__providesdata__provides_is_listdata__provides_lendata__provides_xdata__provides_itemdata__obsoletesdata__obsoletes_is_listdata__obsoletes_lendata__obsoletes_xdata__obsoletes_item
    data__zipsafedata__scriptfilesdata__scriptfiles_is_listdata__scriptfiles_lendata__scriptfiles_xdata__scriptfiles_itemdata__eagerresourcesdata__eagerresources_is_listdata__eagerresources_lendata__eagerresources_xdata__eagerresources_itemdata__packagesdata__packages_one_of_count1data__packages_is_listdata__packages_lendata__packages_xdata__packages_itemdata__packagedirdata__packagedir_is_dictdata__packagedir_keysdata__packagedir_keydata__packagedir_valdata__packagedir_lendata__packagedir_property_names"data__packagedir_key_one_of_count2data__packagedatadata__packagedata_is_dictdata__packagedata_keysdata__packagedata_keydata__packagedata_valdata__packagedata_val_is_listdata__packagedata_val_lendata__packagedata_val_xdata__packagedata_val_itemdata__packagedata_len data__packagedata_property_names#data__packagedata_key_one_of_count3data__includepackagedatadata__excludepackagedata data__excludepackagedata_is_dictdata__excludepackagedata_keysdata__excludepackagedata_keydata__excludepackagedata_val$data__excludepackagedata_val_is_list data__excludepackagedata_val_lendata__excludepackagedata_val_x!data__excludepackagedata_val_itemdata__excludepackagedata_len'data__excludepackagedata_property_names*data__excludepackagedata_key_one_of_count4data__namespacepackagesdata__namespacepackages_is_listdata__namespacepackages_lendata__namespacepackages_xdata__namespacepackages_itemdata__pymodulesdata__pymodules_is_listdata__pymodules_lendata__pymodules_xdata__pymodules_itemdata__datafilesdata__datafiles_is_dictdata__datafiles_keysdata__datafiles_keydata__datafiles_valdata__datafiles_val_is_listdata__datafiles_val_lendata__datafiles_val_xdata__datafiles_val_itemdata__cmdclassdata__cmdclass_is_dictdata__cmdclass_keysdata__cmdclass_keydata__cmdclass_valdata__licensefilesdata__licensefiles_is_listdata__licensefiles_lendata__licensefiles_xdata__licensefiles_item
    data__dynamicdata__dynamic_is_dictdata__dynamic_keysdata__dynamic__version$data__dynamic__version_one_of_count5data__dynamic__classifiersdata__dynamic__descriptiondata__dynamic__dependenciesdata__dynamic__entrypoints#data__dynamic__optionaldependencies+data__dynamic__optionaldependencies_is_dict(data__dynamic__optionaldependencies_keys'data__dynamic__optionaldependencies_key'data__dynamic__optionaldependencies_val'data__dynamic__optionaldependencies_len2data__dynamic__optionaldependencies_property_names#data__dynamic__readme_any_of_count6data__dynamic__readme_is_dictdata__dynamic__readme_keys"data__dynamic__readme__contenttypedata__dynamic__readme_lenrSsy                                                                                                                        @rr4r4hsdT##EN&r[-BF'CFW'W_cjlp{qF@FkGJLkLeMVU`{NaNaNaksMRbAncny@LRT\K]p^p^bAn`j@B^~_ipDLXk{l{llmlmbAnozO}[N\fmAIUhxixi|j|jbAnlvHNXaxbxbbAndrDBLS_ego^p~qtrtrbAntEZb d b!Yc!m!t!@"F"H"P"!Q"GR"GR"bAnT"^"r"^*r"^*r"^*t*Y+c+j+}+Y,d,x,I-v-@.H.U.]._.s.T.t.w..A/S/v.T/S.U/u+V/u+V/j*W/j*W/a//J0]0g0o0I1N1_1e1p1x1L2h2j2v3K2w3Q4V4@5D6N6U6a6g6i6q6`6r6p4s6p4s6I7P7d7b8d8\9c7]9i9o9q9y9h9z9@7{9@7{9Q:X:l:p;r;j<k:k<w<}<(>%CLM^C_C_SS?')?%&(*>%f-445IJJS/3HHH1889MNNN)*>FFS":2AVPV;W[GZ[G[S[SJPJRJR[S[SAAEE!F';r'A'A.Fr[Mb\bGcgXHX`t{}ALAVPV{WZh{hv}AuBIP/Q/Q/Q)Q$F!$K$F$F'? E E E EAAEE!F%EFZ\jmxmB|BFTlT%U%U%U$F!$K$F$F'? E E E EAQFF&>r[EZTZ?[_U@UY]`cdF`G`GYGJ[Y[@\dxAEPEZTZ[^llzAELNPDQ[wBVgT^fs{}QrRU]_qTrqsStStCuyv}D	'E	'E	'E	!E	 G7DDD>C;;;D:x
    6r[=RF7SWN8NVfmos~sHBHmILZmZylylylv~X]qx|C	E	G	{H	R	n	y	M
    ^
    KU]jrtHiILTVhKihjJ	kJ	kzlpmE
    K
    N
    T
    V
    ^
    M
    _
    D
    `
    ga
    ga
    h
    w
    x
    x
    x
    x
    Y&&^,,, $^ 4/$88
    Y.r[5JF/KNl/luFMOS^ShbhMil{M{ZzZzZzDLfkF	J	R	T	h	I	i	l	s	u	x	k	y	H	z	~{	S
    Y
    d
    k
    w
    }
    
    Gv
    H[
    I[
    IR
    JHKHKRXYYYY(23Dd(K(K%((
    D),->-C-C-E-E)F)F&DUD[D[D]D][[@)+@%f-445JKK
    [04JJJ299:OPPP)*?$OOs":2AVPV;W[I[B[I[U[ULRLTLT[U[U(>%(A--7;41BEE-EBC?BQFF!F'12G'M'M%d/S~>R/STi/j/j)d2J2Q\Qf`fKgkULU]ry{JTNTyUXgygu}StT[c3d3d3d-d$G1$L$G$G'? E E E EBQFF!F'<'C'C.Fr[Mb\bGcgZHZbw~@DODYSY~Z]l~lzACFyGNU/V/V/V)V$G1$L$G$G'? E E E EBaGG&>r[EZTZ?[_V@VZ^adeHaIaIZIL]Z]@^f{BDHSH]W]B^apBp~EIQSgHhkrtwjxGy}zAH'I'I'I!I H7EEE?D<<<E;D6r[=RF7SWO8OWhoqu@uJDJoKN]o]|\|\|\fnH	M	a	h	l	t	v	J
    k	K
    N
    U
    W
    Z
    M
    [
    j	\
    `	]
    u
    {
    FMY_aiXj}
    k}
    kt
    ljmjmtCDDDD!Y..3444'+,B'C$6??
    [.r[5JF/KNu/u~V]_cncxrx]y|S]SryryryCL`M`MTZ[[[[!Y..3444'+,B'C$6??
    w
    .r[5JF/KNt/t}U\^bmbwqw\x{R\RqXqXqXbjDI]dhprF	gG	J	Q	S	V	I	W	fX	\Y	q	w	B
    I
    U
    [
    ]
    e
    T
    f
    y	g
    y	g
    p	h
    _i
    _i
    p
    v
    w
    w
    w
    w
    /9:RTX/Y/Y,/(
    b034L4Q4Q4S4S0T0T-RjRpRpRrRrNNN02N%f-445QRR
    N7;XXX9@@A]^^^)*Fu
    VVX":2AVPV;W[X[Q[X[d[d[a[c[c[d[d@a'12SVY'['[!N*B2I^X^C_cBc{cBcNcNEKEMEMcNcNDNQbDbjKRTXcXmgmRnqPqIqPq\q\SYS[S[q\q\R\_aRaouwn@GM+N+N+N%N!N0229N3OR{3{|A^}_}_4_`m4muMTVZeZoioTpsJTJiPiPiPZb|A	U	\	`	h	j	~	_		B
    I
    K
    N
    A
    O
    ^	P
    T	Q
    i
    o
    z
    AMSU]L^q
    _q
    _h
    `WaWah~/23K/L/L,/144>B;8PLL4LIJFIAMM!F'12NPS'T'T%{/S~>R/STp/q/q){2J2Q\Qf`fKgk]L]eAHJNYNc]cHdg~H~LTVjKkrz3{3{3{-{$NRS$S$N$N'? E E E EIAMM!F'Cs'J'J.Fr[Mb\bGcgbHbjFMOS^ShbhMilCMCQXZ]P^el/m/m/m)m$NRS$S$N$N'? E E E EIQNN&>r[EZTZ?[_^@^bfilmWiXiXbX[lbl@muQXZ^i^smsXtwNXN\cgoqEfFIPRUHVeW[X_f'g'g'g!g O7LLLFKCCCLBb6r[=RF7SWW8W_w~@DODYSY~Z]t~tSzSzSzDLfkF	J	R	T	h	I	i	l	s	u	x	k	y	H	z	~{	S
    Y
    d
    k
    w
    }
    
    Gv
    H[
    I[
    IR
    JAKAKRabbbb9,,1222&*+?&@#5e}EE
    J.r[5JF/KNq/qzQXZ^i^smsXtwLXLbi}EQetftft{Y|Y|CIJJJJ.89PSWY^R_.`.`+.
    c.12I.J.J+OXYpOqOqccK-/K%&BSJJQ6r[=RF7SWPWIWPW\W\SYS[S[W\W\8\_p8pxT[]alavpv[wzszlzszzv|v~v~zz[BD[DZbnBQCQCJPQQQQ!">DDcC~.BCD`aac":2AVPV;W[T[M[T[`[`W]W_W_[`[`<`c@<@Hdkmq|qF@FkGJCJ|JCJOJOFLFNFNJOJOkORTkTjr~RaSaSZb#c#c#cc9$$\***"<0Ooe}==
    W.r[5JF/KNi/irAHJNYNc]cHdgtHtQzDK_gsGVHVHVHAIAIPVWWWW&04-&P&P#&
    {&)/&:&:#?H?Y?Y{{;%';%&:SBBi6r[=RF7SVVxVWLWLCICKCKWLWL8LO`8`h|CEITI^X^C_bKbDbKbWbWNTNVNVbWbWCWZ\C\rzFZi[i[bhiiii!"6<<{C~.BCDXYY{":2AVPV;W[DZ|[D[P[PGMGOGO[P[PL>R>R>T>TKK:&(:%f-445GHHK-1DDD/667IJJJ)*>K#P>2O#PQc#d#dK&>r[EZTZ?[_F^~_F_R_RIOIQIQ_R_R@RU{@{CU\^bmbwqw\x{b{[{b{n{nekemem{n{n\nqs\sIQ]z@{@{BJ'K'K'K!Ki''_---!%o!604-@@
    o.r[5JF/KNl/luGNPT_TiciNjm}N}SZflnvewJHJHJHV`JaJahnoooo)34Fu
    )V)V&)
    X),-?)@)@&ENOaEbEbXXA(*A%&=EEX6r[=RF7SWFV~WFWRWRIOIQIQWRWR8RUf8fnELNR]RgagLhkZkSkZkfkf]c]e]ekfkfLfikLkyAIxJQWXXXXX	!!Y''' OMmd44
    s6.r[5JF/KNg/go|DFJUJ_Y_D`cmDmCK\^x}lprAkBXktR	f	p
    r
    \e	]goIN_ehnpxgy^zI
    O
    H
    P
    NQ
    NQ
    [
    y
    DWhlv~X]ntw~BHJRAS^eqwyApBUCUC@DvEmFU[T\S
    ]S
    ]M^Y_Y_xVatEIS[uzKQT[_ego^p{BNTV^M_r`r`]aSbJcrxqypzpzSq|O`dnvPUflovz@BJyKV]ioqyhzM{M{x|n}e~MSLTKUKUoMXk|@ J R l q B!H!K!R!V!\!^!f!U!g!r!y!E"K"M"U"D"V"i!W"i!W"T!X"J!Y"A!Z"i"o"h"p"gq"gq"K#i#t#G$X$\%f%n%H&M&^&d&g&n&r&x&z&B'q&C'N'U'a'g'i'q'`'r'E's'E's'p&t'f&u']&v'E(K(D(L(C#M(C#M(q(y(M)U)W)j)L)k)E*J*b*f*p*N+Y+l+}+A-K-S-m-r-C.I.L.S.W.]._.g.V.h.s.z.F/L/N/V/E/W/j.X/j.X/U.Y/K.Z/B.[/j/p/i/q/h*r/h*r/a*s/h(t/h(t/S0q0|0O1`1d2n2v2P3U3f3l3o3v3z3@4B4J4y3K4V4]4i4o4q4y4h4z4M4{4M4{4x3|4n3}4e3~4M5S5L5T5K0U5K0U5X5d5g5u5x5~5@6H6w5I6f5J6W5K6J0L6[6a6Z6b6@0c6@0c6Md6Md6ze6ze6l6r6s6s6s6s6$.}d$C$C!$Z
    p7%(););)=)=%>%>" 222&--i888-:9-E*;<8;a??>~@VXfiti~x~BThTUUU@AE@@7====;a??>~@VXfiti~x~BThTUUU@AE@@7====;q@@6r[=RF7SWQ8QUY\_`D\E\EUEHYUY8ZbxAEPEZTZ[^ppPTVeOf|OXvJ	T
    V
    @I	AKSmrCILRT\K]B^msltruru]
    h
    {
    LPZb|ARX[bflnvewBIU[]eTfygygdhZiQjyx@wAwAqB}C}CJQRRRR $666&--m<<<1>}1M.vxRTbepeztz~TdTUUU $666&--m<<<1>}1M.vxRTbepeztz~TdTUUU!%777&--n===2?2O/vxSUcfqf{u{VeVWWW!%777&--n===1>~1N.vxRTbepeztz~UdUVVV*.@@@&--.EFFF:GH_:`7%&IDRR^6r[=RF7SWF8FNqxz~I~SMSxTWwxwMUiqsFhGaf~BLjuHY]goI	N	_	e	h	o	s	y	{	C
    r	D
    O
    V
    b
    h
    j
    r
    a
    s
    F
    t
    F
    t
    q	u
    g	v
    ^	w
    FLEMDNDN}ODPDPW]^^^^BLMprvBwBw?BICFGjGoGoGqGqCrCr@qTqZqZq\q\uulCEl-d3::;bccu#JNv#v#v$L$S$ST{$|$|$|!CDkm{~I~SMSWhWaWhWtWtkqksksWtWt}t!u!u!uCq":2AVPV;W[MQ/RSz/{/{)V2J2Q\Qf`fKgkeLemT[]alavpv[wzZ[ZhprEgFMU3V3V3V-V'?!_!_!_Y^$V$V$V!_#UI&>r[EZTZ?[_h@hpSZ\`k`uouZvyYZYowKSUhJiCH`dnLWj{I	Q	k	p	A
    G
    J
    Q
    U
    [
    ]
    e
    T
    f
    q
    x
    DJLTCUh
    Vh
    VS
    WI
    X@
    Yhngofpfp_qfrfryH'I'I'I!I111&--h777,9(,C):;7>>>~@UWehsh}w}ARgRSSS?1D??7====>>
    >$E$En$U$U$UI^_mIn$F+56X[^+`+`%o.Fr[Mb\bGcgTHT\~EGKVK`Z`EadBEBPVX`Oahn/o/o/o)o?1D??7====>a
    6r[=RF7SWN8NVkrtxCxMGMrNQbrbB`k~OS]eDU[^eioqyhzELX^`hWi|j|jgk]lTm|B	{C	zD	zD	G	S	V	d	g	m	o	w	f	x	U	y	F	z	y{	J
    P
    I
    Q
    oR
    oR
    Y
    `
    a
    a
    a
    a
    4>?TVZ4[4[14c
    478M4N4N1""V"V"V"VX"V"V"VVVc
    ":2AVPV;W[MO>c>h?j?_@b>`@}=a@}=a@J5b@J5b@K2c@K2c@B2d@}/e@}/e@M+f@D#g@D#g@Feni@v@JA}DJA}DJA}DGEOEiEnEBFIFMFTFVFXFLFYFcFFJG^GoG\HfHnH{HCIEIYIzHZI]IeIgIyI\IzIyH{I[F|I[F|IKF}IAF~IVJ\J_JeJgJoJ^JpJUJqJx@rJx@rJFentJBKVKvOVKvOVKvO@PHPbPgP{PBQFQNQPQdQEQeQhQoQqQtQgQuQDQvQzPwQORUR`RgRsRyR{RCSrRDSWRESWRESNRFSDKGSDKGSFenIS_SsSzWsSzWsSzWDXMXaSNXaSNXFenPXfXzXa\zXa\zXa\k\s\M]R]f]m]q]y]{]O^p]P^S^Z^\^_^R^`^o]a^e]b^z^@_K_R_^_d_f_n_]_o_B_p_B_p_y^q_hXr_hXr_Fent_H`S`Z`n`v`BaVae`Wae`WaealbJ`mbJ`mbFenob{bMcvc@dGd[dcdodCeRdDeRdDeReDf}bEf}bEfFenGfSfgfMkgfMkgfMkWk_kwk}kHlOl[lalclklZlllkmlkmlvknlUfolUfolFenql{lOmSsOmSsOmSs]ses}sCtNtVtbttEt@uEt@u|sAu}lBu}lBuFenDuSu^ueuquwuyuAvpuBvUvSyUvSyUvSyaykzUulzUulzFennzwzB{J{[{]|w|||k}o~q~@@j}A@W@j@s@QAeAoBqB[CdA\CfCnCHDMD^DdDgDmDoDwDfDxD]DyDHENEGEOEM@PEM@PEZExECFVFgFkGuG}GWH\HmHsHvH}HAIGIIIQI@IRI]IdIpIvIxI@JoIAJTIBJTIBJHCJuHDJlHEJTJZJSJ[JRE\JRE\JL@]JX}^JX}^JwJUK`KsKDLHMRMZMtMyMJNPNSNZN^NdNfNnN]NoNzNAOMOSOUO]OLO^OqN_OqN_O\N`ORNaOINbOqOwOpOxOoJyOoJyORPpP{PNQ_QcRmRuROSTSeSkSnSuSySSATITxSJTUT\ThTnTpTxTgTyTLTzTLTzTwS{TmS|TdS}TLURUKUSUJPTUJPTUnULVWVjV{VWIXQXkXpXAYGYJYQYUY[Y]YeYTYfYqYxYDZJZLZTZCZUZhYVZhYVZSYWZIYXZ@YYZhZnZgZoZfUpZfUpZJ[h[s[F\W\[]e]m]G^L^]^c^f^m^q^w^y^A_p^B_M_T_`_f_h_p___q_D_r_D_r_o^s_e^t_\^u_D`J`C`K`B[L`B[L`p`x`LaTaVaiaKajaDbIbabebobMcXckc|c@eJeReleqeBfHfKfRfVf\f^fffUfgfrfyfEgKgMgUgDgVgifWgifWgTfXgJfYgAfZgigoghgpggbqggbqg`brgg`sgg`sgRhph{hNi_icjmjujOkTkekkknkukykkAlIlxkJlUl\lhlnlplxlglylLlzlLlzlwk{lmk|ldk}lLmRmKmSmJhTmJhTmWmcmfmtmwm}mmGnvmHnemInVmJnIhKnZn`nYnangbngbnL}cnL}cnyzdnyzdnFenOokovoJp[pHqRqZqgqoqqqErfqFrIrQrSrerHrfreqgrGohrGohrDsbsms@tQtUu_uguAvFvWv]v`vgvkvqvsv{vjv|vGwNwZw`wbwjwYwkw~vlw~vlwivmw_vnwVvow~wDx}wEx|rFx|rFxdxwx@y^yry|z~zh{qyi{s{{{U|Z|k|q|t|z|||D}s|E}j|F}U}[}T}\}Zx]}Zx]}y}W~b~u~~Gafw}H@P@d@@ABANBc@OBiBnBXC\DfDmDyDDAEIExDJEHCKEHCKEaEhE|EzF|FtG{EuGAHGHIHQH@HRHXESHXESHiHpHDIHJJJBKCICKOKUKWK_KNK`K`HaK`HaKzKCLWL\M^MSNVLTNqKUNqKUN~BVN~BVNWNWNvXNq}YNq}YNvnZNvnZN}[N}[NbNxNyNyNyN
    yNKs-Cj22
    j?>j?	k%%
    k21k2#x4,1vx4
    v+(x4*v++	x45wx4
    wx4wAx44yyD#AH!D,AAE>E=AH!E>
    AFFAH!F
    AFF	AH!F1AGGAH!G
    AGGAH!GAGGAAH!H!AH1H0AH1U)AY'U2AAWWAY'W
    AWWAY'WAWW	AY'W1AX
    XAY'X
    AXXAY'XAXXAAY'Y'AY7Y6AY7B%BCC
    BCC
    BCCBC4C4
    BDDBDO3ABQQBQQBQR>BSS
    BS'S&BS'S-BBVV
    BVVBVc4tts:td|pdzdzd|pdzdzdddddd	d
    ddid
    ddidgiid	gddtt}|rt}t	fddDs:td|pdzdzd|pdzdzdddddd	d
    ddid
    ddidgiid	gddt}d	|vr|d	d	}d}|dkrR	t|ts&td|pdzdz|d|pdzdzddid|dz
    }n#t$rYnwxYw|dkr
    	t|ttfs)td|pdzdz|d|pdzdzd
    ddiddt|ttf}|rt|}	t|D]t\}
    }t|tsZtd|pdzdjd#itzdz|d|pdzdjd#itzdzddidu|dz
    }n#t$rYnwxYw|dkrEtd|pdzdzdt|zdzz|d|pdzdzd
    ddid
    ddidgid
    |rMtd|pdzd zt|zd!zd|pdzdzdddddd	d
    ddid
    ddidgiid	gdd"S)$Nrr
    rrrrrFr8rFrrrrxrrc3 K|]}|vV	dSrrrr r
    s  rr"zuvalidate_https___setuptools_pypa_io_en_latest_references_keywords_html__definitions_file_directive..'55D44<555555rrTz! must contain ['file'] propertiesr&rrLz.file must be stringz.filerz.file must be arrayz.file[{data__file_x}]r#z-.file must be valid exactly by one definitionrMrNr%r$r$r)r&r'rr+r,r(r)r*r0r-r.r/rr1)r
    rrr5data_lenr6
    data__filedata__file_one_of_count7data__file_is_listdata__file_lendata__file_xdata__file_items`           rr[r[sdT##q&r[-BF'CFW'W_cjlp{qF@FkGJLkLaJ]nr|D^ctz}DHNPXGYdkw}GvH[I[IFJ|KsL[aZbYcYcjpqqq	qdD))Let995555H55555	K*21F+GJm+muyACGRG\V\A]`bAbwU`sDHRZtyJPSZ^dfn]ozAMSU]L^q_q_\`RaIbqwpxoyoy@JKKK
    K		$$	YV$$$fJ'($'!++6%j388Y6r[=RF7SVl7lt~FHLWLa[aFbelFlz@BJyKRXYYYY,1,,/5555'!++
    6%j4-@@t6r[=RF7SVk7ks}EGKVK`Z`EadkEkAHTZ\dSexfxfmstttt)3Ju
    )N)N&)v),Z=Fz=R=Rvv9L/#-o#E#Ev&>r[EZTZ?[^|^u^|_I_I@F@H@H_I_I@IL]@]et{}ALAVPV{WZxZqZxZDZD{A{C{CZDZD{DGI{IW]_gVhou'v'v'v!vv,1,,/5555'1,,.r[5JF/KN}/}BFILMeIfIfBfizBz0{CMTVZeZoioTpszTzHOSY[cRdovBHJRASfTfTQUGV]deeee	e*21F+GJ^+^_bcl_m_m+mn{+{DHOQU`UjdjOknpOpEcnARV`hBGX^ahlrt|k}HO[ackZlmmjn`oWpE~F}G}GNdeee
    eKs&AE
    E'&E'2C;I..
    I;:I;c
    tts3td|pdzdzd|pdzdzddddgdd	d
    ddiid
    gd
    dtt}|r"t}t	fddDs3td|pdzdzd|pdzdzddddgdd	d
    ddiid
    gd
    dt}d
    |vrX|d
    d
    }t|ts&td|pdzdz|d|pdzdzddid|rFtd|pdzdzt|zdzd|pdzdzddddgdd	d
    ddiid
    gd
    dS)Nrr
    rrrrrrFrrrrrc3 K|]}|vV	dSrrrs  rr"zuvalidate_https___setuptools_pypa_io_en_latest_references_keywords_html__definitions_attr_directive..,rr)rz! must contain ['attr'] propertiesr&z.attr must be stringz.attrr%r$r$)	r&r'rr+r,r(r)r*r0)r
    rrr5rr6
    data__attrs`      rrZrZ&sdT##j&r[-BF'CFW'W_cjlp{qF@FkGJLkLcv]q{}gphrzTYjpsy{CrDiETZS[Y\Y\cijjj	jdD))L^t995555H55555	D*21F+GJm+muyACGRG\V\A]`bAbyLUsGQS}F~HPjo@FIOQYHZ[jpiqororyCDDD
    D		$$	YV$$$fJj300
    Q.r[5JF/KNd/dlv}DODYSY~Z]d~drxzBqCJPQQQQ	^*21F+GJ^+^_bcl_m_m+mn{+{DHOQU`UjdjOknpOpGZcAU_aKTLV^x}NTW]_gVhMix~w}@}@G]^^^
    ^Krct|tsStd|pdzdz|d|pdzdzddddddd	d
    gdddd
    diddddgd
    diddddgd
    diddddgdddidd
    t|t}|rRt|}d|vr|d|d}t|tsKtd|pdzdz|d|pdzdzdd	d
    gdddd
    diddddgd
    diddddgd
    diddddgdddd
    t|t}|r/t|}d|vr|d|d}t|ttfs*td|pdzdz|d|pdzd zddd
    didd
    t|ttf}	|	rt|}
    t|D]t\}}t|tsZtd|pdzd!jd2itzd"z|d|pdzd!jd2itzdzd
    did
    ud#|vr|d#|d#}
    t|
    ttfs,td|pdzd$z|
    d|pdzd%zdddgd
    didd
    t|
    ttf}|rt|
    }t|
    D]t\}}t|tsZtd|pdzd&jd2itzd"z|d|pdzd&jd2itzdzd
    did
    ud'|vr|d'|d'}t|ttfs,td|pdzd(z|d|pdzd)zdddgd
    didd
    t|ttf}|rt|}t|D]t\}}t|tsZtd|pdzd*jd2itzd"z|d|pdzd*jd2itzdzd
    did
    ud+|vr[|d+|d+}t|ts)td|pdzd,z|d|pdzd-zdddgdd
    |r^td|pdzd.zt|zd/z|d|pdzdzdd	d
    gdddd
    diddddgd
    diddddgd
    diddddgdddd0|rftd|pdzd1zt|zd/z|d|pdzdzddddddd	d
    gdddd
    diddddgd
    diddddgd
    diddddgdddidd0|S)3Nrr
    rrrrFrrrrrrrrrrrrrrr	r3r
    rrrz.find must be objectz.findrz.find.where must be arrayz.find.wherez".find.where[{data__find__where_x}]r#rz.find.exclude must be arrayz
    .find.excludez&.find.exclude[{data__find__exclude_x}]r
    z.find.include must be arrayz
    .find.includez&.find.include[{data__find__include_x}]rz .find.namespaces must be booleanz.find.namespacesz.find must not contain r$r$r%r)r&r'rr(r)r*r-r.r+r/r0rr1rU)r
    rrr5r6
    data__finddata__find_is_dictdata__find_keysdata__find__wheredata__find__where_is_listdata__find__where_lendata__find__where_xdata__find__where_itemdata__find__excludedata__find__exclude_is_listdata__find__exclude_lendata__find__exclude_xdata__find__exclude_itemdata__find__includedata__find__include_is_listdata__find__include_lendata__find__include_xdata__find__include_itemdata__find__namespacess                        rrWrW8sdT##O&r[-BF'CFW'W_cjlp{qF@FkGJLkLaJ]goIN_epxLhjvKwQV@D	N	U	a	g	i	q	`	r	ps	ps	I
    P
    d
    bd\c
    ]ioqyhz@
    {@
    {Q
    X
    l
    prjk
    kw}GvHH
    IH
    IbkDF{~|Y}Y}f~f~gg^@YAYAHNOOO	OdD))L3C		$$	YV$$$fJj411
    W.r[5JF/KNd/dlv}DODYSY~Z]d~dzBVrt@UA[`JNX_kqs{j|z}z}SZnl	n	f
    mg
    s
    y
    {
    Cr
    DJEJE[bvz|t
    uu
    AGIQ@RRSRSluINPEHFcGcGpHpHqIqIPVWWWW!+J!=!=!)
    Q"%joo&7&7"8"8o--#**7333(27(;%%&7$GG\6r[=RF7SVq7qzKRTXcXmgmRnq~R~[_ip|BDL{MKNKNU[\\\\0:;LtUZm0\0\-0W034E0F0F-KTUfKgKgWWG/1G#-.Ds#L#LW&>r[EZTZ?[_J_C_J_V_VMSMUMU_V_V@VYj@jrHOQU`UjdjOknYnRnYnene\b\d\dneneOehjOjx~@HwIPV'W'W'W!WW//#**9555*4Y*?'%&9D%=IIZ6r[=RF7SVs7s|OVX\g\qkqVruDVDZausumtnz@BJyKQLQLSYZZZZ2<=PSWY^R_2`2`/2a256I2J2J/OXYlOmOmaaK13K#-.F#N#Na&>r[EZTZ?[_N_G_N_Z_ZQWQYQY_Z_Z@Z]n@nvNUW[f[pjpUqtct\tctotoflfnfntotoUortUtBHJRASZ`'a'a'a!aa//#**9555*4Y*?'%&9D%=II`6r[=RF7SVs7s|OVX\g\qkqVruDVDZauy{stt@FHPQQRQRY_````2<=PSWY^R_2`2`/2a256I2J2J/OXYlOmOmaaK13K#-.F#N#Na&>r[EZTZ?[_N_G_N_Z_ZQWQYQY_Z_Z@Z]n@nvNUW[f[pjpUqtct\tctotoflfnfntotoUortUtBHJRASZ`'a'a'a!aa?22#**<888-7-E*%&rrrrrz.global must be objectz.global.{data_key}r)r&r'rr(r)r*rrXrYrr1)r
    rrr5r6data__globaldata_keydata_vals        rr3r3s\dT##
    &r[-BF'CFW'W_cjlp{qF@FkGJLkLeMVzE_re	re	re	o	w	H
    P
    [
    c
    t
    jR
    kR
    kG
    lDHKQS[J\C]kp
    Yq
    Yq
    x
    ~
    
    
    
    	
    dD))LO		$$	y  X&&&>LlT33
    ^.r[5JF/KNf/fnzBDHSH]W]B^ajBj@HYOwPwPW]^^^^"&**,,	O	OHhd#**844
    Oy(($$X...!(T33O229N3ORfR_RfRrRrioiqiqRrRr3rvG4GOW^`dodysy^z}Q}J}Q}]}]TZT\T\}]}]^]`b^bpvx@oAHNOOOOKrcR?QRttstd|pdzdzd|pdzdzdddddgd	id
    ddd
    ddddddddddgddgddgddd	dddddgdidgddddd idgdgid!dgd"d#d$id!gdgd%gd&d'dd(d)d*gd+d,d-ddd.d/gdidgdddgd0didgdgd1d2d3d4d5d6d	d7dd8d9gddd:d;d<d=d>gd?d@dAd3d4d5d6d	d7dd8d9gddd:d;d<d=d>dBdCgd@dDd3dEdidFdGdHd3ddIdJd<dKdLgd@dMd	dNd7dOddPdQidRdSdTdUd	gdVdWdXid7dOddYdZgd[d\d]id^d_dTdUd	gdVdWdXid7dOddYdZgd[d\d]id^d`gdadWdbid7dOdTdUd	gdVdWdXid7dOddYdZgd[d\d]id^idcddd3dedfdgddhdidjdkdld	dmdWd
    id7dOd3dfdgddhdidjdnidodpd3dqdrgdsgdtidud
    gd7dpgdpdvdidwgdxidygdzd{dgd|gd}d4d5d6d	d7dd8d9gddd:d;d<d=d>dTdUd	gdVdWdXid7dOddYdZgd[d\d]id^dfdgddhdidjd~ddEtt}|rt}t	fddDstd|pdzdzd|pdzdzdddddgd	id
    ddd
    ddddddddddgddgddgddd	dddddgdidgddddd idgdgid!dgd"d#d$id!gdgd%gd&d'dd(d)d*gd+d,d-ddd.d/gdidgdddgd0didgdgd1d2d3d4d5d6d	d7dd8d9gddd:d;d<d=d>gd?d@dAd3d4d5d6d	d7dd8d9gddd:d;d<d=d>dBdCgd@dDd3dEdidFdGdHd3ddIdJd<dKdLgd@dMd	dNd7dOddPdQidRdSdTdUd	gdVdWdXid7dOddYdZgd[d\d]id^d_dTdUd	gdVdWdXid7dOddYdZgd[d\d]id^d`gdadWdbid7dOdTdUd	gdVdWdXid7dOddYdZgd[d\d]id^idcddd3dedfdgddhdidjdkdld	dmdWd
    id7dOd3dfdgddhdidjdnidodpd3dqdrgdsgdtidud
    gd7dpgdpdvdidwgdxidygdzd{dgd|gd}d4d5d6d	d7dd8d9gddd:d;d<d=d>dTdUd	gdVdWdXid7dOddYdZgd[d\d]id^dfdgddhdidjd~ddt}d
    |vr|d
    d
    }t|ts(td|pdzdz|d|pdzdzddd
    ddEt|tr9|d
    |s(td|pdzdz|d|pdzdzddd
    ddWd|vr|dd}t|ts(td|pdzdz|d|pdzdzdddddEt|tr9|d|s(td|pdzdz|d|pdzdzdddddWd|vr[|dd}t|ts)td|pdzdz|d|pdzdzdddgddEd|vr|ddRd}	|	dkrU	tRts)td|pdzdzRd|pdzdzdgdddE|	dz
    }	n#t$rYnwxYw|	dkr	tRtsMtd|pdzdzRd|pdzdzd	dddddgdidgddddd idgdgid!dgd"d#d$id!gdgd%dEd}
    |
    s	tRt}|rtR}t	RfddDs/td|pdzdzRd|pdzdzddddgdidgddtR}
    d|
    vr[|
    dRd}t|ts)td|pdzdz|d|pdzdzdddgddE|
    dz
    }
    n#t$rYnwxYw|
    s	tRt}|rtR}t	RfddDs-td|pdzdzRd|pdzdzdddd idgddtR}
    d|
    vrY|
    dRd}t|ts'td|pdzdz|d|pdzdzddd dE|
    dz
    }
    n#t$rYnwxYw|
    sgd?d@dEt|ttf}|rQt|}t|D]2\}}t|||pddj
    ditz3dA|vr|dAdA}t|ttfs=td|pdzdz|d|pdzdzd3d4d5d6d	d7dd8d9gddd:d;d<d=d>dBdCgd@dEt|ttf}|rQt|}t|D]2\} }!t|!||pddj
    ditz3dD|vr|dDdD}"t|"ttfs*td|pdzdz|"d|pdzdzd3dEdidFdGdEt|"ttf}#|#rt|"}$t|"D]t\}%}&t|&tsZtd|pdzdj
    ditzdz|&d|pdzdj
    ditzdzdEdidEudH|vr|dHdH}'t|'ttfs.td|pdzdz|'d|pdzdzd3ddIdJd<dKdLgd@dEt|'ttf}(|(rt|'})t|'D]\}*}+t|+ts\td|pdzdj
    ditzdz|+d|pdzdj
    ditzdzddIdJd<dEt|+trm|dI|+s\td|pdzdj
    ditzdz|+d|pdzdj
    ditzdzddIdJd<dWdM|vr#|dMdM},t|,ts.td|pdzdz|,d|pdzdzd	dNd7dOddPdQidRdEt|,t}-|-rt|,}.|,D]1\}/}0t dO|/r
    |/|.vr|.|/t|0ts[td|pdzdj
    ditzdz|0d|pdzdj
    ditzdzddPdQdEt|0trl|dP|0s[td|pdzdj
    ditzdz|0d|pdzdj
    ditzdzddPdQdW3|.rAtd|pdzdzt|.zdz|,d|pdzdzd	dNd7dOddPdQidRdȬdS|vr3|dSdS}1t%|1||pddzd_|vr3|d_d_}2t%|2||pddzd`|vr|d`d`}3t|3t}4|4rt|3}5|3D]k\}6}7t dO|6rF|6|5vr|5|6t%|7||pddj
    ditzl|5rWtd|pdzdzt|5zdz|3d|pdzdzgdadWdbid7dOdTdUd	gdVdWdXid7dOddYdZgd[d\d]id^idcdȬt|3}8|8dkrd}9|3D]a}6	t|6tr7|db|6s&td|pdzdz|6d|pdzdzdWdbidWP#t$rd7}9Y^wxYw|9sDtd|pdzdz|3d|pdzdzgdadWdbid7dOdTdUd	gdVdWdXid7dOddYdZgd[d\d]id^idcdѬdd|vr|dddd}:t|:ttfs.td|pdzdz|:d|pdzdzd3dedfdgddhdidjdkdEt|:ttf};|;rQt|:}t'|>||pddj
    ditz3dl|vr|dldl}?t|?ts7td|pdzdz|?d|pdzdzd	dmdWd
    id7dOd3dfdgddhdidjdnidodEt|?t}@|@rct|?}A|?D],\}B}Ct dO|Br|B|Avr|A|Bt|Cttfsatd|pdzdj
    ditzdz|Cd|pdzdj
    ditzdzd3dfdgddhdidjdndEt|Cttf}D|DrQt|C}Et|CD]2\}F}Gt'|G||pddj
    ditz3.|ArJtd|pdzdzt|Azdz|?d|pdzdzd	dmdWd
    id7dOd3dfdgddhdidjdnidodȬt|?}H|Hdkrd}I|?D]a}B	t|Btr7|d
    |Bs&td|pdzdz|Bd|pdzdzdWd
    idWP#t$rd7}IY^wxYw|Is7td|pdzdz|?d|pdzdzd	dmdWd
    id7dOd3dfdgddhdidjdnidodѬdp|vr	|dpdp}Jt|Jttfs.td|pdzdz|Jd|pdzdzd3dqdrgdsgdtidudEt|Jttf}K|Krt|J}Lt|JD]e\}M}N|Ndtvr\td|pdzdj
    ditzdz|Nd|pdzdj
    ditzdzdsgdtidsf|rtd|pdzdzt|zdzd|pdzdzdddddgd	id
    ddd
    ddddddddddgddgddgddd	dddddgdidgddddd idgdgid!dgd"d#d$id!gdgd%gd&d'dd(d)d*gd+d,d-ddd.d/gdidgdddgd0didgdgd1d2d3d4d5d6d	d7dd8d9gddd:d;d<d=d>gd?d@dAd3d4d5d6d	d7dd8d9gddd:d;d<d=d>dBdCgd@dDd3dEdidFdGdHd3ddIdJd<dKdLgd@dMd	dNd7dOddPdQidRdSdTdUd	gdVdWdXid7dOddYdZgd[d\d]id^d_dTdUd	gdVdWdXid7dOddYdZgd[d\d]id^d`gdadWdbid7dOdTdUd	gdVdWdXid7dOddYdZgd[d\d]id^idcddd3dedfdgddhdidjdkdld	dmdWd
    id7dOd3dfdgddhdidjdnidodpd3dqdrgdsgdtidud
    gd7dpgdpdvdidwgdxidygdzd{dgd|gd}d4d5d6d	d7dd8d9gddd:d;d<d=d>dTdUd	gdVdWdXid7dOddYdZgd[d\d]id^dfdgddhdidjd~ddȬ		tt}|r-t}t	fddDs0td|pdzdzd|pdzdzdpgdpdvdidwgdxidydt}dp|vr|dpdp}Jt|Jttf}K|Krsd7}O|JD]B}P	|Pdkr&td|pdzdz|Pd|pdzdzdvdidvd}On#t$rY?wxYw|Os*td|pdzdz|Jd|pdzdzdvdidwgdxd笀td|pdzdzd|pdzdzdpgdpdvdidwgdxidygdzd{d鬀#t$rYnwxYw	tt}|rSt}t	fddDs)td|pdzdzd|pdzdzdgd|gd}dn#t$rYnwxYwS)Nrr
    rrr'r(r)r*rr+rr,r-rr.r/r0rr1r2r3r4r5r6r7r8r9r:r;r<r=r>r?r@rArBrCrErGrHrIrJrKrLrMrNrOrPrQrRrrTrrFrrrrr`rrrUrVrWrXrYrZrr[r\r]r^r_rarbrcrdrrerfrgrirjrrrrrrrrrrrlrmrnrorprrrsrtrrrrrurvrwrxryrzr{r|r}r~rrrrrrrrrrrrc3 K|]}|vV	dSrrrs  rr"zlvalidate_https___packaging_python_org_en_latest_specifications_declaring_project_metadata..rr)r+z! must contain ['name'] propertiesr&.name must be string.namez.name must be pep508-identifierz.version must be stringz.versionz.version must be pep440z.description must be stringz.descriptionrrLz.readme must be stringz.readmerz.readme must be objectc3 K|]}|vV	dSrrrr data__readmes  rr"zlvalidate_https___packaging_python_org_en_latest_specifications_declaring_project_metadata..(*U*UD4<+?*U*U*U*U*U*UrrTz(.readme must contain ['file'] propertiesz.readme.file must be stringz.readme.filec3 K|]}|vV	dSrrrs  rr"zlvalidate_https___packaging_python_org_en_latest_specifications_declaring_project_metadata..rr)r<z(.readme must contain ['text'] propertiesz.readme.text must be stringz.readme.textz-.readme cannot be validated by any definitionc3 K|]}|vV	dSrrrs  rr"zlvalidate_https___packaging_python_org_en_latest_specifications_declaring_project_metadata..s("U"UD4<#7"U"U"U"U"U"Ur)r?z0.readme must contain ['content-type'] propertiesz#.readme.content-type must be stringz.readme.content-typez/.readme must be valid exactly by one definitionrMrNrFz.requires-python must be stringz.requires-pythonz+.requires-python must be pep508-versionspecc3 K|]}|vV	dSrrrr 
    data__licenses  rr"zlvalidate_https___packaging_python_org_en_latest_specifications_declaring_project_metadata..("N"NT4=#8"N"N"N"N"N"Nrz).license must contain ['file'] propertiesz.licensez.license.file must be stringz
    .license.filec3 K|]}|vV	dSrrrs  rr"zlvalidate_https___packaging_python_org_en_latest_specifications_declaring_project_metadata..rrz).license must contain ['text'] propertiesz.license.text must be stringz
    .license.textz0.license must be valid exactly by one definitionz.authors must be arrayz.authorsz.authors[{data__authors_x}]z.maintainers must be arrayz.maintainersz#.maintainers[{data__maintainers_x}]z.keywords must be arrayz	.keywordsz.keywords[{data__keywords_x}]r#z.classifiers must be arrayz.classifiersz#.classifiers[{data__classifiers_x}]z must be trove-classifierz.urls must be objectz.urlsz.urls.{data__urls_key}z must be urlz.urls must not contain r$r$z.scriptsz.gui-scriptsz%.entry-points.{data__entrypoints_key}z.entry-points must not contain z
    .entry-pointsTz-.entry-points must be python-entrypoint-groupz6.entry-points must be named by propertyName definitionrqz.dependencies must be arrayz
    .dependenciesz%.dependencies[{data__dependencies_x}]z%.optional-dependencies must be objectz.optional-dependenciesz7.optional-dependencies.{data__optionaldependencies_key}rOz[.optional-dependencies.{data__optionaldependencies_key}[{data__optionaldependencies_val_x}]z(.optional-dependencies must not contain z0.optional-dependencies must be pep508-identifierz?.optional-dependencies must be named by propertyName definitionz.dynamic must be arrayrQz.dynamic[{data__dynamic_x}]z must be one of ['version', 'description', 'readme', 'requires-python', 'license', 'authors', 'maintainers', 'keywords', 'classifiers', 'urls', 'scripts', 'gui-scripts', 'entry-points', 'dependencies', 'optional-dependencies']r%c3 K|]}|vV	dSrrrs  rr"zlvalidate_https___packaging_python_org_en_latest_specifications_declaring_project_metadata..s'@@D44<@@@@@@r)rzz$ must contain ['dynamic'] propertiesz2.dynamic must be same as const definition: versionz0.dynamic must contain one of contains definitionrz' must NOT match a disallowed definitionrc3 K|]}|vV	dSrrrs  rr"zlvalidate_https___packaging_python_org_en_latest_specifications_declaring_project_metadata..s'<<tt|<<<<<[?]?t?O>u?k=v?k=v?J@R@^@i@z@YAA@ZAA@ZAb=[Ab=[A]:\A]:\ApA@CBCJDoAKDB:LDB:LD_WKNDXDcDjDvD|D~DFEuDGEXEhFZDiFZDiF_WKkFxFCGJG^GfGrGDHUHJIUGKIUGKI_IUJWJtJ^IuJzFvJzFvJ_WKxJ~JIKQKbKdL~LCM[MaMlMtM@NENcMFNcMFNZMGN@KHN@KHN_WKJNSN]N~NIOWOaOiO|OnT|OnT|OnTBUJULUdUAUeUUDV\VbVmVuVIWAXCXAYHWBYNYkYyYtZdVuZdVuZ[VvZUNwZUNwZ_WKyZF[P[q[|[J\T\\\o\aao\aao\aaua}aaWbtaXbrbwbOcUc`chc|ctdvdte{cueAf^flfggWchgWchgNcigH[jgH[jg_WKlgzgNhNlNhNlNhNlbljlllEmalFm`mem}mCnMnnnynGoQoYolo^tlo^tlo^trtzt|tTuqtUuoutuLvRv]vevyvqwswqxxvrx~x[yiydzTvezTvezKvfzEngzEngz|mhz|giz|giz_WKkzyzD{K{\{{R|l|w|C}M}U}f}]~i~q~J|r~J|r~{zs~{zs~_WKu~LW_pU@i@q@s@FAh@GAaAfA~ADBOBVBiBCCNCZCdClC}CtD@EHEaBIEaBIEFBJEFBJE}AKENLENLE_WKNEWEbEiE}EFGHGmG|EnGzG@HBHTKBHTKBHTKyGUKYEVKYEVK_WKfKlKeKmKGLLLjLsLiLtLEMNM^MeMgMpM]MqMENgNDNhNPMiNPMiNDMjN\LkN\LkNzNfWzNfWzNfWTLgWTLgWWHX~WIX]X\Y\X]YqW^YqW^YBZXZcZyZG[~[H\P\j\o\Q]Y]m]x^z^Q_l]R_H]S_H]S_g_o_{_F`W`v`^_w`^_w`\x`\x`zYy`zYy`XayaDbRb\bdbwbigwbigwbig}gEhGh_h|g`hzhhWi]ihipiDj|j~j|kCj}kIlfltlom_ipm_ipmViqmParmParmJndnon{nEoMo^oUpapipBnjpBnjpoYkpoYkpolpolpsp}p~p~p~p
    ~p		$$	YV$$$fJj300
    L.r[5JF/KNd/dlv}DODYSY~Z]d~dzBS^j}q~q~EKLLLL*c**
    ]:~&9::FF]229N3ORs3s|FMOS^ShbhMilsMsIQbmyL@M@MT\]]]]	!!Y''' OMmc33
    w.r[5JF/KNg/go|DFJUJ_Y_D`cmDmCK\T`hzizipvwwww---
    }/~h/
    >>}229N3ORk3ktAHJNYNc]cHdgqHqGO`Xdl~m~mt|}}}}I%%]+++ $] 3/#77
    n.r[5JF/KNk/ktELNR]RgagLhkyLyOWkTV^j_F`F`gmnnnny  X&&&>L)*&)A--6%lS::e6r[=RF7SVn7nwCJLP[Pe_eJfirJrHPcVcVcVWW^deeee.!3../5555)A--06%lT;;E
    6r[=RF7SVn7nwCJLP[Pe_eJfirJrHP]dw}HPdbducvwwvxGMFNgOgOagrzKnioio`pE~FQGQGfH\I[it|O	bO	bO	bpTkUkUZVesdtKuKu[vww~D
    E
    E
    E
    E
    23/6>
    >3=lD3Q3Q03	e36|3D3D 0'**U*U*U*UH*U*U*U'U'U!W*B2I^X^C_cMDMUahjnynC}ChDGPhPms~FZXZkYlumumln}C|D]E]ELV+W+W+W%W478I8I8K8K4L4L 1#)->#>#>$5$<$
    >3=lD3Q3Q03	s36|3D3D 0'**U*U*U*UH*U*U*U'U'U!e*B2I^X^C_cMDMUahjnynC}ChDGPhPms~FWzu{u{l|KQJR]S]SZd+e+e+e%e478I8I8K8K4L4L 1#)->#>#>$5$<$>>-44^DDD8D^8T5#-.G##O#Of&>r[EZTZ?[_D@DLelnr}rGAGlHKalawReReResWnXnX_e'f'f'f!f.!3../5555)Q...r[5JF/KN/DHKNOiKjKjDjm~D~0GSZ\`k`uouZvyBZBaoaoaoD	L	_	R
    _	R
    _	R
    {S
    {S
    ^
    f
    s
    z
    MS^fzxzKyLUMUMLN]c\d}
    e}
    ew}HPaDEEvFU[T\g]g]|
    ^r
    _qJRexexexFjAkAkpl{IzJaKaKq
    LU
    MU
    MzNOOOOV]^^^^	)).///#'(9#: 2S::
    j.r[5JF/KNo/oxLSUYdYnhnSorDSDZbnBVGIZU[Q\Q\cijjjj.44
    |;~&:;,>)""N"N"N"NX"N"N"NNNS":2AVPV;W[Fr[EZTZ?[^|?|EX_aepeztz_{~M_MckEGQ~RZSZSZ`'a'a'a!a0A500/5555+a//
    6,6}d,K,K),	|,/
    ,>,>)""N"N"N"NX"N"N"NNNn":2AVPV;W[Fr[EZTZ?[^|?|EX_aepeztz_{~M_Mck~m~m~mZnZnu{'|'|'|!|0A500/5555+q00.r[5JF/KOA0AEILOPlLmLmEmpAEA0BJW^`dodysy^z}G^GdeAGRZntv@mAIBIB@CRXQYqZqZlr}E	X	GX	GX	GtHtHkIX^W_\`\`paTbTbipqqqq	!!Y''' OMmdE];;
    H.r[5JF/KNf/fn{CEITI^X^C_blClBI\r}SaXbjDIksGRTkFlbmbmA	I	U	`	q	P
    xQ
    xQ
    YR
    YR
    TS
    TS
    f
    y
    f
    y
    f
    y
    yz
    yz
    AGHHHH$.}tUm$L$L!$
    s$'
    $6$6!;D];S;Sss7O%7CDVXfiti~x~BfB_BfBrBrioiqiqBrBrhrssssI%%]+++ $] 3/$??
    ]
    .r[5JF/KNj/jsDKMQ\Qf`fKgjxKxNUh~I_mdnvPUwS^`wRxnynyM	U	a	l	}	\
    D	]
    D	]
    e^
    e^
    `_
    `_
    s
    CEM
    r
    N
    EO
    EO
    V
    \
    ]
    ]
    ]
    ]
    (23DtUm(T(T%(
    (+,=(>(>%CLM^C_C_?')?CDZ\jmxmB|BFrFkFrF~F~u{u}u}F~F~l~""Z(((!*-NntUm<<
    Y.r[5JF/KNg/go}EGKVK`Z`EadoEoELX^`hWizJ|K|KRXYYYY%/u
    %N%N"%
    B%(%8%8"=F~=V=VBB9$&9%&9CAAB6r[=RF7SV|VuV|WIWI@F@H@HWIWI8IL]8]exAEPEZTZ[^D^}^D^P^PGMGOGO^P^PPSUUciksbt{ABBBBBI%%]+++ $] 3/$??
    O.r[5JF/KNj/jsDKMQ\Qf`fKgjxKxNUiq}O`U`V`Vj`bi@EAEAHNOOOO(23DtUm(T(T%(
    E(+,=(>(>%CLM^C_C_EE?')?%&>EA~.@ABXYYE":2AVPV;W[GZ[G[S[SJPJRJR[S[SBBB).3@@D":2AVPV;WZyZrZy[F[F}C}E}E[F[F%#8#H#HG&>r[EZTZ?[^}^v^}_J_JAGAIAI_J_J@JM[@[cqxz~I~SMSxTWvWoWvWBWByyAyAWBWBxBEGxG]eqvTwTw~F'G'G'G!G"A229N3ORk3klopmAmA4ABO4OWahjnynC}ChDGNhNdl}Y^v|GO[`~a~aub[c[cj@AAAA	!!Y''' OM
    FGTVdgrg|v|@JfJ
    K
    K
    KI%%]+++#M2
    FGWYgjujyCQiQ
    R
    R
    RY&&^,,, $^ 4(23Dd(K(K%(
    n),->-C-C-E-E)F)F&DUD[D[D]D]OO@)+@%f-445JKKO04JJJ299:OPPPRShjx{F{PJPTBT{TBTNTNEKEMEMTNTNzNOOO)D229N3ORs3stwyOuPuP4PQ^4^fw~@DODYSY~Z]l~lKKKKKK_giB	^C	]	b	z	@
    J
    k
    v
    DNVi[i[i[owyQnRlqIOZbvnpnuo{XfaQbQbHcB
    dB
    dy	eyfyfmCDDDD(+,=(>(>%(A--7;41BEE-E)*?EEf'P~6O'PQf'g'g!f*B2I^X^C_cRDRZovx|G|QKQvRUdvdrz|UqV]e+f+f+f%f7EEE?D<<<E;n6r[=RF7SWO8OWhoqu@uJDJoKN]o]||||||PXZsOtN	S	k	q	{	\
    g
    u
    
    GZLZLZL`hjB_C]bz@KSg_a_f`lIWRBSBSyTs	Us	Uj	VjWjW^mnnnnY&&^,,,!%n!504-@@
    N.r[5JF/KNk/ktFMOS^ShbhMil{M{QXiL_yDPZbsjv~WWH@H@GMNNNN)34Fu
    )V)V&)
    F),-?)@)@&ENOaEbEbFFA(*AGH_aor}rGAGKyKrKyKEKE|B|D|DKEKEqEFFFF"i//4555)-.E)F&84AA
    o	.r[5JF/KNu/u~X_aepeztz_{~V_VltEj~FH[}\v{SYdk~XcoyARI	U	]	v^	v^	[_	[_	R`	ca	ca	h	n	o	o	o	o	1;ATADEcAdAd>irtRjSjSTT e @Be!STwyGJUJ_Y_cGc@cGcScSJPJRJRcScSIS!T!T!T!T2y
    229N3OR|3|~ABa~b~b4bcp4pxRY[_j_tntYuxPYPfndx@BUwVpuMS^exR]is{L	C
    O
    W
    pX
    pX
    UY
    UY
    LZ
    ][
    ][
    b
    x
    y
    y
    y
    y
    145O1P1P.1Q66@D=:TNN6N)*H#NNu'J~6I'JKi'j'j!u*B2I^X^C_cUDU]{BDHSH]W]B^ayByGOQdFelt+u+u+u%u7NNNHMEEENDZ
    6r[=RF7SWX8X`zACGRG\V\A]`xAxNVgL`hj}_~X]u{FM`zEQ[ctk	w		X@
    X@
    }A
    }A
    tB
    EC
    EC
    J
    Y
    Z
    Z
    Z
    Z
    	!!Y''' OMmdE];;
    D	.r[5JF/KNf/fn{CEITI^X^C_blClBI]fhM\NZ`btbtbtYuyvyv}C	D	D	D	D	$.}tUm$L$L!$
    Z$'
    $6$6!;D];S;SZZ7O%7)2DDD6r[=RF7SVzVsVzWGWG~D~F~FWGWG8GJn8nvHOQU`UjdjOknRnKnRn^n^U[U]U]n^n^O^acOcqwyKyKyKpLSYZZZZD	Xq*21F+GJ^+^_bcl_m_m+mn{+{DHOQU`UjdjOknpOpIqzMXJ^bdJ]KU]meKntG	X	c
    o
    BvCvCmeKENYarjv~PPmeKA
    N
    Y
    a
    u
    ^`ht
    iP
    jP
    jmeKltHVHVHVksFyFyFybzbzEMZatzEMa_ar`s|t|tsuDJCKdLdL^dowHkflfl]m|B{CNDNDcEYFXfqyL_!L_!L_!m!Q"hR"hR"WS"b"p"a"q"Hr"Hr"Xs"|t"|t"au"vv"vv"meKx"I#T#\#h#|#P$A%C%T&O$U&K#V&K#V&meKX&a&s&t'P(V(a(i(}(C*E*O*|(P*X(Q*X(Q*O(R*a*g*`*h*@(i*@(i*{*A+L+T+g+V.g+V.g+V.C+W.C+W.z*X.g.m.f.n.k*o.k*o.'p.c&q.c&q.meKs.|.G/N/a/w/B0X0f0]1g1o1I2N2p2x2L3W4Y4p4K3q4g2r4g2r4F5N5Z5e5v5U6}4V6}4V6^2W6^2W6Y/X6Y/X6k6~9k6~9k6~9~.9~.9meKA:N:Y:`:s:I;T;j;x;o<yJ>^>i?k?B@]>C@y=D@y=D@X@`@l@w@HAgAO@hAO@hAp=iAp=iAk:jAk:jA~ANCPCXD}AYDP:ZDP:ZDmeK\DfDqDxDDEJELETECEUEfEvFhDwFhDwFmeKyFFGQGXGlGtG@HRHcHXIcGYIcGYImIcJeJBKlICKHGDKHGDKmeKFKLKWK_KpKrLLMQMiMoMzMBNNNSNqMTNqMTNhMUNNKVNNKVNmeKXNaNkNLOWOeOoOwOJP|TJP|TJP|TPUXUZUrUOUsUMVRVjVpV{VCWWWOXQXOYVWPY\YyYGZB[rVC[rVC[iVD[cNE[cNE[meKG[T[^[[J\X\b\j\}\oa}\oa}\oaCbKbMbebBbfb@cEc]cccncvcJdBeDeBfIdCfOflfzfugecvgecvg\cwgV[xgV[xgmeKzgHh\h\l\h\l\h\lplxlzlSmolTmnmsmKnQn[n|nGoUo_ogozoltzoltzolt@uHuJubutcu}uBvZv`vkvsvGwwAxxFw@yLyiywyrzbvszbvszYvtzSnuzSnuzJnvzJhwzJhwzmeKyzG{R{Y{j{M|`|z|E}Q}[}c}t}k~w~~X|@X|@I{AI{AmeKCZem~c@w@@AATAv@UAoAtALBRB]BdBwBQC\ChCrCzCKDBENEVEoBWEoBWETBXETBXEKBYE\ZE\ZEmeK\EeEpEwEKFTGVG{GJF|GHHNHPHbKPHbKPHbKGHcKgEdKgEdKmeKtKzKsK{KULZLxLAMwLBMSM\MlMsMuM~MkMMSNuNRNvN^MwN^MwNRMxNjLyNjLyNHOtWHOtWHOtWbLuWbLuWMXVXLXWXkXjYjXkYWlYWlYPZfZqZG[U[L\V\^\x\}\_]g]{]F_H___z]`_V]a_V]a_u_}_I`T`e`Dal_Eal_EaM]FaM]FaHZGaHZGafaGbRb`bjbrbEcwgEcwgEcwgKhShUhmhJhnhHiMieikivi~iRjJkLkJlQjKlWltlBm}mmi~mmi~mdim^a@n^a@nXnrn}nIoSo[olocpopwpPnxpPnxp}Yyp}Yyp}zp}zpAqWqXqXqXq
    Xq!u	U%dD11L
    Jt99@@@@K@@@@@[229N3ORx3xAELNR]RgagLhkmLmHQGRcl|CEN{OcEbFnGnGbHzIzIPZ[[[[		,,		))$$Y///$(OM,6}tUm,T,T),
    J16.1>BB-B#4	#A#A*B2I^X^C_cWDW_pwy}H}RLRwSV`w`nuw@mAHO+P+P+P%P9= 6 %#;AAATTA5J":2AVPV;W[M*GHRRi6r[=RF7SVjVcVjVvVvmsmumuVvVv7vz`8`hpwy}H}RLRwSVjVcVjVvVvmsmumuVvVvwvy{w{QYmegelfrO]XHYHY`hiiii	}*21F+GJ^+^_bcl_m_m+mn{+{DHOQU`UjdjOknpOpEfqIQdV	dV	dV	j	r	t	L
    i	M
    g
    l
    DJU]qiki
    pj
    v
    Sa\L]L]C^}_}_f|}}}
    }t99q=="& 
    0
    00!(C00uG~.FGQQu":2AVPV;WZ{;{DLSUYdYnhnSortStBJLdAelt#u#u#uu/000*/'''0&
    t.r[5JF/KNy/yBFMOS^ShbhMilnMnCdo}GObT	bT	bT	h	p	r	J
    g	K
    e
    j
    BHS[ogig
    nh
    t
    Q_ZJ[J[A\{]{]dsttttKsAJJJct|ts7td|pdzdz|d|pdzdzdddddd	d
    dgdd	d
    dddddt|t}|rt|}d|vr[|d|d}t|ts)td|pdzdz|d|pdzdzd	d
    dgddd|vr|d|d}t|ts(td|pdzdz|d|pdzdzd	d
    dddt|trHtd|s(td|pdzdz|d|pdzdzd	d
    ddd|rJtd|pdzdzt
    |zdz|d|pdzdzdddddd	d
    dgdd	d
    ddddd|S) Nrr
    rrTrrrFrrrr3rrr`rrrrr+rrrz.email must be stringz.emailrz.email must be idn-emailrr%r$r$)	r&r'rr(r)r*r0rXmatch)r
    rrr5r6r
    data__emails       rr
    r
    sdT##f	&r[-BF'CFW'W_cjlp{qF@FkGJLkLawBXf]goINpxLWYpKqgrgrFNZevU	}V	}V	^W	^W	YX	YX	_	e	f	f	f		f	dD))LZ
    		$$	YV$$$fJj300
    J.r[5JF/KNd/dlv}DODYSY~Z]d~dzBVaczU{q|q|CIJJJJiW%%%w-KkC11
    [.r[5JF/KNe/emx@BFQF[U[@\_g@g}EQ\mLtMtMTZ[[[[+s++
    d%&<=CCKPPd229N3ORl3ltGIMXMb\bGcfnGnDLXctS{T{T[cdddd	Z
    *21F+GJ^+^_bcl_m_m+mn{+{DHOQU`UjdjOknpOpE[f|JAKSmrT\p{}ToUKVKVjr~I	Z	y	az	az	B{	B{	}|	}|	C
    Y
    Z
    Z
    Z
    
    Z
    Kr)VERSIONrefastjsonschema_exceptionsrcompilerXrNoneTyperrr4r[rZrWrVr3r2rrr
    rrrrbs#				??????
    BJv
    "*T
    
    BJv&BJ'@AA	4::"$$vxFJGGGGRacptWWWWr}MQ####J}MQ$}MQ8888t{}KO,EGTX&tvDHCCCCJ
    MO]aTVdh>IKY]rPK!qqA_validate_pyproject/__pycache__/extra_validations.cpython-311.pycnu[
    
    irdZddlmZmZddlmZedeZGddeZd	ed
    efdZefZ	dS)
    zThe purpose of this module is implement PEP 621 validations that are
    difficult to express as a JSON Schema (or that are not supported by the current
    JSON Schema library).
    )MappingTypeVar)ValidationErrorT)boundceZdZdZdS)RedefiningStaticFieldAsDynamiczAccording to PEP 621:
    
        Build back-ends MUST raise an error if the metadata specifies a field
        statically as well as being listed in dynamic.
        N)__name__
    __module____qualname____doc__/builddir/build/BUILD/imunify360-venv-2.6.2/opt/imunify360/venv/lib/python3.11/site-packages/setuptools/config/_validate_pyproject/extra_validations.pyr
    r
    
    srr
    	pyprojectreturnc|di}|dg}|D]7}||vr1d|d}|dz
    }d|}|||ddd|i}t|||d	
    8|S)Nprojectdynamicz(You cannot provide a value for `project.z` and z0list it under `project.dynamic` at the same timez
    data.project.z...z # ...zPEP 621)rule)getr
    )r
    project_tablerfieldmsgnamevalues       rvalidate_project_dynamicrsMM)R00M	2..GSSM!!JUJJJCEEC*5**DM%0%9gVE0eT	RRRR"rN)
    rtypingrrerror_reportingrrr
    rEXTRA_VALIDATIONSrrrr"s
    $#######,,,,,,GCw_a./rPK!&OO?_validate_pyproject/__pycache__/error_reporting.cpython-311.pycnu[
    
    i,ddlZddlZddlZddlZddlZddlmZddlmZm	Z	ddl
    mZmZm
    Z
    mZmZmZmZmZddlmZejeZddd	d
    dZdZhd
    ZejdZejdejZdddddZGddeZ edZ!GddZ"GddZ#de$dee$fdZ%dS)N)contextmanager)indentwrap)AnyDictIteratorListOptionalSequenceUnioncast)JsonSchemaValueExceptionzkeys must be named byzat least one item that matchesz"only items matching the definition)z(must be named by propertyName definitionzone of contains definitionz same as const definition:zonly specified items)zmust not be emptyzis always invalidzmust not be there>notanyOfitemsoneOfcontains
    propertyNamesz\W+|([A-Z][^A-Z\W]*)z^[\w_]+$tablekeykeys)objectproperty
    propertiesproperty namesc:eZdZdZdZdZdZedefdZ	dS)ValidationErroraReport violations of a given JSON schema.
    
        This class extends :exc:`~fastjsonschema.JsonSchemaValueException`
        by adding the following properties:
    
        - ``summary``: an improved version of the ``JsonSchemaValueException`` error message
          with only the necessary information)
    
        - ``details``: more contextual information about the error like the failing schema
          itself and the value that violates the schema.
    
        Depending on the level of the verbosity of the ``logging`` configuration
        the exception message will be only ``summary`` (default) or a combination of
        ``summary`` and ``details`` (when the logging level is set to :obj:`logging.DEBUG`).
        rexcXt|}|t||j|j|j|j}t
    jdd}|dkr|j	|j
    c|_	|_
    |j|_|j
    |_
    |j|_|S)N JSONSCHEMA_DEBUG_CODE_GENERATIONfalse)_ErrorFormattingstrvaluename
    definitionruleosgetenvlower	__cause__
    __traceback__message_original_messagesummarydetails)clsr 	formatterobj
    debug_codes     /builddir/build/BUILD/imunify360-venv-2.6.2/opt/imunify360/venv/lib/python3.11/site-packages/setuptools/config/_validate_pyproject/error_reporting.py_from_jsonschemaz ValidationError._from_jsonschema=s$R((	c#i.."(INBM27SSYA7KKQQSS
      /1|R=M,CM3, "
    ''
    N)
    __name__
    __module____qualname____doc__r1r2r0classmethodrr8r9r7rr(sV GG	":			[			r9rc#nK	dVdS#t$r }t|dd}~wwxYwN)rrr8)r s r7detailed_errorsrBJsM=
    #===..r22<=s
    
    4/4cveZdZdefdZdefdZedefdZedefdZ	dZ
    dZdefd	Zd
    S)r$r c||_d||jd|_|jj|j|j|_d|_d|_dS)N`r)r _simplify_namer'r/replacer0_summary_details)selfr s  r7__init__z_ErrorFormatting.__init__Ss]7++BG44777	!%!8!8$)!L!L
    
    
    
    r9returncttjkr|jr|jd|jS|jS)N
    
    )_loggergetEffectiveLevelloggingDEBUGr2r1rJs r7__str__z_ErrorFormatting.__str__ZsB$$&&'-77DL7l66666|r9cP|js||_|jSrA)rH_expand_summaryrSs r7r1z_ErrorFormatting.summary`'}	3 0022DM}r9cP|js||_|jSrA)rI_expand_detailsrSs r7r2z_ErrorFormatting.detailsgrWr9cbtd}|dr
    ||dn|S)Nzdata.)len
    startswith)rJr'xs   r7rFz_ErrorFormatting._simplify_namens0LL??733=tABBxx=r9cj|jtD]\}}||t	fdt
    DrS|jj}|jjtvr4|r2tt}dt||dSS)Nc3 K|]}|vV	dSrAr?).0	substringmsgs  r7	z3_ErrorFormatting._expand_summary..xs(??IyC??????r9z:
    
        )
    r0_MESSAGE_REPLACEMENTSrrGany
    _SKIP_DETAILSr rule_definitionr)
    _NEED_DETAILS_SummaryWriter_TOML_JARGONr)rJbadreplschemar1rbs     @r7rVz _ErrorFormatting._expand_summaryrs$.4466	)	)IC++c4((CC?????????	J(7<=((V($\22GAAwwv ? ?AAA
    r9c	Jg}|jjdg}|jjddpd|}|r?dt	|dddd}|d	|t
    j|jjd
    }t
    j|jjd
    }dt|dd
    |jj
    dt|dg}d||zS)Nz
    $$descriptiondescription 
    PrdF)widthinitial_indentsubsequent_indentbreak_long_wordsz
    DESCRIPTION:
    )rz
    GIVEN VALUE:
    zOFFENDING RULE: zDEFINITION:
    rN)r r(popjoinrappendjsondumpsr&rr))rJoptional
    desc_linesdescrprnr&defaultss        r7rYz _ErrorFormatting._expand_detailss/W'++OR@@
    w!%%mT::Rchhz>R>R
    	<))#)&,%*K
    OO:[::;;;DG.q999
    47=3334VE62244/tw|//4F662244
    
    {{8h.///r9N)
    r:r;r<rrKr%rTrr1r2rFrVrYr?r9r7r$r$Rs3XX>>> 0000000r9r$c
    eZdZhdZddeeeeffdZdeee	efdeee	effdZ
    	dd	d
    deee	efded
    eedefdZ
    deedefdZdedeefdZdedeedeefdZ	ddededeedefdZdeefdZdeedefdZdedeedefdZdedeedeefdZdededefdZdS) rj>titledefaultexamplesrpNjargonc|pi|_dddd|ddddd|d	|d
    ddd
    d|_gd|_dS)Nzat least one of the followingzexactly one of the followingzall of the followingz(*NOT* the following)rz (in order)zcontains at least one ofznon-predefined acceptable rrz named via patternzpredefined valuezone of)rrallOfrprefixItemsrrrpatternPropertiesconstenum)rr	maxLength	minLengthpatternformatminimummaximumexclusiveMinimumexclusiveMaximum
    multipleOf)r_jargon_terms_guess_inline_defs)rJrs  r7rKz_SummaryWriter.__init__s&,l53+*"ll733@@@2MT\\:J-K-KMM$(LL$>$>!R!R!R'
    
    "#
    #
    #
    r9termrLct|trfd|DSj||S)NcFg|]}j||Sr?)rget)r`trJs  r7
    z*_SummaryWriter._jargon..s)888aDKOOAq))888r9)
    isinstancelistrr)rJrs` r7rz_SummaryWriter._jargonsEdD!!	9888848888{tT***r9rr?_pathrnprefixrc
    t|tr||||S|||}|||}|r||S||d}||d}t
    |dz}tj5}	t|
    D][\}
    \}}g||}
    |
    dkr|n|}|	|||
    dt|trX|||
    }|||
    }|	|rd|nd||||
    t|trf|dks||
    rK||||
    }|d	rdnd}|	||.|	d|||
    d]|	cdddS#1swxYwYdS)
    Nz  - rqr:rrrtype[)rr_handle_list_filter_unecessary_handle_simple_dict
    _child_prefixr[ioStringIO	enumeraterwrite_labeldict_is_propertyr\_valuegetvalue)rJrnrrfilteredsimplechild_prefixitem_prefixrbufferirr&
    child_pathline_prefixchildrenseps                 r7__call__z_SummaryWriter.__call__sfd##	<$$VVU;;;**6599))(E::	'&f&&&))&$77((66Vs"
    []]	%f#,X^^-=-=#>#>
    I
    I.s/333>>!$$333333r9z$_)rrf_IGNORE)rJrrs  @r7_is_unecessaryz_SummaryWriter._is_unecessarys]T""	$	52h3333d33333Jsdl7JJr9cHfd|DS)NcNi|]!\}}g|||"Sr?)r)r`rr&rrJs   r7
    z5_SummaryWriter._filter_unecessary..sK
    
    
    U&&||s|44
    
    
    
    r9)r)rJrnrs` `r7rz!_SummaryWriter._filter_unecessarys<
    
    
    
    
    $llnn
    
    
    	
    r9r&ctfd|jD}tdD}|s|r-dd||dSdS)Nc3 K|]}|vV	dSrAr?)r`pr&s  r7rcz5_SummaryWriter._handle_simple_dict..s'AAAQ%ZAAAAAAr9c3NK|] }t|ttfV!dSrA)rrr)r`vs  r7rcz5_SummaryWriter._handle_simple_dict..s0MMAd|44MMMMMMr9{, z}
    )rfrvaluesrz
    _inline_attrs)rJr&rinliners `   r7rz"_SummaryWriter._handle_simple_dictsAAAA)@AAAAAMMellnnMMMMMM	IV	IH		$"4"4UD"A"ABBHHHHtr9schemascBrdSt|}td|Drt|dkr|dS|ddfdt
    |DS)Nrc3PK|]!}t|ttfV"dSrA)rrr)r`es  r7rcz._SummaryWriter._handle_list..
    s3@@1:a$...@@@@@@r9<rrrc	3JK|]\}}|gd|dVdS)r]rNr?)r`rrrrrJs   r7rcz._SummaryWriter._handle_list..s\
    
    >BaDDK'8'8x1xxx'8999
    
    
    
    
    
    r9)rreprallr[rrzr)rJrrrrepr_rs`  ` @r7rz_SummaryWriter._handle_listst$$	2W
    
    @@@@@@@	 SZZRT__<<<((66ww
    
    
    
    
    
    FOPWFXFX
    
    
    
    
    	
    r9cJd}|dddD]
    }|dvrn|dz
    }|dzdkS)zGCheck if the given path can correspond to an arbitrarily named propertyrNr>rrrr?)rJrcounterrs    r7rz_SummaryWriter._is_propertysMB<		C===qLGG{ar9c|^}}||sQt|}|j|p'd||S|ddkrd|dSt
    |S)Nrqrrz(regex ))r_separate_termsrrrzrr)rJrparentsrnorm_keys     r7rz_SummaryWriter._labels
    #  &&	L&s++H;??3''K388DLL4J4J+K+KK2;---%S%%%%Cyyr9c|ddkrm||sX||}t|trdd|dntt|St|S)Nrrrrr)rrrrrzr
    r%r)rJr&rtype_s    r7rz_SummaryWriter._value(s8vd&7&7&=&=LL''E+5eT+B+BX'DIIe$$''''SRWHXHX
    E{{r9c#K|D];\}}g||}||d|||V>> _separate_terms("FooBar-foo")
        ['foo', 'bar', 'foo']
        c:g|]}||Sr?)r,)r`ws  r7rz#_separate_terms..>s%EEE!1EAGGIIEEEr9)_CAMEL_CASE_SPLITTERsplit)rs r7rr9s(
    FE399$??EEEEr9)&rr|rQr*re
    contextlibrtextwraprrtypingrrrr	r
    rrr
    fastjsonschema_exceptionsr	getLoggerr:rOrergricompilerI_IDENTIFIERrkrrBr$rjr%rr?r9r7rs												%%%%%%!!!!!!!!MMMMMMMMMMMMMMMMMMMM??????
    '
    H
    %
    %1H"B"$@	
    YXX
    !rz"9::bjbd++	.D===F0F0F0F0F0F0F0F0R[7[7[7[7[7[7[7[7|F#F$s)FFFFFFr9PK!G(_validate_pyproject/extra_validations.pynu["""The purpose of this module is implement PEP 621 validations that are
    difficult to express as a JSON Schema (or that are not supported by the current
    JSON Schema library).
    """
    
    from typing import Mapping, TypeVar
    
    from .error_reporting import ValidationError
    
    T = TypeVar("T", bound=Mapping)
    
    
    class RedefiningStaticFieldAsDynamic(ValidationError):
        """According to PEP 621:
    
        Build back-ends MUST raise an error if the metadata specifies a field
        statically as well as being listed in dynamic.
        """
    
    
    def validate_project_dynamic(pyproject: T) -> T:
        project_table = pyproject.get("project", {})
        dynamic = project_table.get("dynamic", [])
    
        for field in dynamic:
            if field in project_table:
                msg = f"You cannot provide a value for `project.{field}` and "
                msg += "list it under `project.dynamic` at the same time"
                name = f"data.project.{field}"
                value = {field: project_table[field], "...": " # ...", "dynamic": dynamic}
                raise RedefiningStaticFieldAsDynamic(msg, value, name, rule="PEP 621")
    
        return pyproject
    
    
    EXTRA_VALIDATIONS = (validate_project_dynamic,)
    PK!o^7LL0_validate_pyproject/fastjsonschema_exceptions.pynu[import re
    
    
    SPLIT_RE = re.compile(r'[\.\[\]]+')
    
    
    class JsonSchemaException(ValueError):
        """
        Base exception of ``fastjsonschema`` library.
        """
    
    
    class JsonSchemaValueException(JsonSchemaException):
        """
        Exception raised by validation function. Available properties:
    
         * ``message`` containing human-readable information what is wrong (e.g. ``data.property[index] must be smaller than or equal to 42``),
         * invalid ``value`` (e.g. ``60``),
         * ``name`` of a path in the data structure (e.g. ``data.property[index]``),
         * ``path`` as an array in the data structure (e.g. ``['data', 'property', 'index']``),
         * the whole ``definition`` which the ``value`` has to fulfil (e.g. ``{'type': 'number', 'maximum': 42}``),
         * ``rule`` which the ``value`` is breaking (e.g. ``maximum``)
         * and ``rule_definition`` (e.g. ``42``).
    
        .. versionchanged:: 2.14.0
            Added all extra properties.
        """
    
        def __init__(self, message, value=None, name=None, definition=None, rule=None):
            super().__init__(message)
            self.message = message
            self.value = value
            self.name = name
            self.definition = definition
            self.rule = rule
    
        @property
        def path(self):
            return [item for item in SPLIT_RE.split(self.name) if item != '']
    
        @property
        def rule_definition(self):
            if not self.rule or not self.definition:
                return None
            return self.definition.get(self.rule)
    
    
    class JsonSchemaDefinitionException(JsonSchemaException):
        """
        Exception raised by generator of validation function.
        """
    PK!N,,&_validate_pyproject/error_reporting.pynu[import io
    import json
    import logging
    import os
    import re
    from contextlib import contextmanager
    from textwrap import indent, wrap
    from typing import Any, Dict, Iterator, List, Optional, Sequence, Union, cast
    
    from .fastjsonschema_exceptions import JsonSchemaValueException
    
    _logger = logging.getLogger(__name__)
    
    _MESSAGE_REPLACEMENTS = {
        "must be named by propertyName definition": "keys must be named by",
        "one of contains definition": "at least one item that matches",
        " same as const definition:": "",
        "only specified items": "only items matching the definition",
    }
    
    _SKIP_DETAILS = (
        "must not be empty",
        "is always invalid",
        "must not be there",
    )
    
    _NEED_DETAILS = {"anyOf", "oneOf", "anyOf", "contains", "propertyNames", "not", "items"}
    
    _CAMEL_CASE_SPLITTER = re.compile(r"\W+|([A-Z][^A-Z\W]*)")
    _IDENTIFIER = re.compile(r"^[\w_]+$", re.I)
    
    _TOML_JARGON = {
        "object": "table",
        "property": "key",
        "properties": "keys",
        "property names": "keys",
    }
    
    
    class ValidationError(JsonSchemaValueException):
        """Report violations of a given JSON schema.
    
        This class extends :exc:`~fastjsonschema.JsonSchemaValueException`
        by adding the following properties:
    
        - ``summary``: an improved version of the ``JsonSchemaValueException`` error message
          with only the necessary information)
    
        - ``details``: more contextual information about the error like the failing schema
          itself and the value that violates the schema.
    
        Depending on the level of the verbosity of the ``logging`` configuration
        the exception message will be only ``summary`` (default) or a combination of
        ``summary`` and ``details`` (when the logging level is set to :obj:`logging.DEBUG`).
        """
    
        summary = ""
        details = ""
        _original_message = ""
    
        @classmethod
        def _from_jsonschema(cls, ex: JsonSchemaValueException):
            formatter = _ErrorFormatting(ex)
            obj = cls(str(formatter), ex.value, formatter.name, ex.definition, ex.rule)
            debug_code = os.getenv("JSONSCHEMA_DEBUG_CODE_GENERATION", "false").lower()
            if debug_code != "false":  # pragma: no cover
                obj.__cause__, obj.__traceback__ = ex.__cause__, ex.__traceback__
            obj._original_message = ex.message
            obj.summary = formatter.summary
            obj.details = formatter.details
            return obj
    
    
    @contextmanager
    def detailed_errors():
        try:
            yield
        except JsonSchemaValueException as ex:
            raise ValidationError._from_jsonschema(ex) from None
    
    
    class _ErrorFormatting:
        def __init__(self, ex: JsonSchemaValueException):
            self.ex = ex
            self.name = f"`{self._simplify_name(ex.name)}`"
            self._original_message = self.ex.message.replace(ex.name, self.name)
            self._summary = ""
            self._details = ""
    
        def __str__(self) -> str:
            if _logger.getEffectiveLevel() <= logging.DEBUG and self.details:
                return f"{self.summary}\n\n{self.details}"
    
            return self.summary
    
        @property
        def summary(self) -> str:
            if not self._summary:
                self._summary = self._expand_summary()
    
            return self._summary
    
        @property
        def details(self) -> str:
            if not self._details:
                self._details = self._expand_details()
    
            return self._details
    
        def _simplify_name(self, name):
            x = len("data.")
            return name[x:] if name.startswith("data.") else name
    
        def _expand_summary(self):
            msg = self._original_message
    
            for bad, repl in _MESSAGE_REPLACEMENTS.items():
                msg = msg.replace(bad, repl)
    
            if any(substring in msg for substring in _SKIP_DETAILS):
                return msg
    
            schema = self.ex.rule_definition
            if self.ex.rule in _NEED_DETAILS and schema:
                summary = _SummaryWriter(_TOML_JARGON)
                return f"{msg}:\n\n{indent(summary(schema), '    ')}"
    
            return msg
    
        def _expand_details(self) -> str:
            optional = []
            desc_lines = self.ex.definition.pop("$$description", [])
            desc = self.ex.definition.pop("description", None) or " ".join(desc_lines)
            if desc:
                description = "\n".join(
                    wrap(
                        desc,
                        width=80,
                        initial_indent="    ",
                        subsequent_indent="    ",
                        break_long_words=False,
                    )
                )
                optional.append(f"DESCRIPTION:\n{description}")
            schema = json.dumps(self.ex.definition, indent=4)
            value = json.dumps(self.ex.value, indent=4)
            defaults = [
                f"GIVEN VALUE:\n{indent(value, '    ')}",
                f"OFFENDING RULE: {self.ex.rule!r}",
                f"DEFINITION:\n{indent(schema, '    ')}",
            ]
            return "\n\n".join(optional + defaults)
    
    
    class _SummaryWriter:
        _IGNORE = {"description", "default", "title", "examples"}
    
        def __init__(self, jargon: Optional[Dict[str, str]] = None):
            self.jargon: Dict[str, str] = jargon or {}
            # Clarify confusing terms
            self._terms = {
                "anyOf": "at least one of the following",
                "oneOf": "exactly one of the following",
                "allOf": "all of the following",
                "not": "(*NOT* the following)",
                "prefixItems": f"{self._jargon('items')} (in order)",
                "items": "items",
                "contains": "contains at least one of",
                "propertyNames": (
                    f"non-predefined acceptable {self._jargon('property names')}"
                ),
                "patternProperties": f"{self._jargon('properties')} named via pattern",
                "const": "predefined value",
                "enum": "one of",
            }
            # Attributes that indicate that the definition is easy and can be done
            # inline (e.g. string and number)
            self._guess_inline_defs = [
                "enum",
                "const",
                "maxLength",
                "minLength",
                "pattern",
                "format",
                "minimum",
                "maximum",
                "exclusiveMinimum",
                "exclusiveMaximum",
                "multipleOf",
            ]
    
        def _jargon(self, term: Union[str, List[str]]) -> Union[str, List[str]]:
            if isinstance(term, list):
                return [self.jargon.get(t, t) for t in term]
            return self.jargon.get(term, term)
    
        def __call__(
            self,
            schema: Union[dict, List[dict]],
            prefix: str = "",
            *,
            _path: Sequence[str] = (),
        ) -> str:
            if isinstance(schema, list):
                return self._handle_list(schema, prefix, _path)
    
            filtered = self._filter_unecessary(schema, _path)
            simple = self._handle_simple_dict(filtered, _path)
            if simple:
                return f"{prefix}{simple}"
    
            child_prefix = self._child_prefix(prefix, "  ")
            item_prefix = self._child_prefix(prefix, "- ")
            indent = len(prefix) * " "
            with io.StringIO() as buffer:
                for i, (key, value) in enumerate(filtered.items()):
                    child_path = [*_path, key]
                    line_prefix = prefix if i == 0 else indent
                    buffer.write(f"{line_prefix}{self._label(child_path)}:")
                    # ^  just the first item should receive the complete prefix
                    if isinstance(value, dict):
                        filtered = self._filter_unecessary(value, child_path)
                        simple = self._handle_simple_dict(filtered, child_path)
                        buffer.write(
                            f" {simple}"
                            if simple
                            else f"\n{self(value, child_prefix, _path=child_path)}"
                        )
                    elif isinstance(value, list) and (
                        key != "type" or self._is_property(child_path)
                    ):
                        children = self._handle_list(value, item_prefix, child_path)
                        sep = " " if children.startswith("[") else "\n"
                        buffer.write(f"{sep}{children}")
                    else:
                        buffer.write(f" {self._value(value, child_path)}\n")
                return buffer.getvalue()
    
        def _is_unecessary(self, path: Sequence[str]) -> bool:
            if self._is_property(path) or not path:  # empty path => instruction @ root
                return False
            key = path[-1]
            return any(key.startswith(k) for k in "$_") or key in self._IGNORE
    
        def _filter_unecessary(self, schema: dict, path: Sequence[str]):
            return {
                key: value
                for key, value in schema.items()
                if not self._is_unecessary([*path, key])
            }
    
        def _handle_simple_dict(self, value: dict, path: Sequence[str]) -> Optional[str]:
            inline = any(p in value for p in self._guess_inline_defs)
            simple = not any(isinstance(v, (list, dict)) for v in value.values())
            if inline or simple:
                return f"{{{', '.join(self._inline_attrs(value, path))}}}\n"
            return None
    
        def _handle_list(
            self, schemas: list, prefix: str = "", path: Sequence[str] = ()
        ) -> str:
            if self._is_unecessary(path):
                return ""
    
            repr_ = repr(schemas)
            if all(not isinstance(e, (dict, list)) for e in schemas) and len(repr_) < 60:
                return f"{repr_}\n"
    
            item_prefix = self._child_prefix(prefix, "- ")
            return "".join(
                self(v, item_prefix, _path=[*path, f"[{i}]"]) for i, v in enumerate(schemas)
            )
    
        def _is_property(self, path: Sequence[str]):
            """Check if the given path can correspond to an arbitrarily named property"""
            counter = 0
            for key in path[-2::-1]:
                if key not in {"properties", "patternProperties"}:
                    break
                counter += 1
    
            # If the counter if even, the path correspond to a JSON Schema keyword
            # otherwise it can be any arbitrary string naming a property
            return counter % 2 == 1
    
        def _label(self, path: Sequence[str]) -> str:
            *parents, key = path
            if not self._is_property(path):
                norm_key = _separate_terms(key)
                return self._terms.get(key) or " ".join(self._jargon(norm_key))
    
            if parents[-1] == "patternProperties":
                return f"(regex {key!r})"
            return repr(key)  # property name
    
        def _value(self, value: Any, path: Sequence[str]) -> str:
            if path[-1] == "type" and not self._is_property(path):
                type_ = self._jargon(value)
                return (
                    f"[{', '.join(type_)}]" if isinstance(value, list) else cast(str, type_)
                )
            return repr(value)
    
        def _inline_attrs(self, schema: dict, path: Sequence[str]) -> Iterator[str]:
            for key, value in schema.items():
                child_path = [*path, key]
                yield f"{self._label(child_path)}: {self._value(value, child_path)}"
    
        def _child_prefix(self, parent_prefix: str, child_prefix: str) -> str:
            return len(parent_prefix) * " " + child_prefix
    
    
    def _separate_terms(word: str) -> List[str]:
        """
        >>> _separate_terms("FooBar-foo")
        ['foo', 'bar', 'foo']
        """
        return [w.lower() for w in _CAMEL_CASE_SPLITTER.split(word) if w]
    PK!)111_validate_pyproject/fastjsonschema_validations.pynu[# noqa
    # type: ignore
    # flake8: noqa
    # pylint: skip-file
    # mypy: ignore-errors
    # yapf: disable
    # pylama:skip=1
    
    
    # *** PLEASE DO NOT MODIFY DIRECTLY: Automatically generated code *** 
    
    
    VERSION = "2.16.3"
    import re
    from .fastjsonschema_exceptions import JsonSchemaValueException
    
    
    REGEX_PATTERNS = {
        '^.*$': re.compile('^.*$'),
        '.+': re.compile('.+'),
        '^.+$': re.compile('^.+$'),
        'idn-email_re_pattern': re.compile('^[^@]+@[^@]+\\.[^@]+\\Z')
    }
    
    NoneType = type(None)
    
    def validate(data, custom_formats={}, name_prefix=None):
        validate_https___packaging_python_org_en_latest_specifications_declaring_build_dependencies(data, custom_formats, (name_prefix or "data") + "")
        return data
    
    def validate_https___packaging_python_org_en_latest_specifications_declaring_build_dependencies(data, custom_formats={}, name_prefix=None):
        if not isinstance(data, (dict)):
            raise JsonSchemaValueException("" + (name_prefix or "data") + " must be object", value=data, name="" + (name_prefix or "data") + "", definition={'$schema': 'http://json-schema.org/draft-07/schema', '$id': 'https://packaging.python.org/en/latest/specifications/declaring-build-dependencies/', 'title': 'Data structure for ``pyproject.toml`` files', '$$description': ['File format containing build-time configurations for the Python ecosystem. ', ':pep:`517` initially defined a build-system independent format for source trees', 'which was complemented by :pep:`518` to provide a way of specifying dependencies ', 'for building Python projects.', 'Please notice the ``project`` table (as initially defined in  :pep:`621`) is not included', 'in this schema and should be considered separately.'], 'type': 'object', 'additionalProperties': False, 'properties': {'build-system': {'type': 'object', 'description': 'Table used to store build-related data', 'additionalProperties': False, 'properties': {'requires': {'type': 'array', '$$description': ['List of dependencies in the :pep:`508` format required to execute the build', 'system. Please notice that the resulting dependency graph', '**MUST NOT contain cycles**'], 'items': {'type': 'string'}}, 'build-backend': {'type': 'string', 'description': 'Python object that will be used to perform the build according to :pep:`517`', 'format': 'pep517-backend-reference'}, 'backend-path': {'type': 'array', '$$description': ['List of directories to be prepended to ``sys.path`` when loading the', 'back-end, and running its hooks'], 'items': {'type': 'string', '$comment': 'Should be a path (TODO: enforce it with format?)'}}}, 'required': ['requires']}, 'project': {'$schema': 'http://json-schema.org/draft-07/schema', '$id': 'https://packaging.python.org/en/latest/specifications/declaring-project-metadata/', 'title': 'Package metadata stored in the ``project`` table', '$$description': ['Data structure for the **project** table inside ``pyproject.toml``', '(as initially defined in :pep:`621`)'], 'type': 'object', 'properties': {'name': {'type': 'string', 'description': 'The name (primary identifier) of the project. MUST be statically defined.', 'format': 'pep508-identifier'}, 'version': {'type': 'string', 'description': 'The version of the project as supported by :pep:`440`.', 'format': 'pep440'}, 'description': {'type': 'string', '$$description': ['The `summary description of the project', '`_']}, 'readme': {'$$description': ['`Full/detailed description of the project in the form of a README', '`_', "with meaning similar to the one defined in `core metadata's Description", '`_'], 'oneOf': [{'type': 'string', '$$description': ['Relative path to a text file (UTF-8) containing the full description', 'of the project. If the file path ends in case-insensitive ``.md`` or', '``.rst`` suffixes, then the content-type is respectively', '``text/markdown`` or ``text/x-rst``']}, {'type': 'object', 'allOf': [{'anyOf': [{'properties': {'file': {'type': 'string', '$$description': ['Relative path to a text file containing the full description', 'of the project.']}}, 'required': ['file']}, {'properties': {'text': {'type': 'string', 'description': 'Full text describing the project.'}}, 'required': ['text']}]}, {'properties': {'content-type': {'type': 'string', '$$description': ['Content-type (:rfc:`1341`) of the full description', '(e.g. ``text/markdown``). The ``charset`` parameter is assumed', 'UTF-8 when not present.'], '$comment': 'TODO: add regex pattern or format?'}}, 'required': ['content-type']}]}]}, 'requires-python': {'type': 'string', 'format': 'pep508-versionspec', '$$description': ['`The Python version requirements of the project', '`_.']}, 'license': {'description': '`Project license `_.', 'oneOf': [{'properties': {'file': {'type': 'string', '$$description': ['Relative path to the file (UTF-8) which contains the license for the', 'project.']}}, 'required': ['file']}, {'properties': {'text': {'type': 'string', '$$description': ['The license of the project whose meaning is that of the', '`License field from the core metadata', '`_.']}}, 'required': ['text']}]}, 'authors': {'type': 'array', 'items': {'$ref': '#/definitions/author'}, '$$description': ["The people or organizations considered to be the 'authors' of the project.", 'The exact meaning is open to interpretation (e.g. original or primary authors,', 'current maintainers, or owners of the package).']}, 'maintainers': {'type': 'array', 'items': {'$ref': '#/definitions/author'}, '$$description': ["The people or organizations considered to be the 'maintainers' of the project.", 'Similarly to ``authors``, the exact meaning is open to interpretation.']}, 'keywords': {'type': 'array', 'items': {'type': 'string'}, 'description': 'List of keywords to assist searching for the distribution in a larger catalog.'}, 'classifiers': {'type': 'array', 'items': {'type': 'string', 'format': 'trove-classifier', 'description': '`PyPI classifier `_.'}, '$$description': ['`Trove classifiers `_', 'which apply to the project.']}, 'urls': {'type': 'object', 'description': 'URLs associated with the project in the form ``label => value``.', 'additionalProperties': False, 'patternProperties': {'^.+$': {'type': 'string', 'format': 'url'}}}, 'scripts': {'$ref': '#/definitions/entry-point-group', '$$description': ['Instruct the installer to create command-line wrappers for the given', '`entry points `_.']}, 'gui-scripts': {'$ref': '#/definitions/entry-point-group', '$$description': ['Instruct the installer to create GUI wrappers for the given', '`entry points `_.', 'The difference between ``scripts`` and ``gui-scripts`` is only relevant in', 'Windows.']}, 'entry-points': {'$$description': ['Instruct the installer to expose the given modules/functions via', '``entry-point`` discovery mechanism (useful for plugins).', 'More information available in the `Python packaging guide', '`_.'], 'propertyNames': {'format': 'python-entrypoint-group'}, 'additionalProperties': False, 'patternProperties': {'^.+$': {'$ref': '#/definitions/entry-point-group'}}}, 'dependencies': {'type': 'array', 'description': 'Project (mandatory) dependencies.', 'items': {'$ref': '#/definitions/dependency'}}, 'optional-dependencies': {'type': 'object', 'description': 'Optional dependency for the project', 'propertyNames': {'format': 'pep508-identifier'}, 'additionalProperties': False, 'patternProperties': {'^.+$': {'type': 'array', 'items': {'$ref': '#/definitions/dependency'}}}}, 'dynamic': {'type': 'array', '$$description': ['Specifies which fields are intentionally unspecified and expected to be', 'dynamically provided by build tools'], 'items': {'enum': ['version', 'description', 'readme', 'requires-python', 'license', 'authors', 'maintainers', 'keywords', 'classifiers', 'urls', 'scripts', 'gui-scripts', 'entry-points', 'dependencies', 'optional-dependencies']}}}, 'required': ['name'], 'additionalProperties': False, 'if': {'not': {'required': ['dynamic'], 'properties': {'dynamic': {'contains': {'const': 'version'}, '$$description': ['version is listed in ``dynamic``']}}}, '$$comment': ['According to :pep:`621`:', '    If the core metadata specification lists a field as "Required", then', '    the metadata MUST specify the field statically or list it in dynamic', 'In turn, `core metadata`_ defines:', '    The required fields are: Metadata-Version, Name, Version.', '    All the other fields are optional.', 'Since ``Metadata-Version`` is defined by the build back-end, ``name`` and', '``version`` are the only mandatory information in ``pyproject.toml``.', '.. _core metadata: https://packaging.python.org/specifications/core-metadata/']}, 'then': {'required': ['version'], '$$description': ['version should be statically defined in the ``version`` field']}, 'definitions': {'author': {'$id': '#/definitions/author', 'title': 'Author or Maintainer', '$comment': 'https://peps.python.org/pep-0621/#authors-maintainers', 'type': 'object', 'additionalProperties': False, 'properties': {'name': {'type': 'string', '$$description': ['MUST be a valid email name, i.e. whatever can be put as a name, before an', 'email, in :rfc:`822`.']}, 'email': {'type': 'string', 'format': 'idn-email', 'description': 'MUST be a valid email address'}}}, 'entry-point-group': {'$id': '#/definitions/entry-point-group', 'title': 'Entry-points', 'type': 'object', '$$description': ['Entry-points are grouped together to indicate what sort of capabilities they', 'provide.', 'See the `packaging guides', '`_', 'and `setuptools docs', '`_', 'for more information.'], 'propertyNames': {'format': 'python-entrypoint-name'}, 'additionalProperties': False, 'patternProperties': {'^.+$': {'type': 'string', '$$description': ['Reference to a Python object. It is either in the form', '``importable.module``, or ``importable.module:object.attr``.'], 'format': 'python-entrypoint-reference', '$comment': 'https://packaging.python.org/specifications/entry-points/'}}}, 'dependency': {'$id': '#/definitions/dependency', 'title': 'Dependency', 'type': 'string', 'description': 'Project dependency specification according to PEP 508', 'format': 'pep508'}}}, 'tool': {'type': 'object', 'properties': {'distutils': {'$schema': 'http://json-schema.org/draft-07/schema', '$id': 'https://docs.python.org/3/install/', 'title': '``tool.distutils`` table', '$$description': ['Originally, ``distutils`` allowed developers to configure arguments for', '``setup.py`` scripts via `distutils configuration files', '`_.', '``tool.distutils`` subtables could be used with the same purpose', '(NOT CURRENTLY IMPLEMENTED).'], 'type': 'object', 'properties': {'global': {'type': 'object', 'description': 'Global options applied to all ``distutils`` commands'}}, 'patternProperties': {'.+': {'type': 'object'}}, '$comment': 'TODO: Is there a practical way of making this schema more specific?'}, 'setuptools': {'$schema': 'http://json-schema.org/draft-07/schema', '$id': 'https://setuptools.pypa.io/en/latest/references/keywords.html', 'title': '``tool.setuptools`` table', '$$description': ['Please notice for the time being the ``setuptools`` project does not specify', 'a way of configuring builds via ``pyproject.toml``.', 'Therefore this schema should be taken just as a *"thought experiment"* on how', 'this *might be done*, by following the principles established in', '`ini2toml `_.', 'It considers only ``setuptools`` `parameters', '`_', 'that can currently be configured via ``setup.cfg`` and are not covered by :pep:`621`', 'but intentionally excludes ``dependency_links`` and ``setup_requires``.', 'NOTE: ``scripts`` was renamed to ``script-files`` to avoid confusion with', 'entry-point based scripts (defined in :pep:`621`).'], 'type': 'object', 'additionalProperties': False, 'properties': {'platforms': {'type': 'array', 'items': {'type': 'string'}}, 'provides': {'$$description': ['Package and virtual package names contained within this package', '**(not supported by pip)**'], 'type': 'array', 'items': {'type': 'string', 'format': 'pep508-identifier'}}, 'obsoletes': {'$$description': ['Packages which this package renders obsolete', '**(not supported by pip)**'], 'type': 'array', 'items': {'type': 'string', 'format': 'pep508-identifier'}}, 'zip-safe': {'description': 'Whether the project can be safely installed and run from a zip file.', 'type': 'boolean'}, 'script-files': {'description': 'Legacy way of defining scripts (entry-points are preferred).', 'type': 'array', 'items': {'type': 'string'}, '$comment': 'TODO: is this field deprecated/should be removed?'}, 'eager-resources': {'$$description': ['Resources that should be extracted together, if any of them is needed,', 'or if any C extensions included in the project are imported.'], 'type': 'array', 'items': {'type': 'string'}}, 'packages': {'$$description': ['Packages that should be included in the distribution.', 'It can be given either as a list of package identifiers', 'or as a ``dict``-like structure with a single key ``find``', 'which corresponds to a dynamic call to', '``setuptools.config.expand.find_packages`` function.', 'The ``find`` key is associated with a nested ``dict``-like structure that can', 'contain ``where``, ``include``, ``exclude`` and ``namespaces`` keys,', 'mimicking the keyword arguments of the associated function.'], 'oneOf': [{'title': 'Array of Python package identifiers', 'type': 'array', 'items': {'$ref': '#/definitions/package-name'}}, {'$ref': '#/definitions/find-directive'}]}, 'package-dir': {'$$description': [':class:`dict`-like structure mapping from package names to directories where their', 'code can be found.', 'The empty string (as key) means that all packages are contained inside', 'the given directory will be included in the distribution.'], 'type': 'object', 'additionalProperties': False, 'propertyNames': {'oneOf': [{'const': ''}, {'$ref': '#/definitions/package-name'}]}, 'patternProperties': {'^.*$': {'type': 'string'}}}, 'package-data': {'$$description': ['Mapping from package names to lists of glob patterns.', 'Usually this option is not needed when using ``include-package-data = true``', 'For more information on how to include data files, check ``setuptools`` `docs', '`_.'], 'type': 'object', 'additionalProperties': False, 'propertyNames': {'oneOf': [{'format': 'python-module-name'}, {'const': '*'}]}, 'patternProperties': {'^.*$': {'type': 'array', 'items': {'type': 'string'}}}}, 'include-package-data': {'$$description': ['Automatically include any data files inside the package directories', 'that are specified by ``MANIFEST.in``', 'For more information on how to include data files, check ``setuptools`` `docs', '`_.'], 'type': 'boolean'}, 'exclude-package-data': {'$$description': ['Mapping from package names to lists of glob patterns that should be excluded', 'For more information on how to include data files, check ``setuptools`` `docs', '`_.'], 'type': 'object', 'additionalProperties': False, 'propertyNames': {'oneOf': [{'format': 'python-module-name'}, {'const': '*'}]}, 'patternProperties': {'^.*$': {'type': 'array', 'items': {'type': 'string'}}}}, 'namespace-packages': {'type': 'array', 'items': {'type': 'string', 'format': 'python-module-name'}, '$comment': 'https://setuptools.pypa.io/en/latest/userguide/package_discovery.html'}, 'py-modules': {'description': 'Modules that setuptools will manipulate', 'type': 'array', 'items': {'type': 'string', 'format': 'python-module-name'}, '$comment': 'TODO: clarify the relationship with ``packages``'}, 'data-files': {'$$description': ['**DEPRECATED**: dict-like structure where each key represents a directory and', 'the value is a list of glob patterns that should be installed in them.', "Please notice this don't work with wheels. See `data files support", '`_'], 'type': 'object', 'patternProperties': {'^.*$': {'type': 'array', 'items': {'type': 'string'}}}}, 'cmdclass': {'$$description': ['Mapping of distutils-style command names to ``setuptools.Command`` subclasses', 'which in turn should be represented by strings with a qualified class name', '(i.e., "dotted" form with module), e.g.::\n\n', '    cmdclass = {mycmd = "pkg.subpkg.module.CommandClass"}\n\n', 'The command class should be a directly defined at the top-level of the', 'containing module (no class nesting).'], 'type': 'object', 'patternProperties': {'^.*$': {'type': 'string', 'format': 'python-qualified-identifier'}}}, 'license-files': {'type': 'array', 'items': {'type': 'string'}, '$$description': ['PROVISIONAL: List of glob patterns for all license files being distributed.', '(might become standard with PEP 639).', "By default: ``['LICEN[CS]E*', 'COPYING*', 'NOTICE*', 'AUTHORS*']``"], '$comment': 'TODO: revise if PEP 639 is accepted. Probably ``project.license-files``?'}, 'dynamic': {'type': 'object', 'description': 'Instructions for loading :pep:`621`-related metadata dynamically', 'additionalProperties': False, 'properties': {'version': {'$$description': ['A version dynamically loaded via either the ``attr:`` or ``file:``', 'directives. Please make sure the given file or attribute respects :pep:`440`.'], 'oneOf': [{'$ref': '#/definitions/attr-directive'}, {'$ref': '#/definitions/file-directive'}]}, 'classifiers': {'$ref': '#/definitions/file-directive'}, 'description': {'$ref': '#/definitions/file-directive'}, 'dependencies': {'$ref': '#/definitions/file-directive'}, 'entry-points': {'$ref': '#/definitions/file-directive'}, 'optional-dependencies': {'type': 'object', 'propertyNames': {'format': 'python-identifier'}, 'additionalProperties': False, 'patternProperties': {'.+': {'$ref': '#/definitions/file-directive'}}}, 'readme': {'anyOf': [{'$ref': '#/definitions/file-directive'}, {'properties': {'content-type': {'type': 'string'}}}], 'required': ['file']}}}}, 'definitions': {'package-name': {'$id': '#/definitions/package-name', 'title': 'Valid package name', 'description': 'Valid package name (importable or PEP 561).', 'type': 'string', 'anyOf': [{'format': 'python-module-name'}, {'format': 'pep561-stub-name'}]}, 'file-directive': {'$id': '#/definitions/file-directive', 'title': "'file:' directive", 'description': 'Value is read from a file (or list of files and then concatenated)', 'type': 'object', 'additionalProperties': False, 'properties': {'file': {'oneOf': [{'type': 'string'}, {'type': 'array', 'items': {'type': 'string'}}]}}, 'required': ['file']}, 'attr-directive': {'title': "'attr:' directive", '$id': '#/definitions/attr-directive', '$$description': ['Value is read from a module attribute. Supports callables and iterables;', 'unsupported types are cast via ``str()``'], 'type': 'object', 'additionalProperties': False, 'properties': {'attr': {'type': 'string'}}, 'required': ['attr']}, 'find-directive': {'$id': '#/definitions/find-directive', 'title': "'find:' directive", 'type': 'object', 'additionalProperties': False, 'properties': {'find': {'type': 'object', '$$description': ['Dynamic `package discovery', '`_.'], 'additionalProperties': False, 'properties': {'where': {'description': 'Directories to be searched for packages (Unix-style relative path)', 'type': 'array', 'items': {'type': 'string'}}, 'exclude': {'type': 'array', '$$description': ['Exclude packages that match the values listed in this field.', "Can container shell-style wildcards (e.g. ``'pkg.*'``)"], 'items': {'type': 'string'}}, 'include': {'type': 'array', '$$description': ['Restrict the found packages to just the ones listed in this field.', "Can container shell-style wildcards (e.g. ``'pkg.*'``)"], 'items': {'type': 'string'}}, 'namespaces': {'type': 'boolean', '$$description': ['When ``True``, directories without a ``__init__.py`` file will also', 'be scanned for :pep:`420`-style implicit namespaces']}}}}}}}}}}, 'project': {'$schema': 'http://json-schema.org/draft-07/schema', '$id': 'https://packaging.python.org/en/latest/specifications/declaring-project-metadata/', 'title': 'Package metadata stored in the ``project`` table', '$$description': ['Data structure for the **project** table inside ``pyproject.toml``', '(as initially defined in :pep:`621`)'], 'type': 'object', 'properties': {'name': {'type': 'string', 'description': 'The name (primary identifier) of the project. MUST be statically defined.', 'format': 'pep508-identifier'}, 'version': {'type': 'string', 'description': 'The version of the project as supported by :pep:`440`.', 'format': 'pep440'}, 'description': {'type': 'string', '$$description': ['The `summary description of the project', '`_']}, 'readme': {'$$description': ['`Full/detailed description of the project in the form of a README', '`_', "with meaning similar to the one defined in `core metadata's Description", '`_'], 'oneOf': [{'type': 'string', '$$description': ['Relative path to a text file (UTF-8) containing the full description', 'of the project. If the file path ends in case-insensitive ``.md`` or', '``.rst`` suffixes, then the content-type is respectively', '``text/markdown`` or ``text/x-rst``']}, {'type': 'object', 'allOf': [{'anyOf': [{'properties': {'file': {'type': 'string', '$$description': ['Relative path to a text file containing the full description', 'of the project.']}}, 'required': ['file']}, {'properties': {'text': {'type': 'string', 'description': 'Full text describing the project.'}}, 'required': ['text']}]}, {'properties': {'content-type': {'type': 'string', '$$description': ['Content-type (:rfc:`1341`) of the full description', '(e.g. ``text/markdown``). The ``charset`` parameter is assumed', 'UTF-8 when not present.'], '$comment': 'TODO: add regex pattern or format?'}}, 'required': ['content-type']}]}]}, 'requires-python': {'type': 'string', 'format': 'pep508-versionspec', '$$description': ['`The Python version requirements of the project', '`_.']}, 'license': {'description': '`Project license `_.', 'oneOf': [{'properties': {'file': {'type': 'string', '$$description': ['Relative path to the file (UTF-8) which contains the license for the', 'project.']}}, 'required': ['file']}, {'properties': {'text': {'type': 'string', '$$description': ['The license of the project whose meaning is that of the', '`License field from the core metadata', '`_.']}}, 'required': ['text']}]}, 'authors': {'type': 'array', 'items': {'$ref': '#/definitions/author'}, '$$description': ["The people or organizations considered to be the 'authors' of the project.", 'The exact meaning is open to interpretation (e.g. original or primary authors,', 'current maintainers, or owners of the package).']}, 'maintainers': {'type': 'array', 'items': {'$ref': '#/definitions/author'}, '$$description': ["The people or organizations considered to be the 'maintainers' of the project.", 'Similarly to ``authors``, the exact meaning is open to interpretation.']}, 'keywords': {'type': 'array', 'items': {'type': 'string'}, 'description': 'List of keywords to assist searching for the distribution in a larger catalog.'}, 'classifiers': {'type': 'array', 'items': {'type': 'string', 'format': 'trove-classifier', 'description': '`PyPI classifier `_.'}, '$$description': ['`Trove classifiers `_', 'which apply to the project.']}, 'urls': {'type': 'object', 'description': 'URLs associated with the project in the form ``label => value``.', 'additionalProperties': False, 'patternProperties': {'^.+$': {'type': 'string', 'format': 'url'}}}, 'scripts': {'$ref': '#/definitions/entry-point-group', '$$description': ['Instruct the installer to create command-line wrappers for the given', '`entry points `_.']}, 'gui-scripts': {'$ref': '#/definitions/entry-point-group', '$$description': ['Instruct the installer to create GUI wrappers for the given', '`entry points `_.', 'The difference between ``scripts`` and ``gui-scripts`` is only relevant in', 'Windows.']}, 'entry-points': {'$$description': ['Instruct the installer to expose the given modules/functions via', '``entry-point`` discovery mechanism (useful for plugins).', 'More information available in the `Python packaging guide', '`_.'], 'propertyNames': {'format': 'python-entrypoint-group'}, 'additionalProperties': False, 'patternProperties': {'^.+$': {'$ref': '#/definitions/entry-point-group'}}}, 'dependencies': {'type': 'array', 'description': 'Project (mandatory) dependencies.', 'items': {'$ref': '#/definitions/dependency'}}, 'optional-dependencies': {'type': 'object', 'description': 'Optional dependency for the project', 'propertyNames': {'format': 'pep508-identifier'}, 'additionalProperties': False, 'patternProperties': {'^.+$': {'type': 'array', 'items': {'$ref': '#/definitions/dependency'}}}}, 'dynamic': {'type': 'array', '$$description': ['Specifies which fields are intentionally unspecified and expected to be', 'dynamically provided by build tools'], 'items': {'enum': ['version', 'description', 'readme', 'requires-python', 'license', 'authors', 'maintainers', 'keywords', 'classifiers', 'urls', 'scripts', 'gui-scripts', 'entry-points', 'dependencies', 'optional-dependencies']}}}, 'required': ['name'], 'additionalProperties': False, 'if': {'not': {'required': ['dynamic'], 'properties': {'dynamic': {'contains': {'const': 'version'}, '$$description': ['version is listed in ``dynamic``']}}}, '$$comment': ['According to :pep:`621`:', '    If the core metadata specification lists a field as "Required", then', '    the metadata MUST specify the field statically or list it in dynamic', 'In turn, `core metadata`_ defines:', '    The required fields are: Metadata-Version, Name, Version.', '    All the other fields are optional.', 'Since ``Metadata-Version`` is defined by the build back-end, ``name`` and', '``version`` are the only mandatory information in ``pyproject.toml``.', '.. _core metadata: https://packaging.python.org/specifications/core-metadata/']}, 'then': {'required': ['version'], '$$description': ['version should be statically defined in the ``version`` field']}, 'definitions': {'author': {'$id': '#/definitions/author', 'title': 'Author or Maintainer', '$comment': 'https://peps.python.org/pep-0621/#authors-maintainers', 'type': 'object', 'additionalProperties': False, 'properties': {'name': {'type': 'string', '$$description': ['MUST be a valid email name, i.e. whatever can be put as a name, before an', 'email, in :rfc:`822`.']}, 'email': {'type': 'string', 'format': 'idn-email', 'description': 'MUST be a valid email address'}}}, 'entry-point-group': {'$id': '#/definitions/entry-point-group', 'title': 'Entry-points', 'type': 'object', '$$description': ['Entry-points are grouped together to indicate what sort of capabilities they', 'provide.', 'See the `packaging guides', '`_', 'and `setuptools docs', '`_', 'for more information.'], 'propertyNames': {'format': 'python-entrypoint-name'}, 'additionalProperties': False, 'patternProperties': {'^.+$': {'type': 'string', '$$description': ['Reference to a Python object. It is either in the form', '``importable.module``, or ``importable.module:object.attr``.'], 'format': 'python-entrypoint-reference', '$comment': 'https://packaging.python.org/specifications/entry-points/'}}}, 'dependency': {'$id': '#/definitions/dependency', 'title': 'Dependency', 'type': 'string', 'description': 'Project dependency specification according to PEP 508', 'format': 'pep508'}}}}, rule='type')
        data_is_dict = isinstance(data, dict)
        if data_is_dict:
            data_keys = set(data.keys())
            if "build-system" in data_keys:
                data_keys.remove("build-system")
                data__buildsystem = data["build-system"]
                if not isinstance(data__buildsystem, (dict)):
                    raise JsonSchemaValueException("" + (name_prefix or "data") + ".build-system must be object", value=data__buildsystem, name="" + (name_prefix or "data") + ".build-system", definition={'type': 'object', 'description': 'Table used to store build-related data', 'additionalProperties': False, 'properties': {'requires': {'type': 'array', '$$description': ['List of dependencies in the :pep:`508` format required to execute the build', 'system. Please notice that the resulting dependency graph', '**MUST NOT contain cycles**'], 'items': {'type': 'string'}}, 'build-backend': {'type': 'string', 'description': 'Python object that will be used to perform the build according to :pep:`517`', 'format': 'pep517-backend-reference'}, 'backend-path': {'type': 'array', '$$description': ['List of directories to be prepended to ``sys.path`` when loading the', 'back-end, and running its hooks'], 'items': {'type': 'string', '$comment': 'Should be a path (TODO: enforce it with format?)'}}}, 'required': ['requires']}, rule='type')
                data__buildsystem_is_dict = isinstance(data__buildsystem, dict)
                if data__buildsystem_is_dict:
                    data__buildsystem_len = len(data__buildsystem)
                    if not all(prop in data__buildsystem for prop in ['requires']):
                        raise JsonSchemaValueException("" + (name_prefix or "data") + ".build-system must contain ['requires'] properties", value=data__buildsystem, name="" + (name_prefix or "data") + ".build-system", definition={'type': 'object', 'description': 'Table used to store build-related data', 'additionalProperties': False, 'properties': {'requires': {'type': 'array', '$$description': ['List of dependencies in the :pep:`508` format required to execute the build', 'system. Please notice that the resulting dependency graph', '**MUST NOT contain cycles**'], 'items': {'type': 'string'}}, 'build-backend': {'type': 'string', 'description': 'Python object that will be used to perform the build according to :pep:`517`', 'format': 'pep517-backend-reference'}, 'backend-path': {'type': 'array', '$$description': ['List of directories to be prepended to ``sys.path`` when loading the', 'back-end, and running its hooks'], 'items': {'type': 'string', '$comment': 'Should be a path (TODO: enforce it with format?)'}}}, 'required': ['requires']}, rule='required')
                    data__buildsystem_keys = set(data__buildsystem.keys())
                    if "requires" in data__buildsystem_keys:
                        data__buildsystem_keys.remove("requires")
                        data__buildsystem__requires = data__buildsystem["requires"]
                        if not isinstance(data__buildsystem__requires, (list, tuple)):
                            raise JsonSchemaValueException("" + (name_prefix or "data") + ".build-system.requires must be array", value=data__buildsystem__requires, name="" + (name_prefix or "data") + ".build-system.requires", definition={'type': 'array', '$$description': ['List of dependencies in the :pep:`508` format required to execute the build', 'system. Please notice that the resulting dependency graph', '**MUST NOT contain cycles**'], 'items': {'type': 'string'}}, rule='type')
                        data__buildsystem__requires_is_list = isinstance(data__buildsystem__requires, (list, tuple))
                        if data__buildsystem__requires_is_list:
                            data__buildsystem__requires_len = len(data__buildsystem__requires)
                            for data__buildsystem__requires_x, data__buildsystem__requires_item in enumerate(data__buildsystem__requires):
                                if not isinstance(data__buildsystem__requires_item, (str)):
                                    raise JsonSchemaValueException("" + (name_prefix or "data") + ".build-system.requires[{data__buildsystem__requires_x}]".format(**locals()) + " must be string", value=data__buildsystem__requires_item, name="" + (name_prefix or "data") + ".build-system.requires[{data__buildsystem__requires_x}]".format(**locals()) + "", definition={'type': 'string'}, rule='type')
                    if "build-backend" in data__buildsystem_keys:
                        data__buildsystem_keys.remove("build-backend")
                        data__buildsystem__buildbackend = data__buildsystem["build-backend"]
                        if not isinstance(data__buildsystem__buildbackend, (str)):
                            raise JsonSchemaValueException("" + (name_prefix or "data") + ".build-system.build-backend must be string", value=data__buildsystem__buildbackend, name="" + (name_prefix or "data") + ".build-system.build-backend", definition={'type': 'string', 'description': 'Python object that will be used to perform the build according to :pep:`517`', 'format': 'pep517-backend-reference'}, rule='type')
                        if isinstance(data__buildsystem__buildbackend, str):
                            if not custom_formats["pep517-backend-reference"](data__buildsystem__buildbackend):
                                raise JsonSchemaValueException("" + (name_prefix or "data") + ".build-system.build-backend must be pep517-backend-reference", value=data__buildsystem__buildbackend, name="" + (name_prefix or "data") + ".build-system.build-backend", definition={'type': 'string', 'description': 'Python object that will be used to perform the build according to :pep:`517`', 'format': 'pep517-backend-reference'}, rule='format')
                    if "backend-path" in data__buildsystem_keys:
                        data__buildsystem_keys.remove("backend-path")
                        data__buildsystem__backendpath = data__buildsystem["backend-path"]
                        if not isinstance(data__buildsystem__backendpath, (list, tuple)):
                            raise JsonSchemaValueException("" + (name_prefix or "data") + ".build-system.backend-path must be array", value=data__buildsystem__backendpath, name="" + (name_prefix or "data") + ".build-system.backend-path", definition={'type': 'array', '$$description': ['List of directories to be prepended to ``sys.path`` when loading the', 'back-end, and running its hooks'], 'items': {'type': 'string', '$comment': 'Should be a path (TODO: enforce it with format?)'}}, rule='type')
                        data__buildsystem__backendpath_is_list = isinstance(data__buildsystem__backendpath, (list, tuple))
                        if data__buildsystem__backendpath_is_list:
                            data__buildsystem__backendpath_len = len(data__buildsystem__backendpath)
                            for data__buildsystem__backendpath_x, data__buildsystem__backendpath_item in enumerate(data__buildsystem__backendpath):
                                if not isinstance(data__buildsystem__backendpath_item, (str)):
                                    raise JsonSchemaValueException("" + (name_prefix or "data") + ".build-system.backend-path[{data__buildsystem__backendpath_x}]".format(**locals()) + " must be string", value=data__buildsystem__backendpath_item, name="" + (name_prefix or "data") + ".build-system.backend-path[{data__buildsystem__backendpath_x}]".format(**locals()) + "", definition={'type': 'string', '$comment': 'Should be a path (TODO: enforce it with format?)'}, rule='type')
                    if data__buildsystem_keys:
                        raise JsonSchemaValueException("" + (name_prefix or "data") + ".build-system must not contain "+str(data__buildsystem_keys)+" properties", value=data__buildsystem, name="" + (name_prefix or "data") + ".build-system", definition={'type': 'object', 'description': 'Table used to store build-related data', 'additionalProperties': False, 'properties': {'requires': {'type': 'array', '$$description': ['List of dependencies in the :pep:`508` format required to execute the build', 'system. Please notice that the resulting dependency graph', '**MUST NOT contain cycles**'], 'items': {'type': 'string'}}, 'build-backend': {'type': 'string', 'description': 'Python object that will be used to perform the build according to :pep:`517`', 'format': 'pep517-backend-reference'}, 'backend-path': {'type': 'array', '$$description': ['List of directories to be prepended to ``sys.path`` when loading the', 'back-end, and running its hooks'], 'items': {'type': 'string', '$comment': 'Should be a path (TODO: enforce it with format?)'}}}, 'required': ['requires']}, rule='additionalProperties')
            if "project" in data_keys:
                data_keys.remove("project")
                data__project = data["project"]
                validate_https___packaging_python_org_en_latest_specifications_declaring_project_metadata(data__project, custom_formats, (name_prefix or "data") + ".project")
            if "tool" in data_keys:
                data_keys.remove("tool")
                data__tool = data["tool"]
                if not isinstance(data__tool, (dict)):
                    raise JsonSchemaValueException("" + (name_prefix or "data") + ".tool must be object", value=data__tool, name="" + (name_prefix or "data") + ".tool", definition={'type': 'object', 'properties': {'distutils': {'$schema': 'http://json-schema.org/draft-07/schema', '$id': 'https://docs.python.org/3/install/', 'title': '``tool.distutils`` table', '$$description': ['Originally, ``distutils`` allowed developers to configure arguments for', '``setup.py`` scripts via `distutils configuration files', '`_.', '``tool.distutils`` subtables could be used with the same purpose', '(NOT CURRENTLY IMPLEMENTED).'], 'type': 'object', 'properties': {'global': {'type': 'object', 'description': 'Global options applied to all ``distutils`` commands'}}, 'patternProperties': {'.+': {'type': 'object'}}, '$comment': 'TODO: Is there a practical way of making this schema more specific?'}, 'setuptools': {'$schema': 'http://json-schema.org/draft-07/schema', '$id': 'https://setuptools.pypa.io/en/latest/references/keywords.html', 'title': '``tool.setuptools`` table', '$$description': ['Please notice for the time being the ``setuptools`` project does not specify', 'a way of configuring builds via ``pyproject.toml``.', 'Therefore this schema should be taken just as a *"thought experiment"* on how', 'this *might be done*, by following the principles established in', '`ini2toml `_.', 'It considers only ``setuptools`` `parameters', '`_', 'that can currently be configured via ``setup.cfg`` and are not covered by :pep:`621`', 'but intentionally excludes ``dependency_links`` and ``setup_requires``.', 'NOTE: ``scripts`` was renamed to ``script-files`` to avoid confusion with', 'entry-point based scripts (defined in :pep:`621`).'], 'type': 'object', 'additionalProperties': False, 'properties': {'platforms': {'type': 'array', 'items': {'type': 'string'}}, 'provides': {'$$description': ['Package and virtual package names contained within this package', '**(not supported by pip)**'], 'type': 'array', 'items': {'type': 'string', 'format': 'pep508-identifier'}}, 'obsoletes': {'$$description': ['Packages which this package renders obsolete', '**(not supported by pip)**'], 'type': 'array', 'items': {'type': 'string', 'format': 'pep508-identifier'}}, 'zip-safe': {'description': 'Whether the project can be safely installed and run from a zip file.', 'type': 'boolean'}, 'script-files': {'description': 'Legacy way of defining scripts (entry-points are preferred).', 'type': 'array', 'items': {'type': 'string'}, '$comment': 'TODO: is this field deprecated/should be removed?'}, 'eager-resources': {'$$description': ['Resources that should be extracted together, if any of them is needed,', 'or if any C extensions included in the project are imported.'], 'type': 'array', 'items': {'type': 'string'}}, 'packages': {'$$description': ['Packages that should be included in the distribution.', 'It can be given either as a list of package identifiers', 'or as a ``dict``-like structure with a single key ``find``', 'which corresponds to a dynamic call to', '``setuptools.config.expand.find_packages`` function.', 'The ``find`` key is associated with a nested ``dict``-like structure that can', 'contain ``where``, ``include``, ``exclude`` and ``namespaces`` keys,', 'mimicking the keyword arguments of the associated function.'], 'oneOf': [{'title': 'Array of Python package identifiers', 'type': 'array', 'items': {'$ref': '#/definitions/package-name'}}, {'$ref': '#/definitions/find-directive'}]}, 'package-dir': {'$$description': [':class:`dict`-like structure mapping from package names to directories where their', 'code can be found.', 'The empty string (as key) means that all packages are contained inside', 'the given directory will be included in the distribution.'], 'type': 'object', 'additionalProperties': False, 'propertyNames': {'oneOf': [{'const': ''}, {'$ref': '#/definitions/package-name'}]}, 'patternProperties': {'^.*$': {'type': 'string'}}}, 'package-data': {'$$description': ['Mapping from package names to lists of glob patterns.', 'Usually this option is not needed when using ``include-package-data = true``', 'For more information on how to include data files, check ``setuptools`` `docs', '`_.'], 'type': 'object', 'additionalProperties': False, 'propertyNames': {'oneOf': [{'format': 'python-module-name'}, {'const': '*'}]}, 'patternProperties': {'^.*$': {'type': 'array', 'items': {'type': 'string'}}}}, 'include-package-data': {'$$description': ['Automatically include any data files inside the package directories', 'that are specified by ``MANIFEST.in``', 'For more information on how to include data files, check ``setuptools`` `docs', '`_.'], 'type': 'boolean'}, 'exclude-package-data': {'$$description': ['Mapping from package names to lists of glob patterns that should be excluded', 'For more information on how to include data files, check ``setuptools`` `docs', '`_.'], 'type': 'object', 'additionalProperties': False, 'propertyNames': {'oneOf': [{'format': 'python-module-name'}, {'const': '*'}]}, 'patternProperties': {'^.*$': {'type': 'array', 'items': {'type': 'string'}}}}, 'namespace-packages': {'type': 'array', 'items': {'type': 'string', 'format': 'python-module-name'}, '$comment': 'https://setuptools.pypa.io/en/latest/userguide/package_discovery.html'}, 'py-modules': {'description': 'Modules that setuptools will manipulate', 'type': 'array', 'items': {'type': 'string', 'format': 'python-module-name'}, '$comment': 'TODO: clarify the relationship with ``packages``'}, 'data-files': {'$$description': ['**DEPRECATED**: dict-like structure where each key represents a directory and', 'the value is a list of glob patterns that should be installed in them.', "Please notice this don't work with wheels. See `data files support", '`_'], 'type': 'object', 'patternProperties': {'^.*$': {'type': 'array', 'items': {'type': 'string'}}}}, 'cmdclass': {'$$description': ['Mapping of distutils-style command names to ``setuptools.Command`` subclasses', 'which in turn should be represented by strings with a qualified class name', '(i.e., "dotted" form with module), e.g.::\n\n', '    cmdclass = {mycmd = "pkg.subpkg.module.CommandClass"}\n\n', 'The command class should be a directly defined at the top-level of the', 'containing module (no class nesting).'], 'type': 'object', 'patternProperties': {'^.*$': {'type': 'string', 'format': 'python-qualified-identifier'}}}, 'license-files': {'type': 'array', 'items': {'type': 'string'}, '$$description': ['PROVISIONAL: List of glob patterns for all license files being distributed.', '(might become standard with PEP 639).', "By default: ``['LICEN[CS]E*', 'COPYING*', 'NOTICE*', 'AUTHORS*']``"], '$comment': 'TODO: revise if PEP 639 is accepted. Probably ``project.license-files``?'}, 'dynamic': {'type': 'object', 'description': 'Instructions for loading :pep:`621`-related metadata dynamically', 'additionalProperties': False, 'properties': {'version': {'$$description': ['A version dynamically loaded via either the ``attr:`` or ``file:``', 'directives. Please make sure the given file or attribute respects :pep:`440`.'], 'oneOf': [{'$ref': '#/definitions/attr-directive'}, {'$ref': '#/definitions/file-directive'}]}, 'classifiers': {'$ref': '#/definitions/file-directive'}, 'description': {'$ref': '#/definitions/file-directive'}, 'dependencies': {'$ref': '#/definitions/file-directive'}, 'entry-points': {'$ref': '#/definitions/file-directive'}, 'optional-dependencies': {'type': 'object', 'propertyNames': {'format': 'python-identifier'}, 'additionalProperties': False, 'patternProperties': {'.+': {'$ref': '#/definitions/file-directive'}}}, 'readme': {'anyOf': [{'$ref': '#/definitions/file-directive'}, {'properties': {'content-type': {'type': 'string'}}}], 'required': ['file']}}}}, 'definitions': {'package-name': {'$id': '#/definitions/package-name', 'title': 'Valid package name', 'description': 'Valid package name (importable or PEP 561).', 'type': 'string', 'anyOf': [{'format': 'python-module-name'}, {'format': 'pep561-stub-name'}]}, 'file-directive': {'$id': '#/definitions/file-directive', 'title': "'file:' directive", 'description': 'Value is read from a file (or list of files and then concatenated)', 'type': 'object', 'additionalProperties': False, 'properties': {'file': {'oneOf': [{'type': 'string'}, {'type': 'array', 'items': {'type': 'string'}}]}}, 'required': ['file']}, 'attr-directive': {'title': "'attr:' directive", '$id': '#/definitions/attr-directive', '$$description': ['Value is read from a module attribute. Supports callables and iterables;', 'unsupported types are cast via ``str()``'], 'type': 'object', 'additionalProperties': False, 'properties': {'attr': {'type': 'string'}}, 'required': ['attr']}, 'find-directive': {'$id': '#/definitions/find-directive', 'title': "'find:' directive", 'type': 'object', 'additionalProperties': False, 'properties': {'find': {'type': 'object', '$$description': ['Dynamic `package discovery', '`_.'], 'additionalProperties': False, 'properties': {'where': {'description': 'Directories to be searched for packages (Unix-style relative path)', 'type': 'array', 'items': {'type': 'string'}}, 'exclude': {'type': 'array', '$$description': ['Exclude packages that match the values listed in this field.', "Can container shell-style wildcards (e.g. ``'pkg.*'``)"], 'items': {'type': 'string'}}, 'include': {'type': 'array', '$$description': ['Restrict the found packages to just the ones listed in this field.', "Can container shell-style wildcards (e.g. ``'pkg.*'``)"], 'items': {'type': 'string'}}, 'namespaces': {'type': 'boolean', '$$description': ['When ``True``, directories without a ``__init__.py`` file will also', 'be scanned for :pep:`420`-style implicit namespaces']}}}}}}}}}, rule='type')
                data__tool_is_dict = isinstance(data__tool, dict)
                if data__tool_is_dict:
                    data__tool_keys = set(data__tool.keys())
                    if "distutils" in data__tool_keys:
                        data__tool_keys.remove("distutils")
                        data__tool__distutils = data__tool["distutils"]
                        validate_https___docs_python_org_3_install(data__tool__distutils, custom_formats, (name_prefix or "data") + ".tool.distutils")
                    if "setuptools" in data__tool_keys:
                        data__tool_keys.remove("setuptools")
                        data__tool__setuptools = data__tool["setuptools"]
                        validate_https___setuptools_pypa_io_en_latest_references_keywords_html(data__tool__setuptools, custom_formats, (name_prefix or "data") + ".tool.setuptools")
            if data_keys:
                raise JsonSchemaValueException("" + (name_prefix or "data") + " must not contain "+str(data_keys)+" properties", value=data, name="" + (name_prefix or "data") + "", definition={'$schema': 'http://json-schema.org/draft-07/schema', '$id': 'https://packaging.python.org/en/latest/specifications/declaring-build-dependencies/', 'title': 'Data structure for ``pyproject.toml`` files', '$$description': ['File format containing build-time configurations for the Python ecosystem. ', ':pep:`517` initially defined a build-system independent format for source trees', 'which was complemented by :pep:`518` to provide a way of specifying dependencies ', 'for building Python projects.', 'Please notice the ``project`` table (as initially defined in  :pep:`621`) is not included', 'in this schema and should be considered separately.'], 'type': 'object', 'additionalProperties': False, 'properties': {'build-system': {'type': 'object', 'description': 'Table used to store build-related data', 'additionalProperties': False, 'properties': {'requires': {'type': 'array', '$$description': ['List of dependencies in the :pep:`508` format required to execute the build', 'system. Please notice that the resulting dependency graph', '**MUST NOT contain cycles**'], 'items': {'type': 'string'}}, 'build-backend': {'type': 'string', 'description': 'Python object that will be used to perform the build according to :pep:`517`', 'format': 'pep517-backend-reference'}, 'backend-path': {'type': 'array', '$$description': ['List of directories to be prepended to ``sys.path`` when loading the', 'back-end, and running its hooks'], 'items': {'type': 'string', '$comment': 'Should be a path (TODO: enforce it with format?)'}}}, 'required': ['requires']}, 'project': {'$schema': 'http://json-schema.org/draft-07/schema', '$id': 'https://packaging.python.org/en/latest/specifications/declaring-project-metadata/', 'title': 'Package metadata stored in the ``project`` table', '$$description': ['Data structure for the **project** table inside ``pyproject.toml``', '(as initially defined in :pep:`621`)'], 'type': 'object', 'properties': {'name': {'type': 'string', 'description': 'The name (primary identifier) of the project. MUST be statically defined.', 'format': 'pep508-identifier'}, 'version': {'type': 'string', 'description': 'The version of the project as supported by :pep:`440`.', 'format': 'pep440'}, 'description': {'type': 'string', '$$description': ['The `summary description of the project', '`_']}, 'readme': {'$$description': ['`Full/detailed description of the project in the form of a README', '`_', "with meaning similar to the one defined in `core metadata's Description", '`_'], 'oneOf': [{'type': 'string', '$$description': ['Relative path to a text file (UTF-8) containing the full description', 'of the project. If the file path ends in case-insensitive ``.md`` or', '``.rst`` suffixes, then the content-type is respectively', '``text/markdown`` or ``text/x-rst``']}, {'type': 'object', 'allOf': [{'anyOf': [{'properties': {'file': {'type': 'string', '$$description': ['Relative path to a text file containing the full description', 'of the project.']}}, 'required': ['file']}, {'properties': {'text': {'type': 'string', 'description': 'Full text describing the project.'}}, 'required': ['text']}]}, {'properties': {'content-type': {'type': 'string', '$$description': ['Content-type (:rfc:`1341`) of the full description', '(e.g. ``text/markdown``). The ``charset`` parameter is assumed', 'UTF-8 when not present.'], '$comment': 'TODO: add regex pattern or format?'}}, 'required': ['content-type']}]}]}, 'requires-python': {'type': 'string', 'format': 'pep508-versionspec', '$$description': ['`The Python version requirements of the project', '`_.']}, 'license': {'description': '`Project license `_.', 'oneOf': [{'properties': {'file': {'type': 'string', '$$description': ['Relative path to the file (UTF-8) which contains the license for the', 'project.']}}, 'required': ['file']}, {'properties': {'text': {'type': 'string', '$$description': ['The license of the project whose meaning is that of the', '`License field from the core metadata', '`_.']}}, 'required': ['text']}]}, 'authors': {'type': 'array', 'items': {'$ref': '#/definitions/author'}, '$$description': ["The people or organizations considered to be the 'authors' of the project.", 'The exact meaning is open to interpretation (e.g. original or primary authors,', 'current maintainers, or owners of the package).']}, 'maintainers': {'type': 'array', 'items': {'$ref': '#/definitions/author'}, '$$description': ["The people or organizations considered to be the 'maintainers' of the project.", 'Similarly to ``authors``, the exact meaning is open to interpretation.']}, 'keywords': {'type': 'array', 'items': {'type': 'string'}, 'description': 'List of keywords to assist searching for the distribution in a larger catalog.'}, 'classifiers': {'type': 'array', 'items': {'type': 'string', 'format': 'trove-classifier', 'description': '`PyPI classifier `_.'}, '$$description': ['`Trove classifiers `_', 'which apply to the project.']}, 'urls': {'type': 'object', 'description': 'URLs associated with the project in the form ``label => value``.', 'additionalProperties': False, 'patternProperties': {'^.+$': {'type': 'string', 'format': 'url'}}}, 'scripts': {'$ref': '#/definitions/entry-point-group', '$$description': ['Instruct the installer to create command-line wrappers for the given', '`entry points `_.']}, 'gui-scripts': {'$ref': '#/definitions/entry-point-group', '$$description': ['Instruct the installer to create GUI wrappers for the given', '`entry points `_.', 'The difference between ``scripts`` and ``gui-scripts`` is only relevant in', 'Windows.']}, 'entry-points': {'$$description': ['Instruct the installer to expose the given modules/functions via', '``entry-point`` discovery mechanism (useful for plugins).', 'More information available in the `Python packaging guide', '`_.'], 'propertyNames': {'format': 'python-entrypoint-group'}, 'additionalProperties': False, 'patternProperties': {'^.+$': {'$ref': '#/definitions/entry-point-group'}}}, 'dependencies': {'type': 'array', 'description': 'Project (mandatory) dependencies.', 'items': {'$ref': '#/definitions/dependency'}}, 'optional-dependencies': {'type': 'object', 'description': 'Optional dependency for the project', 'propertyNames': {'format': 'pep508-identifier'}, 'additionalProperties': False, 'patternProperties': {'^.+$': {'type': 'array', 'items': {'$ref': '#/definitions/dependency'}}}}, 'dynamic': {'type': 'array', '$$description': ['Specifies which fields are intentionally unspecified and expected to be', 'dynamically provided by build tools'], 'items': {'enum': ['version', 'description', 'readme', 'requires-python', 'license', 'authors', 'maintainers', 'keywords', 'classifiers', 'urls', 'scripts', 'gui-scripts', 'entry-points', 'dependencies', 'optional-dependencies']}}}, 'required': ['name'], 'additionalProperties': False, 'if': {'not': {'required': ['dynamic'], 'properties': {'dynamic': {'contains': {'const': 'version'}, '$$description': ['version is listed in ``dynamic``']}}}, '$$comment': ['According to :pep:`621`:', '    If the core metadata specification lists a field as "Required", then', '    the metadata MUST specify the field statically or list it in dynamic', 'In turn, `core metadata`_ defines:', '    The required fields are: Metadata-Version, Name, Version.', '    All the other fields are optional.', 'Since ``Metadata-Version`` is defined by the build back-end, ``name`` and', '``version`` are the only mandatory information in ``pyproject.toml``.', '.. _core metadata: https://packaging.python.org/specifications/core-metadata/']}, 'then': {'required': ['version'], '$$description': ['version should be statically defined in the ``version`` field']}, 'definitions': {'author': {'$id': '#/definitions/author', 'title': 'Author or Maintainer', '$comment': 'https://peps.python.org/pep-0621/#authors-maintainers', 'type': 'object', 'additionalProperties': False, 'properties': {'name': {'type': 'string', '$$description': ['MUST be a valid email name, i.e. whatever can be put as a name, before an', 'email, in :rfc:`822`.']}, 'email': {'type': 'string', 'format': 'idn-email', 'description': 'MUST be a valid email address'}}}, 'entry-point-group': {'$id': '#/definitions/entry-point-group', 'title': 'Entry-points', 'type': 'object', '$$description': ['Entry-points are grouped together to indicate what sort of capabilities they', 'provide.', 'See the `packaging guides', '`_', 'and `setuptools docs', '`_', 'for more information.'], 'propertyNames': {'format': 'python-entrypoint-name'}, 'additionalProperties': False, 'patternProperties': {'^.+$': {'type': 'string', '$$description': ['Reference to a Python object. It is either in the form', '``importable.module``, or ``importable.module:object.attr``.'], 'format': 'python-entrypoint-reference', '$comment': 'https://packaging.python.org/specifications/entry-points/'}}}, 'dependency': {'$id': '#/definitions/dependency', 'title': 'Dependency', 'type': 'string', 'description': 'Project dependency specification according to PEP 508', 'format': 'pep508'}}}, 'tool': {'type': 'object', 'properties': {'distutils': {'$schema': 'http://json-schema.org/draft-07/schema', '$id': 'https://docs.python.org/3/install/', 'title': '``tool.distutils`` table', '$$description': ['Originally, ``distutils`` allowed developers to configure arguments for', '``setup.py`` scripts via `distutils configuration files', '`_.', '``tool.distutils`` subtables could be used with the same purpose', '(NOT CURRENTLY IMPLEMENTED).'], 'type': 'object', 'properties': {'global': {'type': 'object', 'description': 'Global options applied to all ``distutils`` commands'}}, 'patternProperties': {'.+': {'type': 'object'}}, '$comment': 'TODO: Is there a practical way of making this schema more specific?'}, 'setuptools': {'$schema': 'http://json-schema.org/draft-07/schema', '$id': 'https://setuptools.pypa.io/en/latest/references/keywords.html', 'title': '``tool.setuptools`` table', '$$description': ['Please notice for the time being the ``setuptools`` project does not specify', 'a way of configuring builds via ``pyproject.toml``.', 'Therefore this schema should be taken just as a *"thought experiment"* on how', 'this *might be done*, by following the principles established in', '`ini2toml `_.', 'It considers only ``setuptools`` `parameters', '`_', 'that can currently be configured via ``setup.cfg`` and are not covered by :pep:`621`', 'but intentionally excludes ``dependency_links`` and ``setup_requires``.', 'NOTE: ``scripts`` was renamed to ``script-files`` to avoid confusion with', 'entry-point based scripts (defined in :pep:`621`).'], 'type': 'object', 'additionalProperties': False, 'properties': {'platforms': {'type': 'array', 'items': {'type': 'string'}}, 'provides': {'$$description': ['Package and virtual package names contained within this package', '**(not supported by pip)**'], 'type': 'array', 'items': {'type': 'string', 'format': 'pep508-identifier'}}, 'obsoletes': {'$$description': ['Packages which this package renders obsolete', '**(not supported by pip)**'], 'type': 'array', 'items': {'type': 'string', 'format': 'pep508-identifier'}}, 'zip-safe': {'description': 'Whether the project can be safely installed and run from a zip file.', 'type': 'boolean'}, 'script-files': {'description': 'Legacy way of defining scripts (entry-points are preferred).', 'type': 'array', 'items': {'type': 'string'}, '$comment': 'TODO: is this field deprecated/should be removed?'}, 'eager-resources': {'$$description': ['Resources that should be extracted together, if any of them is needed,', 'or if any C extensions included in the project are imported.'], 'type': 'array', 'items': {'type': 'string'}}, 'packages': {'$$description': ['Packages that should be included in the distribution.', 'It can be given either as a list of package identifiers', 'or as a ``dict``-like structure with a single key ``find``', 'which corresponds to a dynamic call to', '``setuptools.config.expand.find_packages`` function.', 'The ``find`` key is associated with a nested ``dict``-like structure that can', 'contain ``where``, ``include``, ``exclude`` and ``namespaces`` keys,', 'mimicking the keyword arguments of the associated function.'], 'oneOf': [{'title': 'Array of Python package identifiers', 'type': 'array', 'items': {'$ref': '#/definitions/package-name'}}, {'$ref': '#/definitions/find-directive'}]}, 'package-dir': {'$$description': [':class:`dict`-like structure mapping from package names to directories where their', 'code can be found.', 'The empty string (as key) means that all packages are contained inside', 'the given directory will be included in the distribution.'], 'type': 'object', 'additionalProperties': False, 'propertyNames': {'oneOf': [{'const': ''}, {'$ref': '#/definitions/package-name'}]}, 'patternProperties': {'^.*$': {'type': 'string'}}}, 'package-data': {'$$description': ['Mapping from package names to lists of glob patterns.', 'Usually this option is not needed when using ``include-package-data = true``', 'For more information on how to include data files, check ``setuptools`` `docs', '`_.'], 'type': 'object', 'additionalProperties': False, 'propertyNames': {'oneOf': [{'format': 'python-module-name'}, {'const': '*'}]}, 'patternProperties': {'^.*$': {'type': 'array', 'items': {'type': 'string'}}}}, 'include-package-data': {'$$description': ['Automatically include any data files inside the package directories', 'that are specified by ``MANIFEST.in``', 'For more information on how to include data files, check ``setuptools`` `docs', '`_.'], 'type': 'boolean'}, 'exclude-package-data': {'$$description': ['Mapping from package names to lists of glob patterns that should be excluded', 'For more information on how to include data files, check ``setuptools`` `docs', '`_.'], 'type': 'object', 'additionalProperties': False, 'propertyNames': {'oneOf': [{'format': 'python-module-name'}, {'const': '*'}]}, 'patternProperties': {'^.*$': {'type': 'array', 'items': {'type': 'string'}}}}, 'namespace-packages': {'type': 'array', 'items': {'type': 'string', 'format': 'python-module-name'}, '$comment': 'https://setuptools.pypa.io/en/latest/userguide/package_discovery.html'}, 'py-modules': {'description': 'Modules that setuptools will manipulate', 'type': 'array', 'items': {'type': 'string', 'format': 'python-module-name'}, '$comment': 'TODO: clarify the relationship with ``packages``'}, 'data-files': {'$$description': ['**DEPRECATED**: dict-like structure where each key represents a directory and', 'the value is a list of glob patterns that should be installed in them.', "Please notice this don't work with wheels. See `data files support", '`_'], 'type': 'object', 'patternProperties': {'^.*$': {'type': 'array', 'items': {'type': 'string'}}}}, 'cmdclass': {'$$description': ['Mapping of distutils-style command names to ``setuptools.Command`` subclasses', 'which in turn should be represented by strings with a qualified class name', '(i.e., "dotted" form with module), e.g.::\n\n', '    cmdclass = {mycmd = "pkg.subpkg.module.CommandClass"}\n\n', 'The command class should be a directly defined at the top-level of the', 'containing module (no class nesting).'], 'type': 'object', 'patternProperties': {'^.*$': {'type': 'string', 'format': 'python-qualified-identifier'}}}, 'license-files': {'type': 'array', 'items': {'type': 'string'}, '$$description': ['PROVISIONAL: List of glob patterns for all license files being distributed.', '(might become standard with PEP 639).', "By default: ``['LICEN[CS]E*', 'COPYING*', 'NOTICE*', 'AUTHORS*']``"], '$comment': 'TODO: revise if PEP 639 is accepted. Probably ``project.license-files``?'}, 'dynamic': {'type': 'object', 'description': 'Instructions for loading :pep:`621`-related metadata dynamically', 'additionalProperties': False, 'properties': {'version': {'$$description': ['A version dynamically loaded via either the ``attr:`` or ``file:``', 'directives. Please make sure the given file or attribute respects :pep:`440`.'], 'oneOf': [{'$ref': '#/definitions/attr-directive'}, {'$ref': '#/definitions/file-directive'}]}, 'classifiers': {'$ref': '#/definitions/file-directive'}, 'description': {'$ref': '#/definitions/file-directive'}, 'dependencies': {'$ref': '#/definitions/file-directive'}, 'entry-points': {'$ref': '#/definitions/file-directive'}, 'optional-dependencies': {'type': 'object', 'propertyNames': {'format': 'python-identifier'}, 'additionalProperties': False, 'patternProperties': {'.+': {'$ref': '#/definitions/file-directive'}}}, 'readme': {'anyOf': [{'$ref': '#/definitions/file-directive'}, {'properties': {'content-type': {'type': 'string'}}}], 'required': ['file']}}}}, 'definitions': {'package-name': {'$id': '#/definitions/package-name', 'title': 'Valid package name', 'description': 'Valid package name (importable or PEP 561).', 'type': 'string', 'anyOf': [{'format': 'python-module-name'}, {'format': 'pep561-stub-name'}]}, 'file-directive': {'$id': '#/definitions/file-directive', 'title': "'file:' directive", 'description': 'Value is read from a file (or list of files and then concatenated)', 'type': 'object', 'additionalProperties': False, 'properties': {'file': {'oneOf': [{'type': 'string'}, {'type': 'array', 'items': {'type': 'string'}}]}}, 'required': ['file']}, 'attr-directive': {'title': "'attr:' directive", '$id': '#/definitions/attr-directive', '$$description': ['Value is read from a module attribute. Supports callables and iterables;', 'unsupported types are cast via ``str()``'], 'type': 'object', 'additionalProperties': False, 'properties': {'attr': {'type': 'string'}}, 'required': ['attr']}, 'find-directive': {'$id': '#/definitions/find-directive', 'title': "'find:' directive", 'type': 'object', 'additionalProperties': False, 'properties': {'find': {'type': 'object', '$$description': ['Dynamic `package discovery', '`_.'], 'additionalProperties': False, 'properties': {'where': {'description': 'Directories to be searched for packages (Unix-style relative path)', 'type': 'array', 'items': {'type': 'string'}}, 'exclude': {'type': 'array', '$$description': ['Exclude packages that match the values listed in this field.', "Can container shell-style wildcards (e.g. ``'pkg.*'``)"], 'items': {'type': 'string'}}, 'include': {'type': 'array', '$$description': ['Restrict the found packages to just the ones listed in this field.', "Can container shell-style wildcards (e.g. ``'pkg.*'``)"], 'items': {'type': 'string'}}, 'namespaces': {'type': 'boolean', '$$description': ['When ``True``, directories without a ``__init__.py`` file will also', 'be scanned for :pep:`420`-style implicit namespaces']}}}}}}}}}}, 'project': {'$schema': 'http://json-schema.org/draft-07/schema', '$id': 'https://packaging.python.org/en/latest/specifications/declaring-project-metadata/', 'title': 'Package metadata stored in the ``project`` table', '$$description': ['Data structure for the **project** table inside ``pyproject.toml``', '(as initially defined in :pep:`621`)'], 'type': 'object', 'properties': {'name': {'type': 'string', 'description': 'The name (primary identifier) of the project. MUST be statically defined.', 'format': 'pep508-identifier'}, 'version': {'type': 'string', 'description': 'The version of the project as supported by :pep:`440`.', 'format': 'pep440'}, 'description': {'type': 'string', '$$description': ['The `summary description of the project', '`_']}, 'readme': {'$$description': ['`Full/detailed description of the project in the form of a README', '`_', "with meaning similar to the one defined in `core metadata's Description", '`_'], 'oneOf': [{'type': 'string', '$$description': ['Relative path to a text file (UTF-8) containing the full description', 'of the project. If the file path ends in case-insensitive ``.md`` or', '``.rst`` suffixes, then the content-type is respectively', '``text/markdown`` or ``text/x-rst``']}, {'type': 'object', 'allOf': [{'anyOf': [{'properties': {'file': {'type': 'string', '$$description': ['Relative path to a text file containing the full description', 'of the project.']}}, 'required': ['file']}, {'properties': {'text': {'type': 'string', 'description': 'Full text describing the project.'}}, 'required': ['text']}]}, {'properties': {'content-type': {'type': 'string', '$$description': ['Content-type (:rfc:`1341`) of the full description', '(e.g. ``text/markdown``). The ``charset`` parameter is assumed', 'UTF-8 when not present.'], '$comment': 'TODO: add regex pattern or format?'}}, 'required': ['content-type']}]}]}, 'requires-python': {'type': 'string', 'format': 'pep508-versionspec', '$$description': ['`The Python version requirements of the project', '`_.']}, 'license': {'description': '`Project license `_.', 'oneOf': [{'properties': {'file': {'type': 'string', '$$description': ['Relative path to the file (UTF-8) which contains the license for the', 'project.']}}, 'required': ['file']}, {'properties': {'text': {'type': 'string', '$$description': ['The license of the project whose meaning is that of the', '`License field from the core metadata', '`_.']}}, 'required': ['text']}]}, 'authors': {'type': 'array', 'items': {'$ref': '#/definitions/author'}, '$$description': ["The people or organizations considered to be the 'authors' of the project.", 'The exact meaning is open to interpretation (e.g. original or primary authors,', 'current maintainers, or owners of the package).']}, 'maintainers': {'type': 'array', 'items': {'$ref': '#/definitions/author'}, '$$description': ["The people or organizations considered to be the 'maintainers' of the project.", 'Similarly to ``authors``, the exact meaning is open to interpretation.']}, 'keywords': {'type': 'array', 'items': {'type': 'string'}, 'description': 'List of keywords to assist searching for the distribution in a larger catalog.'}, 'classifiers': {'type': 'array', 'items': {'type': 'string', 'format': 'trove-classifier', 'description': '`PyPI classifier `_.'}, '$$description': ['`Trove classifiers `_', 'which apply to the project.']}, 'urls': {'type': 'object', 'description': 'URLs associated with the project in the form ``label => value``.', 'additionalProperties': False, 'patternProperties': {'^.+$': {'type': 'string', 'format': 'url'}}}, 'scripts': {'$ref': '#/definitions/entry-point-group', '$$description': ['Instruct the installer to create command-line wrappers for the given', '`entry points `_.']}, 'gui-scripts': {'$ref': '#/definitions/entry-point-group', '$$description': ['Instruct the installer to create GUI wrappers for the given', '`entry points `_.', 'The difference between ``scripts`` and ``gui-scripts`` is only relevant in', 'Windows.']}, 'entry-points': {'$$description': ['Instruct the installer to expose the given modules/functions via', '``entry-point`` discovery mechanism (useful for plugins).', 'More information available in the `Python packaging guide', '`_.'], 'propertyNames': {'format': 'python-entrypoint-group'}, 'additionalProperties': False, 'patternProperties': {'^.+$': {'$ref': '#/definitions/entry-point-group'}}}, 'dependencies': {'type': 'array', 'description': 'Project (mandatory) dependencies.', 'items': {'$ref': '#/definitions/dependency'}}, 'optional-dependencies': {'type': 'object', 'description': 'Optional dependency for the project', 'propertyNames': {'format': 'pep508-identifier'}, 'additionalProperties': False, 'patternProperties': {'^.+$': {'type': 'array', 'items': {'$ref': '#/definitions/dependency'}}}}, 'dynamic': {'type': 'array', '$$description': ['Specifies which fields are intentionally unspecified and expected to be', 'dynamically provided by build tools'], 'items': {'enum': ['version', 'description', 'readme', 'requires-python', 'license', 'authors', 'maintainers', 'keywords', 'classifiers', 'urls', 'scripts', 'gui-scripts', 'entry-points', 'dependencies', 'optional-dependencies']}}}, 'required': ['name'], 'additionalProperties': False, 'if': {'not': {'required': ['dynamic'], 'properties': {'dynamic': {'contains': {'const': 'version'}, '$$description': ['version is listed in ``dynamic``']}}}, '$$comment': ['According to :pep:`621`:', '    If the core metadata specification lists a field as "Required", then', '    the metadata MUST specify the field statically or list it in dynamic', 'In turn, `core metadata`_ defines:', '    The required fields are: Metadata-Version, Name, Version.', '    All the other fields are optional.', 'Since ``Metadata-Version`` is defined by the build back-end, ``name`` and', '``version`` are the only mandatory information in ``pyproject.toml``.', '.. _core metadata: https://packaging.python.org/specifications/core-metadata/']}, 'then': {'required': ['version'], '$$description': ['version should be statically defined in the ``version`` field']}, 'definitions': {'author': {'$id': '#/definitions/author', 'title': 'Author or Maintainer', '$comment': 'https://peps.python.org/pep-0621/#authors-maintainers', 'type': 'object', 'additionalProperties': False, 'properties': {'name': {'type': 'string', '$$description': ['MUST be a valid email name, i.e. whatever can be put as a name, before an', 'email, in :rfc:`822`.']}, 'email': {'type': 'string', 'format': 'idn-email', 'description': 'MUST be a valid email address'}}}, 'entry-point-group': {'$id': '#/definitions/entry-point-group', 'title': 'Entry-points', 'type': 'object', '$$description': ['Entry-points are grouped together to indicate what sort of capabilities they', 'provide.', 'See the `packaging guides', '`_', 'and `setuptools docs', '`_', 'for more information.'], 'propertyNames': {'format': 'python-entrypoint-name'}, 'additionalProperties': False, 'patternProperties': {'^.+$': {'type': 'string', '$$description': ['Reference to a Python object. It is either in the form', '``importable.module``, or ``importable.module:object.attr``.'], 'format': 'python-entrypoint-reference', '$comment': 'https://packaging.python.org/specifications/entry-points/'}}}, 'dependency': {'$id': '#/definitions/dependency', 'title': 'Dependency', 'type': 'string', 'description': 'Project dependency specification according to PEP 508', 'format': 'pep508'}}}}, rule='additionalProperties')
        return data
    
    def validate_https___setuptools_pypa_io_en_latest_references_keywords_html(data, custom_formats={}, name_prefix=None):
        if not isinstance(data, (dict)):
            raise JsonSchemaValueException("" + (name_prefix or "data") + " must be object", value=data, name="" + (name_prefix or "data") + "", definition={'$schema': 'http://json-schema.org/draft-07/schema', '$id': 'https://setuptools.pypa.io/en/latest/references/keywords.html', 'title': '``tool.setuptools`` table', '$$description': ['Please notice for the time being the ``setuptools`` project does not specify', 'a way of configuring builds via ``pyproject.toml``.', 'Therefore this schema should be taken just as a *"thought experiment"* on how', 'this *might be done*, by following the principles established in', '`ini2toml `_.', 'It considers only ``setuptools`` `parameters', '`_', 'that can currently be configured via ``setup.cfg`` and are not covered by :pep:`621`', 'but intentionally excludes ``dependency_links`` and ``setup_requires``.', 'NOTE: ``scripts`` was renamed to ``script-files`` to avoid confusion with', 'entry-point based scripts (defined in :pep:`621`).'], 'type': 'object', 'additionalProperties': False, 'properties': {'platforms': {'type': 'array', 'items': {'type': 'string'}}, 'provides': {'$$description': ['Package and virtual package names contained within this package', '**(not supported by pip)**'], 'type': 'array', 'items': {'type': 'string', 'format': 'pep508-identifier'}}, 'obsoletes': {'$$description': ['Packages which this package renders obsolete', '**(not supported by pip)**'], 'type': 'array', 'items': {'type': 'string', 'format': 'pep508-identifier'}}, 'zip-safe': {'description': 'Whether the project can be safely installed and run from a zip file.', 'type': 'boolean'}, 'script-files': {'description': 'Legacy way of defining scripts (entry-points are preferred).', 'type': 'array', 'items': {'type': 'string'}, '$comment': 'TODO: is this field deprecated/should be removed?'}, 'eager-resources': {'$$description': ['Resources that should be extracted together, if any of them is needed,', 'or if any C extensions included in the project are imported.'], 'type': 'array', 'items': {'type': 'string'}}, 'packages': {'$$description': ['Packages that should be included in the distribution.', 'It can be given either as a list of package identifiers', 'or as a ``dict``-like structure with a single key ``find``', 'which corresponds to a dynamic call to', '``setuptools.config.expand.find_packages`` function.', 'The ``find`` key is associated with a nested ``dict``-like structure that can', 'contain ``where``, ``include``, ``exclude`` and ``namespaces`` keys,', 'mimicking the keyword arguments of the associated function.'], 'oneOf': [{'title': 'Array of Python package identifiers', 'type': 'array', 'items': {'$id': '#/definitions/package-name', 'title': 'Valid package name', 'description': 'Valid package name (importable or PEP 561).', 'type': 'string', 'anyOf': [{'format': 'python-module-name'}, {'format': 'pep561-stub-name'}]}}, {'$id': '#/definitions/find-directive', 'title': "'find:' directive", 'type': 'object', 'additionalProperties': False, 'properties': {'find': {'type': 'object', '$$description': ['Dynamic `package discovery', '`_.'], 'additionalProperties': False, 'properties': {'where': {'description': 'Directories to be searched for packages (Unix-style relative path)', 'type': 'array', 'items': {'type': 'string'}}, 'exclude': {'type': 'array', '$$description': ['Exclude packages that match the values listed in this field.', "Can container shell-style wildcards (e.g. ``'pkg.*'``)"], 'items': {'type': 'string'}}, 'include': {'type': 'array', '$$description': ['Restrict the found packages to just the ones listed in this field.', "Can container shell-style wildcards (e.g. ``'pkg.*'``)"], 'items': {'type': 'string'}}, 'namespaces': {'type': 'boolean', '$$description': ['When ``True``, directories without a ``__init__.py`` file will also', 'be scanned for :pep:`420`-style implicit namespaces']}}}}}]}, 'package-dir': {'$$description': [':class:`dict`-like structure mapping from package names to directories where their', 'code can be found.', 'The empty string (as key) means that all packages are contained inside', 'the given directory will be included in the distribution.'], 'type': 'object', 'additionalProperties': False, 'propertyNames': {'oneOf': [{'const': ''}, {'$id': '#/definitions/package-name', 'title': 'Valid package name', 'description': 'Valid package name (importable or PEP 561).', 'type': 'string', 'anyOf': [{'format': 'python-module-name'}, {'format': 'pep561-stub-name'}]}]}, 'patternProperties': {'^.*$': {'type': 'string'}}}, 'package-data': {'$$description': ['Mapping from package names to lists of glob patterns.', 'Usually this option is not needed when using ``include-package-data = true``', 'For more information on how to include data files, check ``setuptools`` `docs', '`_.'], 'type': 'object', 'additionalProperties': False, 'propertyNames': {'oneOf': [{'format': 'python-module-name'}, {'const': '*'}]}, 'patternProperties': {'^.*$': {'type': 'array', 'items': {'type': 'string'}}}}, 'include-package-data': {'$$description': ['Automatically include any data files inside the package directories', 'that are specified by ``MANIFEST.in``', 'For more information on how to include data files, check ``setuptools`` `docs', '`_.'], 'type': 'boolean'}, 'exclude-package-data': {'$$description': ['Mapping from package names to lists of glob patterns that should be excluded', 'For more information on how to include data files, check ``setuptools`` `docs', '`_.'], 'type': 'object', 'additionalProperties': False, 'propertyNames': {'oneOf': [{'format': 'python-module-name'}, {'const': '*'}]}, 'patternProperties': {'^.*$': {'type': 'array', 'items': {'type': 'string'}}}}, 'namespace-packages': {'type': 'array', 'items': {'type': 'string', 'format': 'python-module-name'}, '$comment': 'https://setuptools.pypa.io/en/latest/userguide/package_discovery.html'}, 'py-modules': {'description': 'Modules that setuptools will manipulate', 'type': 'array', 'items': {'type': 'string', 'format': 'python-module-name'}, '$comment': 'TODO: clarify the relationship with ``packages``'}, 'data-files': {'$$description': ['**DEPRECATED**: dict-like structure where each key represents a directory and', 'the value is a list of glob patterns that should be installed in them.', "Please notice this don't work with wheels. See `data files support", '`_'], 'type': 'object', 'patternProperties': {'^.*$': {'type': 'array', 'items': {'type': 'string'}}}}, 'cmdclass': {'$$description': ['Mapping of distutils-style command names to ``setuptools.Command`` subclasses', 'which in turn should be represented by strings with a qualified class name', '(i.e., "dotted" form with module), e.g.::\n\n', '    cmdclass = {mycmd = "pkg.subpkg.module.CommandClass"}\n\n', 'The command class should be a directly defined at the top-level of the', 'containing module (no class nesting).'], 'type': 'object', 'patternProperties': {'^.*$': {'type': 'string', 'format': 'python-qualified-identifier'}}}, 'license-files': {'type': 'array', 'items': {'type': 'string'}, '$$description': ['PROVISIONAL: List of glob patterns for all license files being distributed.', '(might become standard with PEP 639).', "By default: ``['LICEN[CS]E*', 'COPYING*', 'NOTICE*', 'AUTHORS*']``"], '$comment': 'TODO: revise if PEP 639 is accepted. Probably ``project.license-files``?'}, 'dynamic': {'type': 'object', 'description': 'Instructions for loading :pep:`621`-related metadata dynamically', 'additionalProperties': False, 'properties': {'version': {'$$description': ['A version dynamically loaded via either the ``attr:`` or ``file:``', 'directives. Please make sure the given file or attribute respects :pep:`440`.'], 'oneOf': [{'title': "'attr:' directive", '$id': '#/definitions/attr-directive', '$$description': ['Value is read from a module attribute. Supports callables and iterables;', 'unsupported types are cast via ``str()``'], 'type': 'object', 'additionalProperties': False, 'properties': {'attr': {'type': 'string'}}, 'required': ['attr']}, {'$id': '#/definitions/file-directive', 'title': "'file:' directive", 'description': 'Value is read from a file (or list of files and then concatenated)', 'type': 'object', 'additionalProperties': False, 'properties': {'file': {'oneOf': [{'type': 'string'}, {'type': 'array', 'items': {'type': 'string'}}]}}, 'required': ['file']}]}, 'classifiers': {'$id': '#/definitions/file-directive', 'title': "'file:' directive", 'description': 'Value is read from a file (or list of files and then concatenated)', 'type': 'object', 'additionalProperties': False, 'properties': {'file': {'oneOf': [{'type': 'string'}, {'type': 'array', 'items': {'type': 'string'}}]}}, 'required': ['file']}, 'description': {'$id': '#/definitions/file-directive', 'title': "'file:' directive", 'description': 'Value is read from a file (or list of files and then concatenated)', 'type': 'object', 'additionalProperties': False, 'properties': {'file': {'oneOf': [{'type': 'string'}, {'type': 'array', 'items': {'type': 'string'}}]}}, 'required': ['file']}, 'dependencies': {'$id': '#/definitions/file-directive', 'title': "'file:' directive", 'description': 'Value is read from a file (or list of files and then concatenated)', 'type': 'object', 'additionalProperties': False, 'properties': {'file': {'oneOf': [{'type': 'string'}, {'type': 'array', 'items': {'type': 'string'}}]}}, 'required': ['file']}, 'entry-points': {'$id': '#/definitions/file-directive', 'title': "'file:' directive", 'description': 'Value is read from a file (or list of files and then concatenated)', 'type': 'object', 'additionalProperties': False, 'properties': {'file': {'oneOf': [{'type': 'string'}, {'type': 'array', 'items': {'type': 'string'}}]}}, 'required': ['file']}, 'optional-dependencies': {'type': 'object', 'propertyNames': {'format': 'python-identifier'}, 'additionalProperties': False, 'patternProperties': {'.+': {'$id': '#/definitions/file-directive', 'title': "'file:' directive", 'description': 'Value is read from a file (or list of files and then concatenated)', 'type': 'object', 'additionalProperties': False, 'properties': {'file': {'oneOf': [{'type': 'string'}, {'type': 'array', 'items': {'type': 'string'}}]}}, 'required': ['file']}}}, 'readme': {'anyOf': [{'$id': '#/definitions/file-directive', 'title': "'file:' directive", 'description': 'Value is read from a file (or list of files and then concatenated)', 'type': 'object', 'additionalProperties': False, 'properties': {'file': {'oneOf': [{'type': 'string'}, {'type': 'array', 'items': {'type': 'string'}}]}}, 'required': ['file']}, {'properties': {'content-type': {'type': 'string'}}}], 'required': ['file']}}}}, 'definitions': {'package-name': {'$id': '#/definitions/package-name', 'title': 'Valid package name', 'description': 'Valid package name (importable or PEP 561).', 'type': 'string', 'anyOf': [{'format': 'python-module-name'}, {'format': 'pep561-stub-name'}]}, 'file-directive': {'$id': '#/definitions/file-directive', 'title': "'file:' directive", 'description': 'Value is read from a file (or list of files and then concatenated)', 'type': 'object', 'additionalProperties': False, 'properties': {'file': {'oneOf': [{'type': 'string'}, {'type': 'array', 'items': {'type': 'string'}}]}}, 'required': ['file']}, 'attr-directive': {'title': "'attr:' directive", '$id': '#/definitions/attr-directive', '$$description': ['Value is read from a module attribute. Supports callables and iterables;', 'unsupported types are cast via ``str()``'], 'type': 'object', 'additionalProperties': False, 'properties': {'attr': {'type': 'string'}}, 'required': ['attr']}, 'find-directive': {'$id': '#/definitions/find-directive', 'title': "'find:' directive", 'type': 'object', 'additionalProperties': False, 'properties': {'find': {'type': 'object', '$$description': ['Dynamic `package discovery', '`_.'], 'additionalProperties': False, 'properties': {'where': {'description': 'Directories to be searched for packages (Unix-style relative path)', 'type': 'array', 'items': {'type': 'string'}}, 'exclude': {'type': 'array', '$$description': ['Exclude packages that match the values listed in this field.', "Can container shell-style wildcards (e.g. ``'pkg.*'``)"], 'items': {'type': 'string'}}, 'include': {'type': 'array', '$$description': ['Restrict the found packages to just the ones listed in this field.', "Can container shell-style wildcards (e.g. ``'pkg.*'``)"], 'items': {'type': 'string'}}, 'namespaces': {'type': 'boolean', '$$description': ['When ``True``, directories without a ``__init__.py`` file will also', 'be scanned for :pep:`420`-style implicit namespaces']}}}}}}}, rule='type')
        data_is_dict = isinstance(data, dict)
        if data_is_dict:
            data_keys = set(data.keys())
            if "platforms" in data_keys:
                data_keys.remove("platforms")
                data__platforms = data["platforms"]
                if not isinstance(data__platforms, (list, tuple)):
                    raise JsonSchemaValueException("" + (name_prefix or "data") + ".platforms must be array", value=data__platforms, name="" + (name_prefix or "data") + ".platforms", definition={'type': 'array', 'items': {'type': 'string'}}, rule='type')
                data__platforms_is_list = isinstance(data__platforms, (list, tuple))
                if data__platforms_is_list:
                    data__platforms_len = len(data__platforms)
                    for data__platforms_x, data__platforms_item in enumerate(data__platforms):
                        if not isinstance(data__platforms_item, (str)):
                            raise JsonSchemaValueException("" + (name_prefix or "data") + ".platforms[{data__platforms_x}]".format(**locals()) + " must be string", value=data__platforms_item, name="" + (name_prefix or "data") + ".platforms[{data__platforms_x}]".format(**locals()) + "", definition={'type': 'string'}, rule='type')
            if "provides" in data_keys:
                data_keys.remove("provides")
                data__provides = data["provides"]
                if not isinstance(data__provides, (list, tuple)):
                    raise JsonSchemaValueException("" + (name_prefix or "data") + ".provides must be array", value=data__provides, name="" + (name_prefix or "data") + ".provides", definition={'$$description': ['Package and virtual package names contained within this package', '**(not supported by pip)**'], 'type': 'array', 'items': {'type': 'string', 'format': 'pep508-identifier'}}, rule='type')
                data__provides_is_list = isinstance(data__provides, (list, tuple))
                if data__provides_is_list:
                    data__provides_len = len(data__provides)
                    for data__provides_x, data__provides_item in enumerate(data__provides):
                        if not isinstance(data__provides_item, (str)):
                            raise JsonSchemaValueException("" + (name_prefix or "data") + ".provides[{data__provides_x}]".format(**locals()) + " must be string", value=data__provides_item, name="" + (name_prefix or "data") + ".provides[{data__provides_x}]".format(**locals()) + "", definition={'type': 'string', 'format': 'pep508-identifier'}, rule='type')
                        if isinstance(data__provides_item, str):
                            if not custom_formats["pep508-identifier"](data__provides_item):
                                raise JsonSchemaValueException("" + (name_prefix or "data") + ".provides[{data__provides_x}]".format(**locals()) + " must be pep508-identifier", value=data__provides_item, name="" + (name_prefix or "data") + ".provides[{data__provides_x}]".format(**locals()) + "", definition={'type': 'string', 'format': 'pep508-identifier'}, rule='format')
            if "obsoletes" in data_keys:
                data_keys.remove("obsoletes")
                data__obsoletes = data["obsoletes"]
                if not isinstance(data__obsoletes, (list, tuple)):
                    raise JsonSchemaValueException("" + (name_prefix or "data") + ".obsoletes must be array", value=data__obsoletes, name="" + (name_prefix or "data") + ".obsoletes", definition={'$$description': ['Packages which this package renders obsolete', '**(not supported by pip)**'], 'type': 'array', 'items': {'type': 'string', 'format': 'pep508-identifier'}}, rule='type')
                data__obsoletes_is_list = isinstance(data__obsoletes, (list, tuple))
                if data__obsoletes_is_list:
                    data__obsoletes_len = len(data__obsoletes)
                    for data__obsoletes_x, data__obsoletes_item in enumerate(data__obsoletes):
                        if not isinstance(data__obsoletes_item, (str)):
                            raise JsonSchemaValueException("" + (name_prefix or "data") + ".obsoletes[{data__obsoletes_x}]".format(**locals()) + " must be string", value=data__obsoletes_item, name="" + (name_prefix or "data") + ".obsoletes[{data__obsoletes_x}]".format(**locals()) + "", definition={'type': 'string', 'format': 'pep508-identifier'}, rule='type')
                        if isinstance(data__obsoletes_item, str):
                            if not custom_formats["pep508-identifier"](data__obsoletes_item):
                                raise JsonSchemaValueException("" + (name_prefix or "data") + ".obsoletes[{data__obsoletes_x}]".format(**locals()) + " must be pep508-identifier", value=data__obsoletes_item, name="" + (name_prefix or "data") + ".obsoletes[{data__obsoletes_x}]".format(**locals()) + "", definition={'type': 'string', 'format': 'pep508-identifier'}, rule='format')
            if "zip-safe" in data_keys:
                data_keys.remove("zip-safe")
                data__zipsafe = data["zip-safe"]
                if not isinstance(data__zipsafe, (bool)):
                    raise JsonSchemaValueException("" + (name_prefix or "data") + ".zip-safe must be boolean", value=data__zipsafe, name="" + (name_prefix or "data") + ".zip-safe", definition={'description': 'Whether the project can be safely installed and run from a zip file.', 'type': 'boolean'}, rule='type')
            if "script-files" in data_keys:
                data_keys.remove("script-files")
                data__scriptfiles = data["script-files"]
                if not isinstance(data__scriptfiles, (list, tuple)):
                    raise JsonSchemaValueException("" + (name_prefix or "data") + ".script-files must be array", value=data__scriptfiles, name="" + (name_prefix or "data") + ".script-files", definition={'description': 'Legacy way of defining scripts (entry-points are preferred).', 'type': 'array', 'items': {'type': 'string'}, '$comment': 'TODO: is this field deprecated/should be removed?'}, rule='type')
                data__scriptfiles_is_list = isinstance(data__scriptfiles, (list, tuple))
                if data__scriptfiles_is_list:
                    data__scriptfiles_len = len(data__scriptfiles)
                    for data__scriptfiles_x, data__scriptfiles_item in enumerate(data__scriptfiles):
                        if not isinstance(data__scriptfiles_item, (str)):
                            raise JsonSchemaValueException("" + (name_prefix or "data") + ".script-files[{data__scriptfiles_x}]".format(**locals()) + " must be string", value=data__scriptfiles_item, name="" + (name_prefix or "data") + ".script-files[{data__scriptfiles_x}]".format(**locals()) + "", definition={'type': 'string'}, rule='type')
            if "eager-resources" in data_keys:
                data_keys.remove("eager-resources")
                data__eagerresources = data["eager-resources"]
                if not isinstance(data__eagerresources, (list, tuple)):
                    raise JsonSchemaValueException("" + (name_prefix or "data") + ".eager-resources must be array", value=data__eagerresources, name="" + (name_prefix or "data") + ".eager-resources", definition={'$$description': ['Resources that should be extracted together, if any of them is needed,', 'or if any C extensions included in the project are imported.'], 'type': 'array', 'items': {'type': 'string'}}, rule='type')
                data__eagerresources_is_list = isinstance(data__eagerresources, (list, tuple))
                if data__eagerresources_is_list:
                    data__eagerresources_len = len(data__eagerresources)
                    for data__eagerresources_x, data__eagerresources_item in enumerate(data__eagerresources):
                        if not isinstance(data__eagerresources_item, (str)):
                            raise JsonSchemaValueException("" + (name_prefix or "data") + ".eager-resources[{data__eagerresources_x}]".format(**locals()) + " must be string", value=data__eagerresources_item, name="" + (name_prefix or "data") + ".eager-resources[{data__eagerresources_x}]".format(**locals()) + "", definition={'type': 'string'}, rule='type')
            if "packages" in data_keys:
                data_keys.remove("packages")
                data__packages = data["packages"]
                data__packages_one_of_count1 = 0
                if data__packages_one_of_count1 < 2:
                    try:
                        if not isinstance(data__packages, (list, tuple)):
                            raise JsonSchemaValueException("" + (name_prefix or "data") + ".packages must be array", value=data__packages, name="" + (name_prefix or "data") + ".packages", definition={'title': 'Array of Python package identifiers', 'type': 'array', 'items': {'$id': '#/definitions/package-name', 'title': 'Valid package name', 'description': 'Valid package name (importable or PEP 561).', 'type': 'string', 'anyOf': [{'format': 'python-module-name'}, {'format': 'pep561-stub-name'}]}}, rule='type')
                        data__packages_is_list = isinstance(data__packages, (list, tuple))
                        if data__packages_is_list:
                            data__packages_len = len(data__packages)
                            for data__packages_x, data__packages_item in enumerate(data__packages):
                                validate_https___setuptools_pypa_io_en_latest_references_keywords_html__definitions_package_name(data__packages_item, custom_formats, (name_prefix or "data") + ".packages[{data__packages_x}]".format(**locals()))
                        data__packages_one_of_count1 += 1
                    except JsonSchemaValueException: pass
                if data__packages_one_of_count1 < 2:
                    try:
                        validate_https___setuptools_pypa_io_en_latest_references_keywords_html__definitions_find_directive(data__packages, custom_formats, (name_prefix or "data") + ".packages")
                        data__packages_one_of_count1 += 1
                    except JsonSchemaValueException: pass
                if data__packages_one_of_count1 != 1:
                    raise JsonSchemaValueException("" + (name_prefix or "data") + ".packages must be valid exactly by one definition" + (" (" + str(data__packages_one_of_count1) + " matches found)"), value=data__packages, name="" + (name_prefix or "data") + ".packages", definition={'$$description': ['Packages that should be included in the distribution.', 'It can be given either as a list of package identifiers', 'or as a ``dict``-like structure with a single key ``find``', 'which corresponds to a dynamic call to', '``setuptools.config.expand.find_packages`` function.', 'The ``find`` key is associated with a nested ``dict``-like structure that can', 'contain ``where``, ``include``, ``exclude`` and ``namespaces`` keys,', 'mimicking the keyword arguments of the associated function.'], 'oneOf': [{'title': 'Array of Python package identifiers', 'type': 'array', 'items': {'$id': '#/definitions/package-name', 'title': 'Valid package name', 'description': 'Valid package name (importable or PEP 561).', 'type': 'string', 'anyOf': [{'format': 'python-module-name'}, {'format': 'pep561-stub-name'}]}}, {'$id': '#/definitions/find-directive', 'title': "'find:' directive", 'type': 'object', 'additionalProperties': False, 'properties': {'find': {'type': 'object', '$$description': ['Dynamic `package discovery', '`_.'], 'additionalProperties': False, 'properties': {'where': {'description': 'Directories to be searched for packages (Unix-style relative path)', 'type': 'array', 'items': {'type': 'string'}}, 'exclude': {'type': 'array', '$$description': ['Exclude packages that match the values listed in this field.', "Can container shell-style wildcards (e.g. ``'pkg.*'``)"], 'items': {'type': 'string'}}, 'include': {'type': 'array', '$$description': ['Restrict the found packages to just the ones listed in this field.', "Can container shell-style wildcards (e.g. ``'pkg.*'``)"], 'items': {'type': 'string'}}, 'namespaces': {'type': 'boolean', '$$description': ['When ``True``, directories without a ``__init__.py`` file will also', 'be scanned for :pep:`420`-style implicit namespaces']}}}}}]}, rule='oneOf')
            if "package-dir" in data_keys:
                data_keys.remove("package-dir")
                data__packagedir = data["package-dir"]
                if not isinstance(data__packagedir, (dict)):
                    raise JsonSchemaValueException("" + (name_prefix or "data") + ".package-dir must be object", value=data__packagedir, name="" + (name_prefix or "data") + ".package-dir", definition={'$$description': [':class:`dict`-like structure mapping from package names to directories where their', 'code can be found.', 'The empty string (as key) means that all packages are contained inside', 'the given directory will be included in the distribution.'], 'type': 'object', 'additionalProperties': False, 'propertyNames': {'oneOf': [{'const': ''}, {'$id': '#/definitions/package-name', 'title': 'Valid package name', 'description': 'Valid package name (importable or PEP 561).', 'type': 'string', 'anyOf': [{'format': 'python-module-name'}, {'format': 'pep561-stub-name'}]}]}, 'patternProperties': {'^.*$': {'type': 'string'}}}, rule='type')
                data__packagedir_is_dict = isinstance(data__packagedir, dict)
                if data__packagedir_is_dict:
                    data__packagedir_keys = set(data__packagedir.keys())
                    for data__packagedir_key, data__packagedir_val in data__packagedir.items():
                        if REGEX_PATTERNS['^.*$'].search(data__packagedir_key):
                            if data__packagedir_key in data__packagedir_keys:
                                data__packagedir_keys.remove(data__packagedir_key)
                            if not isinstance(data__packagedir_val, (str)):
                                raise JsonSchemaValueException("" + (name_prefix or "data") + ".package-dir.{data__packagedir_key}".format(**locals()) + " must be string", value=data__packagedir_val, name="" + (name_prefix or "data") + ".package-dir.{data__packagedir_key}".format(**locals()) + "", definition={'type': 'string'}, rule='type')
                    if data__packagedir_keys:
                        raise JsonSchemaValueException("" + (name_prefix or "data") + ".package-dir must not contain "+str(data__packagedir_keys)+" properties", value=data__packagedir, name="" + (name_prefix or "data") + ".package-dir", definition={'$$description': [':class:`dict`-like structure mapping from package names to directories where their', 'code can be found.', 'The empty string (as key) means that all packages are contained inside', 'the given directory will be included in the distribution.'], 'type': 'object', 'additionalProperties': False, 'propertyNames': {'oneOf': [{'const': ''}, {'$id': '#/definitions/package-name', 'title': 'Valid package name', 'description': 'Valid package name (importable or PEP 561).', 'type': 'string', 'anyOf': [{'format': 'python-module-name'}, {'format': 'pep561-stub-name'}]}]}, 'patternProperties': {'^.*$': {'type': 'string'}}}, rule='additionalProperties')
                    data__packagedir_len = len(data__packagedir)
                    if data__packagedir_len != 0:
                        data__packagedir_property_names = True
                        for data__packagedir_key in data__packagedir:
                            try:
                                data__packagedir_key_one_of_count2 = 0
                                if data__packagedir_key_one_of_count2 < 2:
                                    try:
                                        if data__packagedir_key != "":
                                            raise JsonSchemaValueException("" + (name_prefix or "data") + ".package-dir must be same as const definition: ", value=data__packagedir_key, name="" + (name_prefix or "data") + ".package-dir", definition={'const': ''}, rule='const')
                                        data__packagedir_key_one_of_count2 += 1
                                    except JsonSchemaValueException: pass
                                if data__packagedir_key_one_of_count2 < 2:
                                    try:
                                        validate_https___setuptools_pypa_io_en_latest_references_keywords_html__definitions_package_name(data__packagedir_key, custom_formats, (name_prefix or "data") + ".package-dir")
                                        data__packagedir_key_one_of_count2 += 1
                                    except JsonSchemaValueException: pass
                                if data__packagedir_key_one_of_count2 != 1:
                                    raise JsonSchemaValueException("" + (name_prefix or "data") + ".package-dir must be valid exactly by one definition" + (" (" + str(data__packagedir_key_one_of_count2) + " matches found)"), value=data__packagedir_key, name="" + (name_prefix or "data") + ".package-dir", definition={'oneOf': [{'const': ''}, {'$id': '#/definitions/package-name', 'title': 'Valid package name', 'description': 'Valid package name (importable or PEP 561).', 'type': 'string', 'anyOf': [{'format': 'python-module-name'}, {'format': 'pep561-stub-name'}]}]}, rule='oneOf')
                            except JsonSchemaValueException:
                                data__packagedir_property_names = False
                        if not data__packagedir_property_names:
                            raise JsonSchemaValueException("" + (name_prefix or "data") + ".package-dir must be named by propertyName definition", value=data__packagedir, name="" + (name_prefix or "data") + ".package-dir", definition={'$$description': [':class:`dict`-like structure mapping from package names to directories where their', 'code can be found.', 'The empty string (as key) means that all packages are contained inside', 'the given directory will be included in the distribution.'], 'type': 'object', 'additionalProperties': False, 'propertyNames': {'oneOf': [{'const': ''}, {'$id': '#/definitions/package-name', 'title': 'Valid package name', 'description': 'Valid package name (importable or PEP 561).', 'type': 'string', 'anyOf': [{'format': 'python-module-name'}, {'format': 'pep561-stub-name'}]}]}, 'patternProperties': {'^.*$': {'type': 'string'}}}, rule='propertyNames')
            if "package-data" in data_keys:
                data_keys.remove("package-data")
                data__packagedata = data["package-data"]
                if not isinstance(data__packagedata, (dict)):
                    raise JsonSchemaValueException("" + (name_prefix or "data") + ".package-data must be object", value=data__packagedata, name="" + (name_prefix or "data") + ".package-data", definition={'$$description': ['Mapping from package names to lists of glob patterns.', 'Usually this option is not needed when using ``include-package-data = true``', 'For more information on how to include data files, check ``setuptools`` `docs', '`_.'], 'type': 'object', 'additionalProperties': False, 'propertyNames': {'oneOf': [{'format': 'python-module-name'}, {'const': '*'}]}, 'patternProperties': {'^.*$': {'type': 'array', 'items': {'type': 'string'}}}}, rule='type')
                data__packagedata_is_dict = isinstance(data__packagedata, dict)
                if data__packagedata_is_dict:
                    data__packagedata_keys = set(data__packagedata.keys())
                    for data__packagedata_key, data__packagedata_val in data__packagedata.items():
                        if REGEX_PATTERNS['^.*$'].search(data__packagedata_key):
                            if data__packagedata_key in data__packagedata_keys:
                                data__packagedata_keys.remove(data__packagedata_key)
                            if not isinstance(data__packagedata_val, (list, tuple)):
                                raise JsonSchemaValueException("" + (name_prefix or "data") + ".package-data.{data__packagedata_key}".format(**locals()) + " must be array", value=data__packagedata_val, name="" + (name_prefix or "data") + ".package-data.{data__packagedata_key}".format(**locals()) + "", definition={'type': 'array', 'items': {'type': 'string'}}, rule='type')
                            data__packagedata_val_is_list = isinstance(data__packagedata_val, (list, tuple))
                            if data__packagedata_val_is_list:
                                data__packagedata_val_len = len(data__packagedata_val)
                                for data__packagedata_val_x, data__packagedata_val_item in enumerate(data__packagedata_val):
                                    if not isinstance(data__packagedata_val_item, (str)):
                                        raise JsonSchemaValueException("" + (name_prefix or "data") + ".package-data.{data__packagedata_key}[{data__packagedata_val_x}]".format(**locals()) + " must be string", value=data__packagedata_val_item, name="" + (name_prefix or "data") + ".package-data.{data__packagedata_key}[{data__packagedata_val_x}]".format(**locals()) + "", definition={'type': 'string'}, rule='type')
                    if data__packagedata_keys:
                        raise JsonSchemaValueException("" + (name_prefix or "data") + ".package-data must not contain "+str(data__packagedata_keys)+" properties", value=data__packagedata, name="" + (name_prefix or "data") + ".package-data", definition={'$$description': ['Mapping from package names to lists of glob patterns.', 'Usually this option is not needed when using ``include-package-data = true``', 'For more information on how to include data files, check ``setuptools`` `docs', '`_.'], 'type': 'object', 'additionalProperties': False, 'propertyNames': {'oneOf': [{'format': 'python-module-name'}, {'const': '*'}]}, 'patternProperties': {'^.*$': {'type': 'array', 'items': {'type': 'string'}}}}, rule='additionalProperties')
                    data__packagedata_len = len(data__packagedata)
                    if data__packagedata_len != 0:
                        data__packagedata_property_names = True
                        for data__packagedata_key in data__packagedata:
                            try:
                                data__packagedata_key_one_of_count3 = 0
                                if data__packagedata_key_one_of_count3 < 2:
                                    try:
                                        if isinstance(data__packagedata_key, str):
                                            if not custom_formats["python-module-name"](data__packagedata_key):
                                                raise JsonSchemaValueException("" + (name_prefix or "data") + ".package-data must be python-module-name", value=data__packagedata_key, name="" + (name_prefix or "data") + ".package-data", definition={'format': 'python-module-name'}, rule='format')
                                        data__packagedata_key_one_of_count3 += 1
                                    except JsonSchemaValueException: pass
                                if data__packagedata_key_one_of_count3 < 2:
                                    try:
                                        if data__packagedata_key != "*":
                                            raise JsonSchemaValueException("" + (name_prefix or "data") + ".package-data must be same as const definition: *", value=data__packagedata_key, name="" + (name_prefix or "data") + ".package-data", definition={'const': '*'}, rule='const')
                                        data__packagedata_key_one_of_count3 += 1
                                    except JsonSchemaValueException: pass
                                if data__packagedata_key_one_of_count3 != 1:
                                    raise JsonSchemaValueException("" + (name_prefix or "data") + ".package-data must be valid exactly by one definition" + (" (" + str(data__packagedata_key_one_of_count3) + " matches found)"), value=data__packagedata_key, name="" + (name_prefix or "data") + ".package-data", definition={'oneOf': [{'format': 'python-module-name'}, {'const': '*'}]}, rule='oneOf')
                            except JsonSchemaValueException:
                                data__packagedata_property_names = False
                        if not data__packagedata_property_names:
                            raise JsonSchemaValueException("" + (name_prefix or "data") + ".package-data must be named by propertyName definition", value=data__packagedata, name="" + (name_prefix or "data") + ".package-data", definition={'$$description': ['Mapping from package names to lists of glob patterns.', 'Usually this option is not needed when using ``include-package-data = true``', 'For more information on how to include data files, check ``setuptools`` `docs', '`_.'], 'type': 'object', 'additionalProperties': False, 'propertyNames': {'oneOf': [{'format': 'python-module-name'}, {'const': '*'}]}, 'patternProperties': {'^.*$': {'type': 'array', 'items': {'type': 'string'}}}}, rule='propertyNames')
            if "include-package-data" in data_keys:
                data_keys.remove("include-package-data")
                data__includepackagedata = data["include-package-data"]
                if not isinstance(data__includepackagedata, (bool)):
                    raise JsonSchemaValueException("" + (name_prefix or "data") + ".include-package-data must be boolean", value=data__includepackagedata, name="" + (name_prefix or "data") + ".include-package-data", definition={'$$description': ['Automatically include any data files inside the package directories', 'that are specified by ``MANIFEST.in``', 'For more information on how to include data files, check ``setuptools`` `docs', '`_.'], 'type': 'boolean'}, rule='type')
            if "exclude-package-data" in data_keys:
                data_keys.remove("exclude-package-data")
                data__excludepackagedata = data["exclude-package-data"]
                if not isinstance(data__excludepackagedata, (dict)):
                    raise JsonSchemaValueException("" + (name_prefix or "data") + ".exclude-package-data must be object", value=data__excludepackagedata, name="" + (name_prefix or "data") + ".exclude-package-data", definition={'$$description': ['Mapping from package names to lists of glob patterns that should be excluded', 'For more information on how to include data files, check ``setuptools`` `docs', '`_.'], 'type': 'object', 'additionalProperties': False, 'propertyNames': {'oneOf': [{'format': 'python-module-name'}, {'const': '*'}]}, 'patternProperties': {'^.*$': {'type': 'array', 'items': {'type': 'string'}}}}, rule='type')
                data__excludepackagedata_is_dict = isinstance(data__excludepackagedata, dict)
                if data__excludepackagedata_is_dict:
                    data__excludepackagedata_keys = set(data__excludepackagedata.keys())
                    for data__excludepackagedata_key, data__excludepackagedata_val in data__excludepackagedata.items():
                        if REGEX_PATTERNS['^.*$'].search(data__excludepackagedata_key):
                            if data__excludepackagedata_key in data__excludepackagedata_keys:
                                data__excludepackagedata_keys.remove(data__excludepackagedata_key)
                            if not isinstance(data__excludepackagedata_val, (list, tuple)):
                                raise JsonSchemaValueException("" + (name_prefix or "data") + ".exclude-package-data.{data__excludepackagedata_key}".format(**locals()) + " must be array", value=data__excludepackagedata_val, name="" + (name_prefix or "data") + ".exclude-package-data.{data__excludepackagedata_key}".format(**locals()) + "", definition={'type': 'array', 'items': {'type': 'string'}}, rule='type')
                            data__excludepackagedata_val_is_list = isinstance(data__excludepackagedata_val, (list, tuple))
                            if data__excludepackagedata_val_is_list:
                                data__excludepackagedata_val_len = len(data__excludepackagedata_val)
                                for data__excludepackagedata_val_x, data__excludepackagedata_val_item in enumerate(data__excludepackagedata_val):
                                    if not isinstance(data__excludepackagedata_val_item, (str)):
                                        raise JsonSchemaValueException("" + (name_prefix or "data") + ".exclude-package-data.{data__excludepackagedata_key}[{data__excludepackagedata_val_x}]".format(**locals()) + " must be string", value=data__excludepackagedata_val_item, name="" + (name_prefix or "data") + ".exclude-package-data.{data__excludepackagedata_key}[{data__excludepackagedata_val_x}]".format(**locals()) + "", definition={'type': 'string'}, rule='type')
                    if data__excludepackagedata_keys:
                        raise JsonSchemaValueException("" + (name_prefix or "data") + ".exclude-package-data must not contain "+str(data__excludepackagedata_keys)+" properties", value=data__excludepackagedata, name="" + (name_prefix or "data") + ".exclude-package-data", definition={'$$description': ['Mapping from package names to lists of glob patterns that should be excluded', 'For more information on how to include data files, check ``setuptools`` `docs', '`_.'], 'type': 'object', 'additionalProperties': False, 'propertyNames': {'oneOf': [{'format': 'python-module-name'}, {'const': '*'}]}, 'patternProperties': {'^.*$': {'type': 'array', 'items': {'type': 'string'}}}}, rule='additionalProperties')
                    data__excludepackagedata_len = len(data__excludepackagedata)
                    if data__excludepackagedata_len != 0:
                        data__excludepackagedata_property_names = True
                        for data__excludepackagedata_key in data__excludepackagedata:
                            try:
                                data__excludepackagedata_key_one_of_count4 = 0
                                if data__excludepackagedata_key_one_of_count4 < 2:
                                    try:
                                        if isinstance(data__excludepackagedata_key, str):
                                            if not custom_formats["python-module-name"](data__excludepackagedata_key):
                                                raise JsonSchemaValueException("" + (name_prefix or "data") + ".exclude-package-data must be python-module-name", value=data__excludepackagedata_key, name="" + (name_prefix or "data") + ".exclude-package-data", definition={'format': 'python-module-name'}, rule='format')
                                        data__excludepackagedata_key_one_of_count4 += 1
                                    except JsonSchemaValueException: pass
                                if data__excludepackagedata_key_one_of_count4 < 2:
                                    try:
                                        if data__excludepackagedata_key != "*":
                                            raise JsonSchemaValueException("" + (name_prefix or "data") + ".exclude-package-data must be same as const definition: *", value=data__excludepackagedata_key, name="" + (name_prefix or "data") + ".exclude-package-data", definition={'const': '*'}, rule='const')
                                        data__excludepackagedata_key_one_of_count4 += 1
                                    except JsonSchemaValueException: pass
                                if data__excludepackagedata_key_one_of_count4 != 1:
                                    raise JsonSchemaValueException("" + (name_prefix or "data") + ".exclude-package-data must be valid exactly by one definition" + (" (" + str(data__excludepackagedata_key_one_of_count4) + " matches found)"), value=data__excludepackagedata_key, name="" + (name_prefix or "data") + ".exclude-package-data", definition={'oneOf': [{'format': 'python-module-name'}, {'const': '*'}]}, rule='oneOf')
                            except JsonSchemaValueException:
                                data__excludepackagedata_property_names = False
                        if not data__excludepackagedata_property_names:
                            raise JsonSchemaValueException("" + (name_prefix or "data") + ".exclude-package-data must be named by propertyName definition", value=data__excludepackagedata, name="" + (name_prefix or "data") + ".exclude-package-data", definition={'$$description': ['Mapping from package names to lists of glob patterns that should be excluded', 'For more information on how to include data files, check ``setuptools`` `docs', '`_.'], 'type': 'object', 'additionalProperties': False, 'propertyNames': {'oneOf': [{'format': 'python-module-name'}, {'const': '*'}]}, 'patternProperties': {'^.*$': {'type': 'array', 'items': {'type': 'string'}}}}, rule='propertyNames')
            if "namespace-packages" in data_keys:
                data_keys.remove("namespace-packages")
                data__namespacepackages = data["namespace-packages"]
                if not isinstance(data__namespacepackages, (list, tuple)):
                    raise JsonSchemaValueException("" + (name_prefix or "data") + ".namespace-packages must be array", value=data__namespacepackages, name="" + (name_prefix or "data") + ".namespace-packages", definition={'type': 'array', 'items': {'type': 'string', 'format': 'python-module-name'}, '$comment': 'https://setuptools.pypa.io/en/latest/userguide/package_discovery.html'}, rule='type')
                data__namespacepackages_is_list = isinstance(data__namespacepackages, (list, tuple))
                if data__namespacepackages_is_list:
                    data__namespacepackages_len = len(data__namespacepackages)
                    for data__namespacepackages_x, data__namespacepackages_item in enumerate(data__namespacepackages):
                        if not isinstance(data__namespacepackages_item, (str)):
                            raise JsonSchemaValueException("" + (name_prefix or "data") + ".namespace-packages[{data__namespacepackages_x}]".format(**locals()) + " must be string", value=data__namespacepackages_item, name="" + (name_prefix or "data") + ".namespace-packages[{data__namespacepackages_x}]".format(**locals()) + "", definition={'type': 'string', 'format': 'python-module-name'}, rule='type')
                        if isinstance(data__namespacepackages_item, str):
                            if not custom_formats["python-module-name"](data__namespacepackages_item):
                                raise JsonSchemaValueException("" + (name_prefix or "data") + ".namespace-packages[{data__namespacepackages_x}]".format(**locals()) + " must be python-module-name", value=data__namespacepackages_item, name="" + (name_prefix or "data") + ".namespace-packages[{data__namespacepackages_x}]".format(**locals()) + "", definition={'type': 'string', 'format': 'python-module-name'}, rule='format')
            if "py-modules" in data_keys:
                data_keys.remove("py-modules")
                data__pymodules = data["py-modules"]
                if not isinstance(data__pymodules, (list, tuple)):
                    raise JsonSchemaValueException("" + (name_prefix or "data") + ".py-modules must be array", value=data__pymodules, name="" + (name_prefix or "data") + ".py-modules", definition={'description': 'Modules that setuptools will manipulate', 'type': 'array', 'items': {'type': 'string', 'format': 'python-module-name'}, '$comment': 'TODO: clarify the relationship with ``packages``'}, rule='type')
                data__pymodules_is_list = isinstance(data__pymodules, (list, tuple))
                if data__pymodules_is_list:
                    data__pymodules_len = len(data__pymodules)
                    for data__pymodules_x, data__pymodules_item in enumerate(data__pymodules):
                        if not isinstance(data__pymodules_item, (str)):
                            raise JsonSchemaValueException("" + (name_prefix or "data") + ".py-modules[{data__pymodules_x}]".format(**locals()) + " must be string", value=data__pymodules_item, name="" + (name_prefix or "data") + ".py-modules[{data__pymodules_x}]".format(**locals()) + "", definition={'type': 'string', 'format': 'python-module-name'}, rule='type')
                        if isinstance(data__pymodules_item, str):
                            if not custom_formats["python-module-name"](data__pymodules_item):
                                raise JsonSchemaValueException("" + (name_prefix or "data") + ".py-modules[{data__pymodules_x}]".format(**locals()) + " must be python-module-name", value=data__pymodules_item, name="" + (name_prefix or "data") + ".py-modules[{data__pymodules_x}]".format(**locals()) + "", definition={'type': 'string', 'format': 'python-module-name'}, rule='format')
            if "data-files" in data_keys:
                data_keys.remove("data-files")
                data__datafiles = data["data-files"]
                if not isinstance(data__datafiles, (dict)):
                    raise JsonSchemaValueException("" + (name_prefix or "data") + ".data-files must be object", value=data__datafiles, name="" + (name_prefix or "data") + ".data-files", definition={'$$description': ['**DEPRECATED**: dict-like structure where each key represents a directory and', 'the value is a list of glob patterns that should be installed in them.', "Please notice this don't work with wheels. See `data files support", '`_'], 'type': 'object', 'patternProperties': {'^.*$': {'type': 'array', 'items': {'type': 'string'}}}}, rule='type')
                data__datafiles_is_dict = isinstance(data__datafiles, dict)
                if data__datafiles_is_dict:
                    data__datafiles_keys = set(data__datafiles.keys())
                    for data__datafiles_key, data__datafiles_val in data__datafiles.items():
                        if REGEX_PATTERNS['^.*$'].search(data__datafiles_key):
                            if data__datafiles_key in data__datafiles_keys:
                                data__datafiles_keys.remove(data__datafiles_key)
                            if not isinstance(data__datafiles_val, (list, tuple)):
                                raise JsonSchemaValueException("" + (name_prefix or "data") + ".data-files.{data__datafiles_key}".format(**locals()) + " must be array", value=data__datafiles_val, name="" + (name_prefix or "data") + ".data-files.{data__datafiles_key}".format(**locals()) + "", definition={'type': 'array', 'items': {'type': 'string'}}, rule='type')
                            data__datafiles_val_is_list = isinstance(data__datafiles_val, (list, tuple))
                            if data__datafiles_val_is_list:
                                data__datafiles_val_len = len(data__datafiles_val)
                                for data__datafiles_val_x, data__datafiles_val_item in enumerate(data__datafiles_val):
                                    if not isinstance(data__datafiles_val_item, (str)):
                                        raise JsonSchemaValueException("" + (name_prefix or "data") + ".data-files.{data__datafiles_key}[{data__datafiles_val_x}]".format(**locals()) + " must be string", value=data__datafiles_val_item, name="" + (name_prefix or "data") + ".data-files.{data__datafiles_key}[{data__datafiles_val_x}]".format(**locals()) + "", definition={'type': 'string'}, rule='type')
            if "cmdclass" in data_keys:
                data_keys.remove("cmdclass")
                data__cmdclass = data["cmdclass"]
                if not isinstance(data__cmdclass, (dict)):
                    raise JsonSchemaValueException("" + (name_prefix or "data") + ".cmdclass must be object", value=data__cmdclass, name="" + (name_prefix or "data") + ".cmdclass", definition={'$$description': ['Mapping of distutils-style command names to ``setuptools.Command`` subclasses', 'which in turn should be represented by strings with a qualified class name', '(i.e., "dotted" form with module), e.g.::\n\n', '    cmdclass = {mycmd = "pkg.subpkg.module.CommandClass"}\n\n', 'The command class should be a directly defined at the top-level of the', 'containing module (no class nesting).'], 'type': 'object', 'patternProperties': {'^.*$': {'type': 'string', 'format': 'python-qualified-identifier'}}}, rule='type')
                data__cmdclass_is_dict = isinstance(data__cmdclass, dict)
                if data__cmdclass_is_dict:
                    data__cmdclass_keys = set(data__cmdclass.keys())
                    for data__cmdclass_key, data__cmdclass_val in data__cmdclass.items():
                        if REGEX_PATTERNS['^.*$'].search(data__cmdclass_key):
                            if data__cmdclass_key in data__cmdclass_keys:
                                data__cmdclass_keys.remove(data__cmdclass_key)
                            if not isinstance(data__cmdclass_val, (str)):
                                raise JsonSchemaValueException("" + (name_prefix or "data") + ".cmdclass.{data__cmdclass_key}".format(**locals()) + " must be string", value=data__cmdclass_val, name="" + (name_prefix or "data") + ".cmdclass.{data__cmdclass_key}".format(**locals()) + "", definition={'type': 'string', 'format': 'python-qualified-identifier'}, rule='type')
                            if isinstance(data__cmdclass_val, str):
                                if not custom_formats["python-qualified-identifier"](data__cmdclass_val):
                                    raise JsonSchemaValueException("" + (name_prefix or "data") + ".cmdclass.{data__cmdclass_key}".format(**locals()) + " must be python-qualified-identifier", value=data__cmdclass_val, name="" + (name_prefix or "data") + ".cmdclass.{data__cmdclass_key}".format(**locals()) + "", definition={'type': 'string', 'format': 'python-qualified-identifier'}, rule='format')
            if "license-files" in data_keys:
                data_keys.remove("license-files")
                data__licensefiles = data["license-files"]
                if not isinstance(data__licensefiles, (list, tuple)):
                    raise JsonSchemaValueException("" + (name_prefix or "data") + ".license-files must be array", value=data__licensefiles, name="" + (name_prefix or "data") + ".license-files", definition={'type': 'array', 'items': {'type': 'string'}, '$$description': ['PROVISIONAL: List of glob patterns for all license files being distributed.', '(might become standard with PEP 639).', "By default: ``['LICEN[CS]E*', 'COPYING*', 'NOTICE*', 'AUTHORS*']``"], '$comment': 'TODO: revise if PEP 639 is accepted. Probably ``project.license-files``?'}, rule='type')
                data__licensefiles_is_list = isinstance(data__licensefiles, (list, tuple))
                if data__licensefiles_is_list:
                    data__licensefiles_len = len(data__licensefiles)
                    for data__licensefiles_x, data__licensefiles_item in enumerate(data__licensefiles):
                        if not isinstance(data__licensefiles_item, (str)):
                            raise JsonSchemaValueException("" + (name_prefix or "data") + ".license-files[{data__licensefiles_x}]".format(**locals()) + " must be string", value=data__licensefiles_item, name="" + (name_prefix or "data") + ".license-files[{data__licensefiles_x}]".format(**locals()) + "", definition={'type': 'string'}, rule='type')
            if "dynamic" in data_keys:
                data_keys.remove("dynamic")
                data__dynamic = data["dynamic"]
                if not isinstance(data__dynamic, (dict)):
                    raise JsonSchemaValueException("" + (name_prefix or "data") + ".dynamic must be object", value=data__dynamic, name="" + (name_prefix or "data") + ".dynamic", definition={'type': 'object', 'description': 'Instructions for loading :pep:`621`-related metadata dynamically', 'additionalProperties': False, 'properties': {'version': {'$$description': ['A version dynamically loaded via either the ``attr:`` or ``file:``', 'directives. Please make sure the given file or attribute respects :pep:`440`.'], 'oneOf': [{'title': "'attr:' directive", '$id': '#/definitions/attr-directive', '$$description': ['Value is read from a module attribute. Supports callables and iterables;', 'unsupported types are cast via ``str()``'], 'type': 'object', 'additionalProperties': False, 'properties': {'attr': {'type': 'string'}}, 'required': ['attr']}, {'$id': '#/definitions/file-directive', 'title': "'file:' directive", 'description': 'Value is read from a file (or list of files and then concatenated)', 'type': 'object', 'additionalProperties': False, 'properties': {'file': {'oneOf': [{'type': 'string'}, {'type': 'array', 'items': {'type': 'string'}}]}}, 'required': ['file']}]}, 'classifiers': {'$id': '#/definitions/file-directive', 'title': "'file:' directive", 'description': 'Value is read from a file (or list of files and then concatenated)', 'type': 'object', 'additionalProperties': False, 'properties': {'file': {'oneOf': [{'type': 'string'}, {'type': 'array', 'items': {'type': 'string'}}]}}, 'required': ['file']}, 'description': {'$id': '#/definitions/file-directive', 'title': "'file:' directive", 'description': 'Value is read from a file (or list of files and then concatenated)', 'type': 'object', 'additionalProperties': False, 'properties': {'file': {'oneOf': [{'type': 'string'}, {'type': 'array', 'items': {'type': 'string'}}]}}, 'required': ['file']}, 'dependencies': {'$id': '#/definitions/file-directive', 'title': "'file:' directive", 'description': 'Value is read from a file (or list of files and then concatenated)', 'type': 'object', 'additionalProperties': False, 'properties': {'file': {'oneOf': [{'type': 'string'}, {'type': 'array', 'items': {'type': 'string'}}]}}, 'required': ['file']}, 'entry-points': {'$id': '#/definitions/file-directive', 'title': "'file:' directive", 'description': 'Value is read from a file (or list of files and then concatenated)', 'type': 'object', 'additionalProperties': False, 'properties': {'file': {'oneOf': [{'type': 'string'}, {'type': 'array', 'items': {'type': 'string'}}]}}, 'required': ['file']}, 'optional-dependencies': {'type': 'object', 'propertyNames': {'format': 'python-identifier'}, 'additionalProperties': False, 'patternProperties': {'.+': {'$id': '#/definitions/file-directive', 'title': "'file:' directive", 'description': 'Value is read from a file (or list of files and then concatenated)', 'type': 'object', 'additionalProperties': False, 'properties': {'file': {'oneOf': [{'type': 'string'}, {'type': 'array', 'items': {'type': 'string'}}]}}, 'required': ['file']}}}, 'readme': {'anyOf': [{'$id': '#/definitions/file-directive', 'title': "'file:' directive", 'description': 'Value is read from a file (or list of files and then concatenated)', 'type': 'object', 'additionalProperties': False, 'properties': {'file': {'oneOf': [{'type': 'string'}, {'type': 'array', 'items': {'type': 'string'}}]}}, 'required': ['file']}, {'properties': {'content-type': {'type': 'string'}}}], 'required': ['file']}}}, rule='type')
                data__dynamic_is_dict = isinstance(data__dynamic, dict)
                if data__dynamic_is_dict:
                    data__dynamic_keys = set(data__dynamic.keys())
                    if "version" in data__dynamic_keys:
                        data__dynamic_keys.remove("version")
                        data__dynamic__version = data__dynamic["version"]
                        data__dynamic__version_one_of_count5 = 0
                        if data__dynamic__version_one_of_count5 < 2:
                            try:
                                validate_https___setuptools_pypa_io_en_latest_references_keywords_html__definitions_attr_directive(data__dynamic__version, custom_formats, (name_prefix or "data") + ".dynamic.version")
                                data__dynamic__version_one_of_count5 += 1
                            except JsonSchemaValueException: pass
                        if data__dynamic__version_one_of_count5 < 2:
                            try:
                                validate_https___setuptools_pypa_io_en_latest_references_keywords_html__definitions_file_directive(data__dynamic__version, custom_formats, (name_prefix or "data") + ".dynamic.version")
                                data__dynamic__version_one_of_count5 += 1
                            except JsonSchemaValueException: pass
                        if data__dynamic__version_one_of_count5 != 1:
                            raise JsonSchemaValueException("" + (name_prefix or "data") + ".dynamic.version must be valid exactly by one definition" + (" (" + str(data__dynamic__version_one_of_count5) + " matches found)"), value=data__dynamic__version, name="" + (name_prefix or "data") + ".dynamic.version", definition={'$$description': ['A version dynamically loaded via either the ``attr:`` or ``file:``', 'directives. Please make sure the given file or attribute respects :pep:`440`.'], 'oneOf': [{'title': "'attr:' directive", '$id': '#/definitions/attr-directive', '$$description': ['Value is read from a module attribute. Supports callables and iterables;', 'unsupported types are cast via ``str()``'], 'type': 'object', 'additionalProperties': False, 'properties': {'attr': {'type': 'string'}}, 'required': ['attr']}, {'$id': '#/definitions/file-directive', 'title': "'file:' directive", 'description': 'Value is read from a file (or list of files and then concatenated)', 'type': 'object', 'additionalProperties': False, 'properties': {'file': {'oneOf': [{'type': 'string'}, {'type': 'array', 'items': {'type': 'string'}}]}}, 'required': ['file']}]}, rule='oneOf')
                    if "classifiers" in data__dynamic_keys:
                        data__dynamic_keys.remove("classifiers")
                        data__dynamic__classifiers = data__dynamic["classifiers"]
                        validate_https___setuptools_pypa_io_en_latest_references_keywords_html__definitions_file_directive(data__dynamic__classifiers, custom_formats, (name_prefix or "data") + ".dynamic.classifiers")
                    if "description" in data__dynamic_keys:
                        data__dynamic_keys.remove("description")
                        data__dynamic__description = data__dynamic["description"]
                        validate_https___setuptools_pypa_io_en_latest_references_keywords_html__definitions_file_directive(data__dynamic__description, custom_formats, (name_prefix or "data") + ".dynamic.description")
                    if "dependencies" in data__dynamic_keys:
                        data__dynamic_keys.remove("dependencies")
                        data__dynamic__dependencies = data__dynamic["dependencies"]
                        validate_https___setuptools_pypa_io_en_latest_references_keywords_html__definitions_file_directive(data__dynamic__dependencies, custom_formats, (name_prefix or "data") + ".dynamic.dependencies")
                    if "entry-points" in data__dynamic_keys:
                        data__dynamic_keys.remove("entry-points")
                        data__dynamic__entrypoints = data__dynamic["entry-points"]
                        validate_https___setuptools_pypa_io_en_latest_references_keywords_html__definitions_file_directive(data__dynamic__entrypoints, custom_formats, (name_prefix or "data") + ".dynamic.entry-points")
                    if "optional-dependencies" in data__dynamic_keys:
                        data__dynamic_keys.remove("optional-dependencies")
                        data__dynamic__optionaldependencies = data__dynamic["optional-dependencies"]
                        if not isinstance(data__dynamic__optionaldependencies, (dict)):
                            raise JsonSchemaValueException("" + (name_prefix or "data") + ".dynamic.optional-dependencies must be object", value=data__dynamic__optionaldependencies, name="" + (name_prefix or "data") + ".dynamic.optional-dependencies", definition={'type': 'object', 'propertyNames': {'format': 'python-identifier'}, 'additionalProperties': False, 'patternProperties': {'.+': {'$id': '#/definitions/file-directive', 'title': "'file:' directive", 'description': 'Value is read from a file (or list of files and then concatenated)', 'type': 'object', 'additionalProperties': False, 'properties': {'file': {'oneOf': [{'type': 'string'}, {'type': 'array', 'items': {'type': 'string'}}]}}, 'required': ['file']}}}, rule='type')
                        data__dynamic__optionaldependencies_is_dict = isinstance(data__dynamic__optionaldependencies, dict)
                        if data__dynamic__optionaldependencies_is_dict:
                            data__dynamic__optionaldependencies_keys = set(data__dynamic__optionaldependencies.keys())
                            for data__dynamic__optionaldependencies_key, data__dynamic__optionaldependencies_val in data__dynamic__optionaldependencies.items():
                                if REGEX_PATTERNS['.+'].search(data__dynamic__optionaldependencies_key):
                                    if data__dynamic__optionaldependencies_key in data__dynamic__optionaldependencies_keys:
                                        data__dynamic__optionaldependencies_keys.remove(data__dynamic__optionaldependencies_key)
                                    validate_https___setuptools_pypa_io_en_latest_references_keywords_html__definitions_file_directive(data__dynamic__optionaldependencies_val, custom_formats, (name_prefix or "data") + ".dynamic.optional-dependencies.{data__dynamic__optionaldependencies_key}".format(**locals()))
                            if data__dynamic__optionaldependencies_keys:
                                raise JsonSchemaValueException("" + (name_prefix or "data") + ".dynamic.optional-dependencies must not contain "+str(data__dynamic__optionaldependencies_keys)+" properties", value=data__dynamic__optionaldependencies, name="" + (name_prefix or "data") + ".dynamic.optional-dependencies", definition={'type': 'object', 'propertyNames': {'format': 'python-identifier'}, 'additionalProperties': False, 'patternProperties': {'.+': {'$id': '#/definitions/file-directive', 'title': "'file:' directive", 'description': 'Value is read from a file (or list of files and then concatenated)', 'type': 'object', 'additionalProperties': False, 'properties': {'file': {'oneOf': [{'type': 'string'}, {'type': 'array', 'items': {'type': 'string'}}]}}, 'required': ['file']}}}, rule='additionalProperties')
                            data__dynamic__optionaldependencies_len = len(data__dynamic__optionaldependencies)
                            if data__dynamic__optionaldependencies_len != 0:
                                data__dynamic__optionaldependencies_property_names = True
                                for data__dynamic__optionaldependencies_key in data__dynamic__optionaldependencies:
                                    try:
                                        if isinstance(data__dynamic__optionaldependencies_key, str):
                                            if not custom_formats["python-identifier"](data__dynamic__optionaldependencies_key):
                                                raise JsonSchemaValueException("" + (name_prefix or "data") + ".dynamic.optional-dependencies must be python-identifier", value=data__dynamic__optionaldependencies_key, name="" + (name_prefix or "data") + ".dynamic.optional-dependencies", definition={'format': 'python-identifier'}, rule='format')
                                    except JsonSchemaValueException:
                                        data__dynamic__optionaldependencies_property_names = False
                                if not data__dynamic__optionaldependencies_property_names:
                                    raise JsonSchemaValueException("" + (name_prefix or "data") + ".dynamic.optional-dependencies must be named by propertyName definition", value=data__dynamic__optionaldependencies, name="" + (name_prefix or "data") + ".dynamic.optional-dependencies", definition={'type': 'object', 'propertyNames': {'format': 'python-identifier'}, 'additionalProperties': False, 'patternProperties': {'.+': {'$id': '#/definitions/file-directive', 'title': "'file:' directive", 'description': 'Value is read from a file (or list of files and then concatenated)', 'type': 'object', 'additionalProperties': False, 'properties': {'file': {'oneOf': [{'type': 'string'}, {'type': 'array', 'items': {'type': 'string'}}]}}, 'required': ['file']}}}, rule='propertyNames')
                    if "readme" in data__dynamic_keys:
                        data__dynamic_keys.remove("readme")
                        data__dynamic__readme = data__dynamic["readme"]
                        data__dynamic__readme_any_of_count6 = 0
                        if not data__dynamic__readme_any_of_count6:
                            try:
                                validate_https___setuptools_pypa_io_en_latest_references_keywords_html__definitions_file_directive(data__dynamic__readme, custom_formats, (name_prefix or "data") + ".dynamic.readme")
                                data__dynamic__readme_any_of_count6 += 1
                            except JsonSchemaValueException: pass
                        if not data__dynamic__readme_any_of_count6:
                            try:
                                data__dynamic__readme_is_dict = isinstance(data__dynamic__readme, dict)
                                if data__dynamic__readme_is_dict:
                                    data__dynamic__readme_keys = set(data__dynamic__readme.keys())
                                    if "content-type" in data__dynamic__readme_keys:
                                        data__dynamic__readme_keys.remove("content-type")
                                        data__dynamic__readme__contenttype = data__dynamic__readme["content-type"]
                                        if not isinstance(data__dynamic__readme__contenttype, (str)):
                                            raise JsonSchemaValueException("" + (name_prefix or "data") + ".dynamic.readme.content-type must be string", value=data__dynamic__readme__contenttype, name="" + (name_prefix or "data") + ".dynamic.readme.content-type", definition={'type': 'string'}, rule='type')
                                data__dynamic__readme_any_of_count6 += 1
                            except JsonSchemaValueException: pass
                        if not data__dynamic__readme_any_of_count6:
                            raise JsonSchemaValueException("" + (name_prefix or "data") + ".dynamic.readme cannot be validated by any definition", value=data__dynamic__readme, name="" + (name_prefix or "data") + ".dynamic.readme", definition={'anyOf': [{'$id': '#/definitions/file-directive', 'title': "'file:' directive", 'description': 'Value is read from a file (or list of files and then concatenated)', 'type': 'object', 'additionalProperties': False, 'properties': {'file': {'oneOf': [{'type': 'string'}, {'type': 'array', 'items': {'type': 'string'}}]}}, 'required': ['file']}, {'properties': {'content-type': {'type': 'string'}}}], 'required': ['file']}, rule='anyOf')
                        data__dynamic__readme_is_dict = isinstance(data__dynamic__readme, dict)
                        if data__dynamic__readme_is_dict:
                            data__dynamic__readme_len = len(data__dynamic__readme)
                            if not all(prop in data__dynamic__readme for prop in ['file']):
                                raise JsonSchemaValueException("" + (name_prefix or "data") + ".dynamic.readme must contain ['file'] properties", value=data__dynamic__readme, name="" + (name_prefix or "data") + ".dynamic.readme", definition={'anyOf': [{'$id': '#/definitions/file-directive', 'title': "'file:' directive", 'description': 'Value is read from a file (or list of files and then concatenated)', 'type': 'object', 'additionalProperties': False, 'properties': {'file': {'oneOf': [{'type': 'string'}, {'type': 'array', 'items': {'type': 'string'}}]}}, 'required': ['file']}, {'properties': {'content-type': {'type': 'string'}}}], 'required': ['file']}, rule='required')
                    if data__dynamic_keys:
                        raise JsonSchemaValueException("" + (name_prefix or "data") + ".dynamic must not contain "+str(data__dynamic_keys)+" properties", value=data__dynamic, name="" + (name_prefix or "data") + ".dynamic", definition={'type': 'object', 'description': 'Instructions for loading :pep:`621`-related metadata dynamically', 'additionalProperties': False, 'properties': {'version': {'$$description': ['A version dynamically loaded via either the ``attr:`` or ``file:``', 'directives. Please make sure the given file or attribute respects :pep:`440`.'], 'oneOf': [{'title': "'attr:' directive", '$id': '#/definitions/attr-directive', '$$description': ['Value is read from a module attribute. Supports callables and iterables;', 'unsupported types are cast via ``str()``'], 'type': 'object', 'additionalProperties': False, 'properties': {'attr': {'type': 'string'}}, 'required': ['attr']}, {'$id': '#/definitions/file-directive', 'title': "'file:' directive", 'description': 'Value is read from a file (or list of files and then concatenated)', 'type': 'object', 'additionalProperties': False, 'properties': {'file': {'oneOf': [{'type': 'string'}, {'type': 'array', 'items': {'type': 'string'}}]}}, 'required': ['file']}]}, 'classifiers': {'$id': '#/definitions/file-directive', 'title': "'file:' directive", 'description': 'Value is read from a file (or list of files and then concatenated)', 'type': 'object', 'additionalProperties': False, 'properties': {'file': {'oneOf': [{'type': 'string'}, {'type': 'array', 'items': {'type': 'string'}}]}}, 'required': ['file']}, 'description': {'$id': '#/definitions/file-directive', 'title': "'file:' directive", 'description': 'Value is read from a file (or list of files and then concatenated)', 'type': 'object', 'additionalProperties': False, 'properties': {'file': {'oneOf': [{'type': 'string'}, {'type': 'array', 'items': {'type': 'string'}}]}}, 'required': ['file']}, 'dependencies': {'$id': '#/definitions/file-directive', 'title': "'file:' directive", 'description': 'Value is read from a file (or list of files and then concatenated)', 'type': 'object', 'additionalProperties': False, 'properties': {'file': {'oneOf': [{'type': 'string'}, {'type': 'array', 'items': {'type': 'string'}}]}}, 'required': ['file']}, 'entry-points': {'$id': '#/definitions/file-directive', 'title': "'file:' directive", 'description': 'Value is read from a file (or list of files and then concatenated)', 'type': 'object', 'additionalProperties': False, 'properties': {'file': {'oneOf': [{'type': 'string'}, {'type': 'array', 'items': {'type': 'string'}}]}}, 'required': ['file']}, 'optional-dependencies': {'type': 'object', 'propertyNames': {'format': 'python-identifier'}, 'additionalProperties': False, 'patternProperties': {'.+': {'$id': '#/definitions/file-directive', 'title': "'file:' directive", 'description': 'Value is read from a file (or list of files and then concatenated)', 'type': 'object', 'additionalProperties': False, 'properties': {'file': {'oneOf': [{'type': 'string'}, {'type': 'array', 'items': {'type': 'string'}}]}}, 'required': ['file']}}}, 'readme': {'anyOf': [{'$id': '#/definitions/file-directive', 'title': "'file:' directive", 'description': 'Value is read from a file (or list of files and then concatenated)', 'type': 'object', 'additionalProperties': False, 'properties': {'file': {'oneOf': [{'type': 'string'}, {'type': 'array', 'items': {'type': 'string'}}]}}, 'required': ['file']}, {'properties': {'content-type': {'type': 'string'}}}], 'required': ['file']}}}, rule='additionalProperties')
            if data_keys:
                raise JsonSchemaValueException("" + (name_prefix or "data") + " must not contain "+str(data_keys)+" properties", value=data, name="" + (name_prefix or "data") + "", definition={'$schema': 'http://json-schema.org/draft-07/schema', '$id': 'https://setuptools.pypa.io/en/latest/references/keywords.html', 'title': '``tool.setuptools`` table', '$$description': ['Please notice for the time being the ``setuptools`` project does not specify', 'a way of configuring builds via ``pyproject.toml``.', 'Therefore this schema should be taken just as a *"thought experiment"* on how', 'this *might be done*, by following the principles established in', '`ini2toml `_.', 'It considers only ``setuptools`` `parameters', '`_', 'that can currently be configured via ``setup.cfg`` and are not covered by :pep:`621`', 'but intentionally excludes ``dependency_links`` and ``setup_requires``.', 'NOTE: ``scripts`` was renamed to ``script-files`` to avoid confusion with', 'entry-point based scripts (defined in :pep:`621`).'], 'type': 'object', 'additionalProperties': False, 'properties': {'platforms': {'type': 'array', 'items': {'type': 'string'}}, 'provides': {'$$description': ['Package and virtual package names contained within this package', '**(not supported by pip)**'], 'type': 'array', 'items': {'type': 'string', 'format': 'pep508-identifier'}}, 'obsoletes': {'$$description': ['Packages which this package renders obsolete', '**(not supported by pip)**'], 'type': 'array', 'items': {'type': 'string', 'format': 'pep508-identifier'}}, 'zip-safe': {'description': 'Whether the project can be safely installed and run from a zip file.', 'type': 'boolean'}, 'script-files': {'description': 'Legacy way of defining scripts (entry-points are preferred).', 'type': 'array', 'items': {'type': 'string'}, '$comment': 'TODO: is this field deprecated/should be removed?'}, 'eager-resources': {'$$description': ['Resources that should be extracted together, if any of them is needed,', 'or if any C extensions included in the project are imported.'], 'type': 'array', 'items': {'type': 'string'}}, 'packages': {'$$description': ['Packages that should be included in the distribution.', 'It can be given either as a list of package identifiers', 'or as a ``dict``-like structure with a single key ``find``', 'which corresponds to a dynamic call to', '``setuptools.config.expand.find_packages`` function.', 'The ``find`` key is associated with a nested ``dict``-like structure that can', 'contain ``where``, ``include``, ``exclude`` and ``namespaces`` keys,', 'mimicking the keyword arguments of the associated function.'], 'oneOf': [{'title': 'Array of Python package identifiers', 'type': 'array', 'items': {'$id': '#/definitions/package-name', 'title': 'Valid package name', 'description': 'Valid package name (importable or PEP 561).', 'type': 'string', 'anyOf': [{'format': 'python-module-name'}, {'format': 'pep561-stub-name'}]}}, {'$id': '#/definitions/find-directive', 'title': "'find:' directive", 'type': 'object', 'additionalProperties': False, 'properties': {'find': {'type': 'object', '$$description': ['Dynamic `package discovery', '`_.'], 'additionalProperties': False, 'properties': {'where': {'description': 'Directories to be searched for packages (Unix-style relative path)', 'type': 'array', 'items': {'type': 'string'}}, 'exclude': {'type': 'array', '$$description': ['Exclude packages that match the values listed in this field.', "Can container shell-style wildcards (e.g. ``'pkg.*'``)"], 'items': {'type': 'string'}}, 'include': {'type': 'array', '$$description': ['Restrict the found packages to just the ones listed in this field.', "Can container shell-style wildcards (e.g. ``'pkg.*'``)"], 'items': {'type': 'string'}}, 'namespaces': {'type': 'boolean', '$$description': ['When ``True``, directories without a ``__init__.py`` file will also', 'be scanned for :pep:`420`-style implicit namespaces']}}}}}]}, 'package-dir': {'$$description': [':class:`dict`-like structure mapping from package names to directories where their', 'code can be found.', 'The empty string (as key) means that all packages are contained inside', 'the given directory will be included in the distribution.'], 'type': 'object', 'additionalProperties': False, 'propertyNames': {'oneOf': [{'const': ''}, {'$id': '#/definitions/package-name', 'title': 'Valid package name', 'description': 'Valid package name (importable or PEP 561).', 'type': 'string', 'anyOf': [{'format': 'python-module-name'}, {'format': 'pep561-stub-name'}]}]}, 'patternProperties': {'^.*$': {'type': 'string'}}}, 'package-data': {'$$description': ['Mapping from package names to lists of glob patterns.', 'Usually this option is not needed when using ``include-package-data = true``', 'For more information on how to include data files, check ``setuptools`` `docs', '`_.'], 'type': 'object', 'additionalProperties': False, 'propertyNames': {'oneOf': [{'format': 'python-module-name'}, {'const': '*'}]}, 'patternProperties': {'^.*$': {'type': 'array', 'items': {'type': 'string'}}}}, 'include-package-data': {'$$description': ['Automatically include any data files inside the package directories', 'that are specified by ``MANIFEST.in``', 'For more information on how to include data files, check ``setuptools`` `docs', '`_.'], 'type': 'boolean'}, 'exclude-package-data': {'$$description': ['Mapping from package names to lists of glob patterns that should be excluded', 'For more information on how to include data files, check ``setuptools`` `docs', '`_.'], 'type': 'object', 'additionalProperties': False, 'propertyNames': {'oneOf': [{'format': 'python-module-name'}, {'const': '*'}]}, 'patternProperties': {'^.*$': {'type': 'array', 'items': {'type': 'string'}}}}, 'namespace-packages': {'type': 'array', 'items': {'type': 'string', 'format': 'python-module-name'}, '$comment': 'https://setuptools.pypa.io/en/latest/userguide/package_discovery.html'}, 'py-modules': {'description': 'Modules that setuptools will manipulate', 'type': 'array', 'items': {'type': 'string', 'format': 'python-module-name'}, '$comment': 'TODO: clarify the relationship with ``packages``'}, 'data-files': {'$$description': ['**DEPRECATED**: dict-like structure where each key represents a directory and', 'the value is a list of glob patterns that should be installed in them.', "Please notice this don't work with wheels. See `data files support", '`_'], 'type': 'object', 'patternProperties': {'^.*$': {'type': 'array', 'items': {'type': 'string'}}}}, 'cmdclass': {'$$description': ['Mapping of distutils-style command names to ``setuptools.Command`` subclasses', 'which in turn should be represented by strings with a qualified class name', '(i.e., "dotted" form with module), e.g.::\n\n', '    cmdclass = {mycmd = "pkg.subpkg.module.CommandClass"}\n\n', 'The command class should be a directly defined at the top-level of the', 'containing module (no class nesting).'], 'type': 'object', 'patternProperties': {'^.*$': {'type': 'string', 'format': 'python-qualified-identifier'}}}, 'license-files': {'type': 'array', 'items': {'type': 'string'}, '$$description': ['PROVISIONAL: List of glob patterns for all license files being distributed.', '(might become standard with PEP 639).', "By default: ``['LICEN[CS]E*', 'COPYING*', 'NOTICE*', 'AUTHORS*']``"], '$comment': 'TODO: revise if PEP 639 is accepted. Probably ``project.license-files``?'}, 'dynamic': {'type': 'object', 'description': 'Instructions for loading :pep:`621`-related metadata dynamically', 'additionalProperties': False, 'properties': {'version': {'$$description': ['A version dynamically loaded via either the ``attr:`` or ``file:``', 'directives. Please make sure the given file or attribute respects :pep:`440`.'], 'oneOf': [{'title': "'attr:' directive", '$id': '#/definitions/attr-directive', '$$description': ['Value is read from a module attribute. Supports callables and iterables;', 'unsupported types are cast via ``str()``'], 'type': 'object', 'additionalProperties': False, 'properties': {'attr': {'type': 'string'}}, 'required': ['attr']}, {'$id': '#/definitions/file-directive', 'title': "'file:' directive", 'description': 'Value is read from a file (or list of files and then concatenated)', 'type': 'object', 'additionalProperties': False, 'properties': {'file': {'oneOf': [{'type': 'string'}, {'type': 'array', 'items': {'type': 'string'}}]}}, 'required': ['file']}]}, 'classifiers': {'$id': '#/definitions/file-directive', 'title': "'file:' directive", 'description': 'Value is read from a file (or list of files and then concatenated)', 'type': 'object', 'additionalProperties': False, 'properties': {'file': {'oneOf': [{'type': 'string'}, {'type': 'array', 'items': {'type': 'string'}}]}}, 'required': ['file']}, 'description': {'$id': '#/definitions/file-directive', 'title': "'file:' directive", 'description': 'Value is read from a file (or list of files and then concatenated)', 'type': 'object', 'additionalProperties': False, 'properties': {'file': {'oneOf': [{'type': 'string'}, {'type': 'array', 'items': {'type': 'string'}}]}}, 'required': ['file']}, 'dependencies': {'$id': '#/definitions/file-directive', 'title': "'file:' directive", 'description': 'Value is read from a file (or list of files and then concatenated)', 'type': 'object', 'additionalProperties': False, 'properties': {'file': {'oneOf': [{'type': 'string'}, {'type': 'array', 'items': {'type': 'string'}}]}}, 'required': ['file']}, 'entry-points': {'$id': '#/definitions/file-directive', 'title': "'file:' directive", 'description': 'Value is read from a file (or list of files and then concatenated)', 'type': 'object', 'additionalProperties': False, 'properties': {'file': {'oneOf': [{'type': 'string'}, {'type': 'array', 'items': {'type': 'string'}}]}}, 'required': ['file']}, 'optional-dependencies': {'type': 'object', 'propertyNames': {'format': 'python-identifier'}, 'additionalProperties': False, 'patternProperties': {'.+': {'$id': '#/definitions/file-directive', 'title': "'file:' directive", 'description': 'Value is read from a file (or list of files and then concatenated)', 'type': 'object', 'additionalProperties': False, 'properties': {'file': {'oneOf': [{'type': 'string'}, {'type': 'array', 'items': {'type': 'string'}}]}}, 'required': ['file']}}}, 'readme': {'anyOf': [{'$id': '#/definitions/file-directive', 'title': "'file:' directive", 'description': 'Value is read from a file (or list of files and then concatenated)', 'type': 'object', 'additionalProperties': False, 'properties': {'file': {'oneOf': [{'type': 'string'}, {'type': 'array', 'items': {'type': 'string'}}]}}, 'required': ['file']}, {'properties': {'content-type': {'type': 'string'}}}], 'required': ['file']}}}}, 'definitions': {'package-name': {'$id': '#/definitions/package-name', 'title': 'Valid package name', 'description': 'Valid package name (importable or PEP 561).', 'type': 'string', 'anyOf': [{'format': 'python-module-name'}, {'format': 'pep561-stub-name'}]}, 'file-directive': {'$id': '#/definitions/file-directive', 'title': "'file:' directive", 'description': 'Value is read from a file (or list of files and then concatenated)', 'type': 'object', 'additionalProperties': False, 'properties': {'file': {'oneOf': [{'type': 'string'}, {'type': 'array', 'items': {'type': 'string'}}]}}, 'required': ['file']}, 'attr-directive': {'title': "'attr:' directive", '$id': '#/definitions/attr-directive', '$$description': ['Value is read from a module attribute. Supports callables and iterables;', 'unsupported types are cast via ``str()``'], 'type': 'object', 'additionalProperties': False, 'properties': {'attr': {'type': 'string'}}, 'required': ['attr']}, 'find-directive': {'$id': '#/definitions/find-directive', 'title': "'find:' directive", 'type': 'object', 'additionalProperties': False, 'properties': {'find': {'type': 'object', '$$description': ['Dynamic `package discovery', '`_.'], 'additionalProperties': False, 'properties': {'where': {'description': 'Directories to be searched for packages (Unix-style relative path)', 'type': 'array', 'items': {'type': 'string'}}, 'exclude': {'type': 'array', '$$description': ['Exclude packages that match the values listed in this field.', "Can container shell-style wildcards (e.g. ``'pkg.*'``)"], 'items': {'type': 'string'}}, 'include': {'type': 'array', '$$description': ['Restrict the found packages to just the ones listed in this field.', "Can container shell-style wildcards (e.g. ``'pkg.*'``)"], 'items': {'type': 'string'}}, 'namespaces': {'type': 'boolean', '$$description': ['When ``True``, directories without a ``__init__.py`` file will also', 'be scanned for :pep:`420`-style implicit namespaces']}}}}}}}, rule='additionalProperties')
        return data
    
    def validate_https___setuptools_pypa_io_en_latest_references_keywords_html__definitions_file_directive(data, custom_formats={}, name_prefix=None):
        if not isinstance(data, (dict)):
            raise JsonSchemaValueException("" + (name_prefix or "data") + " must be object", value=data, name="" + (name_prefix or "data") + "", definition={'$id': '#/definitions/file-directive', 'title': "'file:' directive", 'description': 'Value is read from a file (or list of files and then concatenated)', 'type': 'object', 'additionalProperties': False, 'properties': {'file': {'oneOf': [{'type': 'string'}, {'type': 'array', 'items': {'type': 'string'}}]}}, 'required': ['file']}, rule='type')
        data_is_dict = isinstance(data, dict)
        if data_is_dict:
            data_len = len(data)
            if not all(prop in data for prop in ['file']):
                raise JsonSchemaValueException("" + (name_prefix or "data") + " must contain ['file'] properties", value=data, name="" + (name_prefix or "data") + "", definition={'$id': '#/definitions/file-directive', 'title': "'file:' directive", 'description': 'Value is read from a file (or list of files and then concatenated)', 'type': 'object', 'additionalProperties': False, 'properties': {'file': {'oneOf': [{'type': 'string'}, {'type': 'array', 'items': {'type': 'string'}}]}}, 'required': ['file']}, rule='required')
            data_keys = set(data.keys())
            if "file" in data_keys:
                data_keys.remove("file")
                data__file = data["file"]
                data__file_one_of_count7 = 0
                if data__file_one_of_count7 < 2:
                    try:
                        if not isinstance(data__file, (str)):
                            raise JsonSchemaValueException("" + (name_prefix or "data") + ".file must be string", value=data__file, name="" + (name_prefix or "data") + ".file", definition={'type': 'string'}, rule='type')
                        data__file_one_of_count7 += 1
                    except JsonSchemaValueException: pass
                if data__file_one_of_count7 < 2:
                    try:
                        if not isinstance(data__file, (list, tuple)):
                            raise JsonSchemaValueException("" + (name_prefix or "data") + ".file must be array", value=data__file, name="" + (name_prefix or "data") + ".file", definition={'type': 'array', 'items': {'type': 'string'}}, rule='type')
                        data__file_is_list = isinstance(data__file, (list, tuple))
                        if data__file_is_list:
                            data__file_len = len(data__file)
                            for data__file_x, data__file_item in enumerate(data__file):
                                if not isinstance(data__file_item, (str)):
                                    raise JsonSchemaValueException("" + (name_prefix or "data") + ".file[{data__file_x}]".format(**locals()) + " must be string", value=data__file_item, name="" + (name_prefix or "data") + ".file[{data__file_x}]".format(**locals()) + "", definition={'type': 'string'}, rule='type')
                        data__file_one_of_count7 += 1
                    except JsonSchemaValueException: pass
                if data__file_one_of_count7 != 1:
                    raise JsonSchemaValueException("" + (name_prefix or "data") + ".file must be valid exactly by one definition" + (" (" + str(data__file_one_of_count7) + " matches found)"), value=data__file, name="" + (name_prefix or "data") + ".file", definition={'oneOf': [{'type': 'string'}, {'type': 'array', 'items': {'type': 'string'}}]}, rule='oneOf')
            if data_keys:
                raise JsonSchemaValueException("" + (name_prefix or "data") + " must not contain "+str(data_keys)+" properties", value=data, name="" + (name_prefix or "data") + "", definition={'$id': '#/definitions/file-directive', 'title': "'file:' directive", 'description': 'Value is read from a file (or list of files and then concatenated)', 'type': 'object', 'additionalProperties': False, 'properties': {'file': {'oneOf': [{'type': 'string'}, {'type': 'array', 'items': {'type': 'string'}}]}}, 'required': ['file']}, rule='additionalProperties')
        return data
    
    def validate_https___setuptools_pypa_io_en_latest_references_keywords_html__definitions_attr_directive(data, custom_formats={}, name_prefix=None):
        if not isinstance(data, (dict)):
            raise JsonSchemaValueException("" + (name_prefix or "data") + " must be object", value=data, name="" + (name_prefix or "data") + "", definition={'title': "'attr:' directive", '$id': '#/definitions/attr-directive', '$$description': ['Value is read from a module attribute. Supports callables and iterables;', 'unsupported types are cast via ``str()``'], 'type': 'object', 'additionalProperties': False, 'properties': {'attr': {'type': 'string'}}, 'required': ['attr']}, rule='type')
        data_is_dict = isinstance(data, dict)
        if data_is_dict:
            data_len = len(data)
            if not all(prop in data for prop in ['attr']):
                raise JsonSchemaValueException("" + (name_prefix or "data") + " must contain ['attr'] properties", value=data, name="" + (name_prefix or "data") + "", definition={'title': "'attr:' directive", '$id': '#/definitions/attr-directive', '$$description': ['Value is read from a module attribute. Supports callables and iterables;', 'unsupported types are cast via ``str()``'], 'type': 'object', 'additionalProperties': False, 'properties': {'attr': {'type': 'string'}}, 'required': ['attr']}, rule='required')
            data_keys = set(data.keys())
            if "attr" in data_keys:
                data_keys.remove("attr")
                data__attr = data["attr"]
                if not isinstance(data__attr, (str)):
                    raise JsonSchemaValueException("" + (name_prefix or "data") + ".attr must be string", value=data__attr, name="" + (name_prefix or "data") + ".attr", definition={'type': 'string'}, rule='type')
            if data_keys:
                raise JsonSchemaValueException("" + (name_prefix or "data") + " must not contain "+str(data_keys)+" properties", value=data, name="" + (name_prefix or "data") + "", definition={'title': "'attr:' directive", '$id': '#/definitions/attr-directive', '$$description': ['Value is read from a module attribute. Supports callables and iterables;', 'unsupported types are cast via ``str()``'], 'type': 'object', 'additionalProperties': False, 'properties': {'attr': {'type': 'string'}}, 'required': ['attr']}, rule='additionalProperties')
        return data
    
    def validate_https___setuptools_pypa_io_en_latest_references_keywords_html__definitions_find_directive(data, custom_formats={}, name_prefix=None):
        if not isinstance(data, (dict)):
            raise JsonSchemaValueException("" + (name_prefix or "data") + " must be object", value=data, name="" + (name_prefix or "data") + "", definition={'$id': '#/definitions/find-directive', 'title': "'find:' directive", 'type': 'object', 'additionalProperties': False, 'properties': {'find': {'type': 'object', '$$description': ['Dynamic `package discovery', '`_.'], 'additionalProperties': False, 'properties': {'where': {'description': 'Directories to be searched for packages (Unix-style relative path)', 'type': 'array', 'items': {'type': 'string'}}, 'exclude': {'type': 'array', '$$description': ['Exclude packages that match the values listed in this field.', "Can container shell-style wildcards (e.g. ``'pkg.*'``)"], 'items': {'type': 'string'}}, 'include': {'type': 'array', '$$description': ['Restrict the found packages to just the ones listed in this field.', "Can container shell-style wildcards (e.g. ``'pkg.*'``)"], 'items': {'type': 'string'}}, 'namespaces': {'type': 'boolean', '$$description': ['When ``True``, directories without a ``__init__.py`` file will also', 'be scanned for :pep:`420`-style implicit namespaces']}}}}}, rule='type')
        data_is_dict = isinstance(data, dict)
        if data_is_dict:
            data_keys = set(data.keys())
            if "find" in data_keys:
                data_keys.remove("find")
                data__find = data["find"]
                if not isinstance(data__find, (dict)):
                    raise JsonSchemaValueException("" + (name_prefix or "data") + ".find must be object", value=data__find, name="" + (name_prefix or "data") + ".find", definition={'type': 'object', '$$description': ['Dynamic `package discovery', '`_.'], 'additionalProperties': False, 'properties': {'where': {'description': 'Directories to be searched for packages (Unix-style relative path)', 'type': 'array', 'items': {'type': 'string'}}, 'exclude': {'type': 'array', '$$description': ['Exclude packages that match the values listed in this field.', "Can container shell-style wildcards (e.g. ``'pkg.*'``)"], 'items': {'type': 'string'}}, 'include': {'type': 'array', '$$description': ['Restrict the found packages to just the ones listed in this field.', "Can container shell-style wildcards (e.g. ``'pkg.*'``)"], 'items': {'type': 'string'}}, 'namespaces': {'type': 'boolean', '$$description': ['When ``True``, directories without a ``__init__.py`` file will also', 'be scanned for :pep:`420`-style implicit namespaces']}}}, rule='type')
                data__find_is_dict = isinstance(data__find, dict)
                if data__find_is_dict:
                    data__find_keys = set(data__find.keys())
                    if "where" in data__find_keys:
                        data__find_keys.remove("where")
                        data__find__where = data__find["where"]
                        if not isinstance(data__find__where, (list, tuple)):
                            raise JsonSchemaValueException("" + (name_prefix or "data") + ".find.where must be array", value=data__find__where, name="" + (name_prefix or "data") + ".find.where", definition={'description': 'Directories to be searched for packages (Unix-style relative path)', 'type': 'array', 'items': {'type': 'string'}}, rule='type')
                        data__find__where_is_list = isinstance(data__find__where, (list, tuple))
                        if data__find__where_is_list:
                            data__find__where_len = len(data__find__where)
                            for data__find__where_x, data__find__where_item in enumerate(data__find__where):
                                if not isinstance(data__find__where_item, (str)):
                                    raise JsonSchemaValueException("" + (name_prefix or "data") + ".find.where[{data__find__where_x}]".format(**locals()) + " must be string", value=data__find__where_item, name="" + (name_prefix or "data") + ".find.where[{data__find__where_x}]".format(**locals()) + "", definition={'type': 'string'}, rule='type')
                    if "exclude" in data__find_keys:
                        data__find_keys.remove("exclude")
                        data__find__exclude = data__find["exclude"]
                        if not isinstance(data__find__exclude, (list, tuple)):
                            raise JsonSchemaValueException("" + (name_prefix or "data") + ".find.exclude must be array", value=data__find__exclude, name="" + (name_prefix or "data") + ".find.exclude", definition={'type': 'array', '$$description': ['Exclude packages that match the values listed in this field.', "Can container shell-style wildcards (e.g. ``'pkg.*'``)"], 'items': {'type': 'string'}}, rule='type')
                        data__find__exclude_is_list = isinstance(data__find__exclude, (list, tuple))
                        if data__find__exclude_is_list:
                            data__find__exclude_len = len(data__find__exclude)
                            for data__find__exclude_x, data__find__exclude_item in enumerate(data__find__exclude):
                                if not isinstance(data__find__exclude_item, (str)):
                                    raise JsonSchemaValueException("" + (name_prefix or "data") + ".find.exclude[{data__find__exclude_x}]".format(**locals()) + " must be string", value=data__find__exclude_item, name="" + (name_prefix or "data") + ".find.exclude[{data__find__exclude_x}]".format(**locals()) + "", definition={'type': 'string'}, rule='type')
                    if "include" in data__find_keys:
                        data__find_keys.remove("include")
                        data__find__include = data__find["include"]
                        if not isinstance(data__find__include, (list, tuple)):
                            raise JsonSchemaValueException("" + (name_prefix or "data") + ".find.include must be array", value=data__find__include, name="" + (name_prefix or "data") + ".find.include", definition={'type': 'array', '$$description': ['Restrict the found packages to just the ones listed in this field.', "Can container shell-style wildcards (e.g. ``'pkg.*'``)"], 'items': {'type': 'string'}}, rule='type')
                        data__find__include_is_list = isinstance(data__find__include, (list, tuple))
                        if data__find__include_is_list:
                            data__find__include_len = len(data__find__include)
                            for data__find__include_x, data__find__include_item in enumerate(data__find__include):
                                if not isinstance(data__find__include_item, (str)):
                                    raise JsonSchemaValueException("" + (name_prefix or "data") + ".find.include[{data__find__include_x}]".format(**locals()) + " must be string", value=data__find__include_item, name="" + (name_prefix or "data") + ".find.include[{data__find__include_x}]".format(**locals()) + "", definition={'type': 'string'}, rule='type')
                    if "namespaces" in data__find_keys:
                        data__find_keys.remove("namespaces")
                        data__find__namespaces = data__find["namespaces"]
                        if not isinstance(data__find__namespaces, (bool)):
                            raise JsonSchemaValueException("" + (name_prefix or "data") + ".find.namespaces must be boolean", value=data__find__namespaces, name="" + (name_prefix or "data") + ".find.namespaces", definition={'type': 'boolean', '$$description': ['When ``True``, directories without a ``__init__.py`` file will also', 'be scanned for :pep:`420`-style implicit namespaces']}, rule='type')
                    if data__find_keys:
                        raise JsonSchemaValueException("" + (name_prefix or "data") + ".find must not contain "+str(data__find_keys)+" properties", value=data__find, name="" + (name_prefix or "data") + ".find", definition={'type': 'object', '$$description': ['Dynamic `package discovery', '`_.'], 'additionalProperties': False, 'properties': {'where': {'description': 'Directories to be searched for packages (Unix-style relative path)', 'type': 'array', 'items': {'type': 'string'}}, 'exclude': {'type': 'array', '$$description': ['Exclude packages that match the values listed in this field.', "Can container shell-style wildcards (e.g. ``'pkg.*'``)"], 'items': {'type': 'string'}}, 'include': {'type': 'array', '$$description': ['Restrict the found packages to just the ones listed in this field.', "Can container shell-style wildcards (e.g. ``'pkg.*'``)"], 'items': {'type': 'string'}}, 'namespaces': {'type': 'boolean', '$$description': ['When ``True``, directories without a ``__init__.py`` file will also', 'be scanned for :pep:`420`-style implicit namespaces']}}}, rule='additionalProperties')
            if data_keys:
                raise JsonSchemaValueException("" + (name_prefix or "data") + " must not contain "+str(data_keys)+" properties", value=data, name="" + (name_prefix or "data") + "", definition={'$id': '#/definitions/find-directive', 'title': "'find:' directive", 'type': 'object', 'additionalProperties': False, 'properties': {'find': {'type': 'object', '$$description': ['Dynamic `package discovery', '`_.'], 'additionalProperties': False, 'properties': {'where': {'description': 'Directories to be searched for packages (Unix-style relative path)', 'type': 'array', 'items': {'type': 'string'}}, 'exclude': {'type': 'array', '$$description': ['Exclude packages that match the values listed in this field.', "Can container shell-style wildcards (e.g. ``'pkg.*'``)"], 'items': {'type': 'string'}}, 'include': {'type': 'array', '$$description': ['Restrict the found packages to just the ones listed in this field.', "Can container shell-style wildcards (e.g. ``'pkg.*'``)"], 'items': {'type': 'string'}}, 'namespaces': {'type': 'boolean', '$$description': ['When ``True``, directories without a ``__init__.py`` file will also', 'be scanned for :pep:`420`-style implicit namespaces']}}}}}, rule='additionalProperties')
        return data
    
    def validate_https___setuptools_pypa_io_en_latest_references_keywords_html__definitions_package_name(data, custom_formats={}, name_prefix=None):
        if not isinstance(data, (str)):
            raise JsonSchemaValueException("" + (name_prefix or "data") + " must be string", value=data, name="" + (name_prefix or "data") + "", definition={'$id': '#/definitions/package-name', 'title': 'Valid package name', 'description': 'Valid package name (importable or PEP 561).', 'type': 'string', 'anyOf': [{'format': 'python-module-name'}, {'format': 'pep561-stub-name'}]}, rule='type')
        data_any_of_count8 = 0
        if not data_any_of_count8:
            try:
                if isinstance(data, str):
                    if not custom_formats["python-module-name"](data):
                        raise JsonSchemaValueException("" + (name_prefix or "data") + " must be python-module-name", value=data, name="" + (name_prefix or "data") + "", definition={'format': 'python-module-name'}, rule='format')
                data_any_of_count8 += 1
            except JsonSchemaValueException: pass
        if not data_any_of_count8:
            try:
                if isinstance(data, str):
                    if not custom_formats["pep561-stub-name"](data):
                        raise JsonSchemaValueException("" + (name_prefix or "data") + " must be pep561-stub-name", value=data, name="" + (name_prefix or "data") + "", definition={'format': 'pep561-stub-name'}, rule='format')
                data_any_of_count8 += 1
            except JsonSchemaValueException: pass
        if not data_any_of_count8:
            raise JsonSchemaValueException("" + (name_prefix or "data") + " cannot be validated by any definition", value=data, name="" + (name_prefix or "data") + "", definition={'$id': '#/definitions/package-name', 'title': 'Valid package name', 'description': 'Valid package name (importable or PEP 561).', 'type': 'string', 'anyOf': [{'format': 'python-module-name'}, {'format': 'pep561-stub-name'}]}, rule='anyOf')
        return data
    
    def validate_https___docs_python_org_3_install(data, custom_formats={}, name_prefix=None):
        if not isinstance(data, (dict)):
            raise JsonSchemaValueException("" + (name_prefix or "data") + " must be object", value=data, name="" + (name_prefix or "data") + "", definition={'$schema': 'http://json-schema.org/draft-07/schema', '$id': 'https://docs.python.org/3/install/', 'title': '``tool.distutils`` table', '$$description': ['Originally, ``distutils`` allowed developers to configure arguments for', '``setup.py`` scripts via `distutils configuration files', '`_.', '``tool.distutils`` subtables could be used with the same purpose', '(NOT CURRENTLY IMPLEMENTED).'], 'type': 'object', 'properties': {'global': {'type': 'object', 'description': 'Global options applied to all ``distutils`` commands'}}, 'patternProperties': {'.+': {'type': 'object'}}, '$comment': 'TODO: Is there a practical way of making this schema more specific?'}, rule='type')
        data_is_dict = isinstance(data, dict)
        if data_is_dict:
            data_keys = set(data.keys())
            if "global" in data_keys:
                data_keys.remove("global")
                data__global = data["global"]
                if not isinstance(data__global, (dict)):
                    raise JsonSchemaValueException("" + (name_prefix or "data") + ".global must be object", value=data__global, name="" + (name_prefix or "data") + ".global", definition={'type': 'object', 'description': 'Global options applied to all ``distutils`` commands'}, rule='type')
            for data_key, data_val in data.items():
                if REGEX_PATTERNS['.+'].search(data_key):
                    if data_key in data_keys:
                        data_keys.remove(data_key)
                    if not isinstance(data_val, (dict)):
                        raise JsonSchemaValueException("" + (name_prefix or "data") + ".{data_key}".format(**locals()) + " must be object", value=data_val, name="" + (name_prefix or "data") + ".{data_key}".format(**locals()) + "", definition={'type': 'object'}, rule='type')
        return data
    
    def validate_https___packaging_python_org_en_latest_specifications_declaring_project_metadata(data, custom_formats={}, name_prefix=None):
        if not isinstance(data, (dict)):
            raise JsonSchemaValueException("" + (name_prefix or "data") + " must be object", value=data, name="" + (name_prefix or "data") + "", definition={'$schema': 'http://json-schema.org/draft-07/schema', '$id': 'https://packaging.python.org/en/latest/specifications/declaring-project-metadata/', 'title': 'Package metadata stored in the ``project`` table', '$$description': ['Data structure for the **project** table inside ``pyproject.toml``', '(as initially defined in :pep:`621`)'], 'type': 'object', 'properties': {'name': {'type': 'string', 'description': 'The name (primary identifier) of the project. MUST be statically defined.', 'format': 'pep508-identifier'}, 'version': {'type': 'string', 'description': 'The version of the project as supported by :pep:`440`.', 'format': 'pep440'}, 'description': {'type': 'string', '$$description': ['The `summary description of the project', '`_']}, 'readme': {'$$description': ['`Full/detailed description of the project in the form of a README', '`_', "with meaning similar to the one defined in `core metadata's Description", '`_'], 'oneOf': [{'type': 'string', '$$description': ['Relative path to a text file (UTF-8) containing the full description', 'of the project. If the file path ends in case-insensitive ``.md`` or', '``.rst`` suffixes, then the content-type is respectively', '``text/markdown`` or ``text/x-rst``']}, {'type': 'object', 'allOf': [{'anyOf': [{'properties': {'file': {'type': 'string', '$$description': ['Relative path to a text file containing the full description', 'of the project.']}}, 'required': ['file']}, {'properties': {'text': {'type': 'string', 'description': 'Full text describing the project.'}}, 'required': ['text']}]}, {'properties': {'content-type': {'type': 'string', '$$description': ['Content-type (:rfc:`1341`) of the full description', '(e.g. ``text/markdown``). The ``charset`` parameter is assumed', 'UTF-8 when not present.'], '$comment': 'TODO: add regex pattern or format?'}}, 'required': ['content-type']}]}]}, 'requires-python': {'type': 'string', 'format': 'pep508-versionspec', '$$description': ['`The Python version requirements of the project', '`_.']}, 'license': {'description': '`Project license `_.', 'oneOf': [{'properties': {'file': {'type': 'string', '$$description': ['Relative path to the file (UTF-8) which contains the license for the', 'project.']}}, 'required': ['file']}, {'properties': {'text': {'type': 'string', '$$description': ['The license of the project whose meaning is that of the', '`License field from the core metadata', '`_.']}}, 'required': ['text']}]}, 'authors': {'type': 'array', 'items': {'$id': '#/definitions/author', 'title': 'Author or Maintainer', '$comment': 'https://peps.python.org/pep-0621/#authors-maintainers', 'type': 'object', 'additionalProperties': False, 'properties': {'name': {'type': 'string', '$$description': ['MUST be a valid email name, i.e. whatever can be put as a name, before an', 'email, in :rfc:`822`.']}, 'email': {'type': 'string', 'format': 'idn-email', 'description': 'MUST be a valid email address'}}}, '$$description': ["The people or organizations considered to be the 'authors' of the project.", 'The exact meaning is open to interpretation (e.g. original or primary authors,', 'current maintainers, or owners of the package).']}, 'maintainers': {'type': 'array', 'items': {'$id': '#/definitions/author', 'title': 'Author or Maintainer', '$comment': 'https://peps.python.org/pep-0621/#authors-maintainers', 'type': 'object', 'additionalProperties': False, 'properties': {'name': {'type': 'string', '$$description': ['MUST be a valid email name, i.e. whatever can be put as a name, before an', 'email, in :rfc:`822`.']}, 'email': {'type': 'string', 'format': 'idn-email', 'description': 'MUST be a valid email address'}}}, '$$description': ["The people or organizations considered to be the 'maintainers' of the project.", 'Similarly to ``authors``, the exact meaning is open to interpretation.']}, 'keywords': {'type': 'array', 'items': {'type': 'string'}, 'description': 'List of keywords to assist searching for the distribution in a larger catalog.'}, 'classifiers': {'type': 'array', 'items': {'type': 'string', 'format': 'trove-classifier', 'description': '`PyPI classifier `_.'}, '$$description': ['`Trove classifiers `_', 'which apply to the project.']}, 'urls': {'type': 'object', 'description': 'URLs associated with the project in the form ``label => value``.', 'additionalProperties': False, 'patternProperties': {'^.+$': {'type': 'string', 'format': 'url'}}}, 'scripts': {'$id': '#/definitions/entry-point-group', 'title': 'Entry-points', 'type': 'object', '$$description': ['Entry-points are grouped together to indicate what sort of capabilities they', 'provide.', 'See the `packaging guides', '`_', 'and `setuptools docs', '`_', 'for more information.'], 'propertyNames': {'format': 'python-entrypoint-name'}, 'additionalProperties': False, 'patternProperties': {'^.+$': {'type': 'string', '$$description': ['Reference to a Python object. It is either in the form', '``importable.module``, or ``importable.module:object.attr``.'], 'format': 'python-entrypoint-reference', '$comment': 'https://packaging.python.org/specifications/entry-points/'}}}, 'gui-scripts': {'$id': '#/definitions/entry-point-group', 'title': 'Entry-points', 'type': 'object', '$$description': ['Entry-points are grouped together to indicate what sort of capabilities they', 'provide.', 'See the `packaging guides', '`_', 'and `setuptools docs', '`_', 'for more information.'], 'propertyNames': {'format': 'python-entrypoint-name'}, 'additionalProperties': False, 'patternProperties': {'^.+$': {'type': 'string', '$$description': ['Reference to a Python object. It is either in the form', '``importable.module``, or ``importable.module:object.attr``.'], 'format': 'python-entrypoint-reference', '$comment': 'https://packaging.python.org/specifications/entry-points/'}}}, 'entry-points': {'$$description': ['Instruct the installer to expose the given modules/functions via', '``entry-point`` discovery mechanism (useful for plugins).', 'More information available in the `Python packaging guide', '`_.'], 'propertyNames': {'format': 'python-entrypoint-group'}, 'additionalProperties': False, 'patternProperties': {'^.+$': {'$id': '#/definitions/entry-point-group', 'title': 'Entry-points', 'type': 'object', '$$description': ['Entry-points are grouped together to indicate what sort of capabilities they', 'provide.', 'See the `packaging guides', '`_', 'and `setuptools docs', '`_', 'for more information.'], 'propertyNames': {'format': 'python-entrypoint-name'}, 'additionalProperties': False, 'patternProperties': {'^.+$': {'type': 'string', '$$description': ['Reference to a Python object. It is either in the form', '``importable.module``, or ``importable.module:object.attr``.'], 'format': 'python-entrypoint-reference', '$comment': 'https://packaging.python.org/specifications/entry-points/'}}}}}, 'dependencies': {'type': 'array', 'description': 'Project (mandatory) dependencies.', 'items': {'$id': '#/definitions/dependency', 'title': 'Dependency', 'type': 'string', 'description': 'Project dependency specification according to PEP 508', 'format': 'pep508'}}, 'optional-dependencies': {'type': 'object', 'description': 'Optional dependency for the project', 'propertyNames': {'format': 'pep508-identifier'}, 'additionalProperties': False, 'patternProperties': {'^.+$': {'type': 'array', 'items': {'$id': '#/definitions/dependency', 'title': 'Dependency', 'type': 'string', 'description': 'Project dependency specification according to PEP 508', 'format': 'pep508'}}}}, 'dynamic': {'type': 'array', '$$description': ['Specifies which fields are intentionally unspecified and expected to be', 'dynamically provided by build tools'], 'items': {'enum': ['version', 'description', 'readme', 'requires-python', 'license', 'authors', 'maintainers', 'keywords', 'classifiers', 'urls', 'scripts', 'gui-scripts', 'entry-points', 'dependencies', 'optional-dependencies']}}}, 'required': ['name'], 'additionalProperties': False, 'if': {'not': {'required': ['dynamic'], 'properties': {'dynamic': {'contains': {'const': 'version'}, '$$description': ['version is listed in ``dynamic``']}}}, '$$comment': ['According to :pep:`621`:', '    If the core metadata specification lists a field as "Required", then', '    the metadata MUST specify the field statically or list it in dynamic', 'In turn, `core metadata`_ defines:', '    The required fields are: Metadata-Version, Name, Version.', '    All the other fields are optional.', 'Since ``Metadata-Version`` is defined by the build back-end, ``name`` and', '``version`` are the only mandatory information in ``pyproject.toml``.', '.. _core metadata: https://packaging.python.org/specifications/core-metadata/']}, 'then': {'required': ['version'], '$$description': ['version should be statically defined in the ``version`` field']}, 'definitions': {'author': {'$id': '#/definitions/author', 'title': 'Author or Maintainer', '$comment': 'https://peps.python.org/pep-0621/#authors-maintainers', 'type': 'object', 'additionalProperties': False, 'properties': {'name': {'type': 'string', '$$description': ['MUST be a valid email name, i.e. whatever can be put as a name, before an', 'email, in :rfc:`822`.']}, 'email': {'type': 'string', 'format': 'idn-email', 'description': 'MUST be a valid email address'}}}, 'entry-point-group': {'$id': '#/definitions/entry-point-group', 'title': 'Entry-points', 'type': 'object', '$$description': ['Entry-points are grouped together to indicate what sort of capabilities they', 'provide.', 'See the `packaging guides', '`_', 'and `setuptools docs', '`_', 'for more information.'], 'propertyNames': {'format': 'python-entrypoint-name'}, 'additionalProperties': False, 'patternProperties': {'^.+$': {'type': 'string', '$$description': ['Reference to a Python object. It is either in the form', '``importable.module``, or ``importable.module:object.attr``.'], 'format': 'python-entrypoint-reference', '$comment': 'https://packaging.python.org/specifications/entry-points/'}}}, 'dependency': {'$id': '#/definitions/dependency', 'title': 'Dependency', 'type': 'string', 'description': 'Project dependency specification according to PEP 508', 'format': 'pep508'}}}, rule='type')
        data_is_dict = isinstance(data, dict)
        if data_is_dict:
            data_len = len(data)
            if not all(prop in data for prop in ['name']):
                raise JsonSchemaValueException("" + (name_prefix or "data") + " must contain ['name'] properties", value=data, name="" + (name_prefix or "data") + "", definition={'$schema': 'http://json-schema.org/draft-07/schema', '$id': 'https://packaging.python.org/en/latest/specifications/declaring-project-metadata/', 'title': 'Package metadata stored in the ``project`` table', '$$description': ['Data structure for the **project** table inside ``pyproject.toml``', '(as initially defined in :pep:`621`)'], 'type': 'object', 'properties': {'name': {'type': 'string', 'description': 'The name (primary identifier) of the project. MUST be statically defined.', 'format': 'pep508-identifier'}, 'version': {'type': 'string', 'description': 'The version of the project as supported by :pep:`440`.', 'format': 'pep440'}, 'description': {'type': 'string', '$$description': ['The `summary description of the project', '`_']}, 'readme': {'$$description': ['`Full/detailed description of the project in the form of a README', '`_', "with meaning similar to the one defined in `core metadata's Description", '`_'], 'oneOf': [{'type': 'string', '$$description': ['Relative path to a text file (UTF-8) containing the full description', 'of the project. If the file path ends in case-insensitive ``.md`` or', '``.rst`` suffixes, then the content-type is respectively', '``text/markdown`` or ``text/x-rst``']}, {'type': 'object', 'allOf': [{'anyOf': [{'properties': {'file': {'type': 'string', '$$description': ['Relative path to a text file containing the full description', 'of the project.']}}, 'required': ['file']}, {'properties': {'text': {'type': 'string', 'description': 'Full text describing the project.'}}, 'required': ['text']}]}, {'properties': {'content-type': {'type': 'string', '$$description': ['Content-type (:rfc:`1341`) of the full description', '(e.g. ``text/markdown``). The ``charset`` parameter is assumed', 'UTF-8 when not present.'], '$comment': 'TODO: add regex pattern or format?'}}, 'required': ['content-type']}]}]}, 'requires-python': {'type': 'string', 'format': 'pep508-versionspec', '$$description': ['`The Python version requirements of the project', '`_.']}, 'license': {'description': '`Project license `_.', 'oneOf': [{'properties': {'file': {'type': 'string', '$$description': ['Relative path to the file (UTF-8) which contains the license for the', 'project.']}}, 'required': ['file']}, {'properties': {'text': {'type': 'string', '$$description': ['The license of the project whose meaning is that of the', '`License field from the core metadata', '`_.']}}, 'required': ['text']}]}, 'authors': {'type': 'array', 'items': {'$id': '#/definitions/author', 'title': 'Author or Maintainer', '$comment': 'https://peps.python.org/pep-0621/#authors-maintainers', 'type': 'object', 'additionalProperties': False, 'properties': {'name': {'type': 'string', '$$description': ['MUST be a valid email name, i.e. whatever can be put as a name, before an', 'email, in :rfc:`822`.']}, 'email': {'type': 'string', 'format': 'idn-email', 'description': 'MUST be a valid email address'}}}, '$$description': ["The people or organizations considered to be the 'authors' of the project.", 'The exact meaning is open to interpretation (e.g. original or primary authors,', 'current maintainers, or owners of the package).']}, 'maintainers': {'type': 'array', 'items': {'$id': '#/definitions/author', 'title': 'Author or Maintainer', '$comment': 'https://peps.python.org/pep-0621/#authors-maintainers', 'type': 'object', 'additionalProperties': False, 'properties': {'name': {'type': 'string', '$$description': ['MUST be a valid email name, i.e. whatever can be put as a name, before an', 'email, in :rfc:`822`.']}, 'email': {'type': 'string', 'format': 'idn-email', 'description': 'MUST be a valid email address'}}}, '$$description': ["The people or organizations considered to be the 'maintainers' of the project.", 'Similarly to ``authors``, the exact meaning is open to interpretation.']}, 'keywords': {'type': 'array', 'items': {'type': 'string'}, 'description': 'List of keywords to assist searching for the distribution in a larger catalog.'}, 'classifiers': {'type': 'array', 'items': {'type': 'string', 'format': 'trove-classifier', 'description': '`PyPI classifier `_.'}, '$$description': ['`Trove classifiers `_', 'which apply to the project.']}, 'urls': {'type': 'object', 'description': 'URLs associated with the project in the form ``label => value``.', 'additionalProperties': False, 'patternProperties': {'^.+$': {'type': 'string', 'format': 'url'}}}, 'scripts': {'$id': '#/definitions/entry-point-group', 'title': 'Entry-points', 'type': 'object', '$$description': ['Entry-points are grouped together to indicate what sort of capabilities they', 'provide.', 'See the `packaging guides', '`_', 'and `setuptools docs', '`_', 'for more information.'], 'propertyNames': {'format': 'python-entrypoint-name'}, 'additionalProperties': False, 'patternProperties': {'^.+$': {'type': 'string', '$$description': ['Reference to a Python object. It is either in the form', '``importable.module``, or ``importable.module:object.attr``.'], 'format': 'python-entrypoint-reference', '$comment': 'https://packaging.python.org/specifications/entry-points/'}}}, 'gui-scripts': {'$id': '#/definitions/entry-point-group', 'title': 'Entry-points', 'type': 'object', '$$description': ['Entry-points are grouped together to indicate what sort of capabilities they', 'provide.', 'See the `packaging guides', '`_', 'and `setuptools docs', '`_', 'for more information.'], 'propertyNames': {'format': 'python-entrypoint-name'}, 'additionalProperties': False, 'patternProperties': {'^.+$': {'type': 'string', '$$description': ['Reference to a Python object. It is either in the form', '``importable.module``, or ``importable.module:object.attr``.'], 'format': 'python-entrypoint-reference', '$comment': 'https://packaging.python.org/specifications/entry-points/'}}}, 'entry-points': {'$$description': ['Instruct the installer to expose the given modules/functions via', '``entry-point`` discovery mechanism (useful for plugins).', 'More information available in the `Python packaging guide', '`_.'], 'propertyNames': {'format': 'python-entrypoint-group'}, 'additionalProperties': False, 'patternProperties': {'^.+$': {'$id': '#/definitions/entry-point-group', 'title': 'Entry-points', 'type': 'object', '$$description': ['Entry-points are grouped together to indicate what sort of capabilities they', 'provide.', 'See the `packaging guides', '`_', 'and `setuptools docs', '`_', 'for more information.'], 'propertyNames': {'format': 'python-entrypoint-name'}, 'additionalProperties': False, 'patternProperties': {'^.+$': {'type': 'string', '$$description': ['Reference to a Python object. It is either in the form', '``importable.module``, or ``importable.module:object.attr``.'], 'format': 'python-entrypoint-reference', '$comment': 'https://packaging.python.org/specifications/entry-points/'}}}}}, 'dependencies': {'type': 'array', 'description': 'Project (mandatory) dependencies.', 'items': {'$id': '#/definitions/dependency', 'title': 'Dependency', 'type': 'string', 'description': 'Project dependency specification according to PEP 508', 'format': 'pep508'}}, 'optional-dependencies': {'type': 'object', 'description': 'Optional dependency for the project', 'propertyNames': {'format': 'pep508-identifier'}, 'additionalProperties': False, 'patternProperties': {'^.+$': {'type': 'array', 'items': {'$id': '#/definitions/dependency', 'title': 'Dependency', 'type': 'string', 'description': 'Project dependency specification according to PEP 508', 'format': 'pep508'}}}}, 'dynamic': {'type': 'array', '$$description': ['Specifies which fields are intentionally unspecified and expected to be', 'dynamically provided by build tools'], 'items': {'enum': ['version', 'description', 'readme', 'requires-python', 'license', 'authors', 'maintainers', 'keywords', 'classifiers', 'urls', 'scripts', 'gui-scripts', 'entry-points', 'dependencies', 'optional-dependencies']}}}, 'required': ['name'], 'additionalProperties': False, 'if': {'not': {'required': ['dynamic'], 'properties': {'dynamic': {'contains': {'const': 'version'}, '$$description': ['version is listed in ``dynamic``']}}}, '$$comment': ['According to :pep:`621`:', '    If the core metadata specification lists a field as "Required", then', '    the metadata MUST specify the field statically or list it in dynamic', 'In turn, `core metadata`_ defines:', '    The required fields are: Metadata-Version, Name, Version.', '    All the other fields are optional.', 'Since ``Metadata-Version`` is defined by the build back-end, ``name`` and', '``version`` are the only mandatory information in ``pyproject.toml``.', '.. _core metadata: https://packaging.python.org/specifications/core-metadata/']}, 'then': {'required': ['version'], '$$description': ['version should be statically defined in the ``version`` field']}, 'definitions': {'author': {'$id': '#/definitions/author', 'title': 'Author or Maintainer', '$comment': 'https://peps.python.org/pep-0621/#authors-maintainers', 'type': 'object', 'additionalProperties': False, 'properties': {'name': {'type': 'string', '$$description': ['MUST be a valid email name, i.e. whatever can be put as a name, before an', 'email, in :rfc:`822`.']}, 'email': {'type': 'string', 'format': 'idn-email', 'description': 'MUST be a valid email address'}}}, 'entry-point-group': {'$id': '#/definitions/entry-point-group', 'title': 'Entry-points', 'type': 'object', '$$description': ['Entry-points are grouped together to indicate what sort of capabilities they', 'provide.', 'See the `packaging guides', '`_', 'and `setuptools docs', '`_', 'for more information.'], 'propertyNames': {'format': 'python-entrypoint-name'}, 'additionalProperties': False, 'patternProperties': {'^.+$': {'type': 'string', '$$description': ['Reference to a Python object. It is either in the form', '``importable.module``, or ``importable.module:object.attr``.'], 'format': 'python-entrypoint-reference', '$comment': 'https://packaging.python.org/specifications/entry-points/'}}}, 'dependency': {'$id': '#/definitions/dependency', 'title': 'Dependency', 'type': 'string', 'description': 'Project dependency specification according to PEP 508', 'format': 'pep508'}}}, rule='required')
            data_keys = set(data.keys())
            if "name" in data_keys:
                data_keys.remove("name")
                data__name = data["name"]
                if not isinstance(data__name, (str)):
                    raise JsonSchemaValueException("" + (name_prefix or "data") + ".name must be string", value=data__name, name="" + (name_prefix or "data") + ".name", definition={'type': 'string', 'description': 'The name (primary identifier) of the project. MUST be statically defined.', 'format': 'pep508-identifier'}, rule='type')
                if isinstance(data__name, str):
                    if not custom_formats["pep508-identifier"](data__name):
                        raise JsonSchemaValueException("" + (name_prefix or "data") + ".name must be pep508-identifier", value=data__name, name="" + (name_prefix or "data") + ".name", definition={'type': 'string', 'description': 'The name (primary identifier) of the project. MUST be statically defined.', 'format': 'pep508-identifier'}, rule='format')
            if "version" in data_keys:
                data_keys.remove("version")
                data__version = data["version"]
                if not isinstance(data__version, (str)):
                    raise JsonSchemaValueException("" + (name_prefix or "data") + ".version must be string", value=data__version, name="" + (name_prefix or "data") + ".version", definition={'type': 'string', 'description': 'The version of the project as supported by :pep:`440`.', 'format': 'pep440'}, rule='type')
                if isinstance(data__version, str):
                    if not custom_formats["pep440"](data__version):
                        raise JsonSchemaValueException("" + (name_prefix or "data") + ".version must be pep440", value=data__version, name="" + (name_prefix or "data") + ".version", definition={'type': 'string', 'description': 'The version of the project as supported by :pep:`440`.', 'format': 'pep440'}, rule='format')
            if "description" in data_keys:
                data_keys.remove("description")
                data__description = data["description"]
                if not isinstance(data__description, (str)):
                    raise JsonSchemaValueException("" + (name_prefix or "data") + ".description must be string", value=data__description, name="" + (name_prefix or "data") + ".description", definition={'type': 'string', '$$description': ['The `summary description of the project', '`_']}, rule='type')
            if "readme" in data_keys:
                data_keys.remove("readme")
                data__readme = data["readme"]
                data__readme_one_of_count9 = 0
                if data__readme_one_of_count9 < 2:
                    try:
                        if not isinstance(data__readme, (str)):
                            raise JsonSchemaValueException("" + (name_prefix or "data") + ".readme must be string", value=data__readme, name="" + (name_prefix or "data") + ".readme", definition={'type': 'string', '$$description': ['Relative path to a text file (UTF-8) containing the full description', 'of the project. If the file path ends in case-insensitive ``.md`` or', '``.rst`` suffixes, then the content-type is respectively', '``text/markdown`` or ``text/x-rst``']}, rule='type')
                        data__readme_one_of_count9 += 1
                    except JsonSchemaValueException: pass
                if data__readme_one_of_count9 < 2:
                    try:
                        if not isinstance(data__readme, (dict)):
                            raise JsonSchemaValueException("" + (name_prefix or "data") + ".readme must be object", value=data__readme, name="" + (name_prefix or "data") + ".readme", definition={'type': 'object', 'allOf': [{'anyOf': [{'properties': {'file': {'type': 'string', '$$description': ['Relative path to a text file containing the full description', 'of the project.']}}, 'required': ['file']}, {'properties': {'text': {'type': 'string', 'description': 'Full text describing the project.'}}, 'required': ['text']}]}, {'properties': {'content-type': {'type': 'string', '$$description': ['Content-type (:rfc:`1341`) of the full description', '(e.g. ``text/markdown``). The ``charset`` parameter is assumed', 'UTF-8 when not present.'], '$comment': 'TODO: add regex pattern or format?'}}, 'required': ['content-type']}]}, rule='type')
                        data__readme_any_of_count10 = 0
                        if not data__readme_any_of_count10:
                            try:
                                data__readme_is_dict = isinstance(data__readme, dict)
                                if data__readme_is_dict:
                                    data__readme_len = len(data__readme)
                                    if not all(prop in data__readme for prop in ['file']):
                                        raise JsonSchemaValueException("" + (name_prefix or "data") + ".readme must contain ['file'] properties", value=data__readme, name="" + (name_prefix or "data") + ".readme", definition={'properties': {'file': {'type': 'string', '$$description': ['Relative path to a text file containing the full description', 'of the project.']}}, 'required': ['file']}, rule='required')
                                    data__readme_keys = set(data__readme.keys())
                                    if "file" in data__readme_keys:
                                        data__readme_keys.remove("file")
                                        data__readme__file = data__readme["file"]
                                        if not isinstance(data__readme__file, (str)):
                                            raise JsonSchemaValueException("" + (name_prefix or "data") + ".readme.file must be string", value=data__readme__file, name="" + (name_prefix or "data") + ".readme.file", definition={'type': 'string', '$$description': ['Relative path to a text file containing the full description', 'of the project.']}, rule='type')
                                data__readme_any_of_count10 += 1
                            except JsonSchemaValueException: pass
                        if not data__readme_any_of_count10:
                            try:
                                data__readme_is_dict = isinstance(data__readme, dict)
                                if data__readme_is_dict:
                                    data__readme_len = len(data__readme)
                                    if not all(prop in data__readme for prop in ['text']):
                                        raise JsonSchemaValueException("" + (name_prefix or "data") + ".readme must contain ['text'] properties", value=data__readme, name="" + (name_prefix or "data") + ".readme", definition={'properties': {'text': {'type': 'string', 'description': 'Full text describing the project.'}}, 'required': ['text']}, rule='required')
                                    data__readme_keys = set(data__readme.keys())
                                    if "text" in data__readme_keys:
                                        data__readme_keys.remove("text")
                                        data__readme__text = data__readme["text"]
                                        if not isinstance(data__readme__text, (str)):
                                            raise JsonSchemaValueException("" + (name_prefix or "data") + ".readme.text must be string", value=data__readme__text, name="" + (name_prefix or "data") + ".readme.text", definition={'type': 'string', 'description': 'Full text describing the project.'}, rule='type')
                                data__readme_any_of_count10 += 1
                            except JsonSchemaValueException: pass
                        if not data__readme_any_of_count10:
                            raise JsonSchemaValueException("" + (name_prefix or "data") + ".readme cannot be validated by any definition", value=data__readme, name="" + (name_prefix or "data") + ".readme", definition={'anyOf': [{'properties': {'file': {'type': 'string', '$$description': ['Relative path to a text file containing the full description', 'of the project.']}}, 'required': ['file']}, {'properties': {'text': {'type': 'string', 'description': 'Full text describing the project.'}}, 'required': ['text']}]}, rule='anyOf')
                        data__readme_is_dict = isinstance(data__readme, dict)
                        if data__readme_is_dict:
                            data__readme_len = len(data__readme)
                            if not all(prop in data__readme for prop in ['content-type']):
                                raise JsonSchemaValueException("" + (name_prefix or "data") + ".readme must contain ['content-type'] properties", value=data__readme, name="" + (name_prefix or "data") + ".readme", definition={'properties': {'content-type': {'type': 'string', '$$description': ['Content-type (:rfc:`1341`) of the full description', '(e.g. ``text/markdown``). The ``charset`` parameter is assumed', 'UTF-8 when not present.'], '$comment': 'TODO: add regex pattern or format?'}}, 'required': ['content-type']}, rule='required')
                            data__readme_keys = set(data__readme.keys())
                            if "content-type" in data__readme_keys:
                                data__readme_keys.remove("content-type")
                                data__readme__contenttype = data__readme["content-type"]
                                if not isinstance(data__readme__contenttype, (str)):
                                    raise JsonSchemaValueException("" + (name_prefix or "data") + ".readme.content-type must be string", value=data__readme__contenttype, name="" + (name_prefix or "data") + ".readme.content-type", definition={'type': 'string', '$$description': ['Content-type (:rfc:`1341`) of the full description', '(e.g. ``text/markdown``). The ``charset`` parameter is assumed', 'UTF-8 when not present.'], '$comment': 'TODO: add regex pattern or format?'}, rule='type')
                        data__readme_one_of_count9 += 1
                    except JsonSchemaValueException: pass
                if data__readme_one_of_count9 != 1:
                    raise JsonSchemaValueException("" + (name_prefix or "data") + ".readme must be valid exactly by one definition" + (" (" + str(data__readme_one_of_count9) + " matches found)"), value=data__readme, name="" + (name_prefix or "data") + ".readme", definition={'$$description': ['`Full/detailed description of the project in the form of a README', '`_', "with meaning similar to the one defined in `core metadata's Description", '`_'], 'oneOf': [{'type': 'string', '$$description': ['Relative path to a text file (UTF-8) containing the full description', 'of the project. If the file path ends in case-insensitive ``.md`` or', '``.rst`` suffixes, then the content-type is respectively', '``text/markdown`` or ``text/x-rst``']}, {'type': 'object', 'allOf': [{'anyOf': [{'properties': {'file': {'type': 'string', '$$description': ['Relative path to a text file containing the full description', 'of the project.']}}, 'required': ['file']}, {'properties': {'text': {'type': 'string', 'description': 'Full text describing the project.'}}, 'required': ['text']}]}, {'properties': {'content-type': {'type': 'string', '$$description': ['Content-type (:rfc:`1341`) of the full description', '(e.g. ``text/markdown``). The ``charset`` parameter is assumed', 'UTF-8 when not present.'], '$comment': 'TODO: add regex pattern or format?'}}, 'required': ['content-type']}]}]}, rule='oneOf')
            if "requires-python" in data_keys:
                data_keys.remove("requires-python")
                data__requirespython = data["requires-python"]
                if not isinstance(data__requirespython, (str)):
                    raise JsonSchemaValueException("" + (name_prefix or "data") + ".requires-python must be string", value=data__requirespython, name="" + (name_prefix or "data") + ".requires-python", definition={'type': 'string', 'format': 'pep508-versionspec', '$$description': ['`The Python version requirements of the project', '`_.']}, rule='type')
                if isinstance(data__requirespython, str):
                    if not custom_formats["pep508-versionspec"](data__requirespython):
                        raise JsonSchemaValueException("" + (name_prefix or "data") + ".requires-python must be pep508-versionspec", value=data__requirespython, name="" + (name_prefix or "data") + ".requires-python", definition={'type': 'string', 'format': 'pep508-versionspec', '$$description': ['`The Python version requirements of the project', '`_.']}, rule='format')
            if "license" in data_keys:
                data_keys.remove("license")
                data__license = data["license"]
                data__license_one_of_count11 = 0
                if data__license_one_of_count11 < 2:
                    try:
                        data__license_is_dict = isinstance(data__license, dict)
                        if data__license_is_dict:
                            data__license_len = len(data__license)
                            if not all(prop in data__license for prop in ['file']):
                                raise JsonSchemaValueException("" + (name_prefix or "data") + ".license must contain ['file'] properties", value=data__license, name="" + (name_prefix or "data") + ".license", definition={'properties': {'file': {'type': 'string', '$$description': ['Relative path to the file (UTF-8) which contains the license for the', 'project.']}}, 'required': ['file']}, rule='required')
                            data__license_keys = set(data__license.keys())
                            if "file" in data__license_keys:
                                data__license_keys.remove("file")
                                data__license__file = data__license["file"]
                                if not isinstance(data__license__file, (str)):
                                    raise JsonSchemaValueException("" + (name_prefix or "data") + ".license.file must be string", value=data__license__file, name="" + (name_prefix or "data") + ".license.file", definition={'type': 'string', '$$description': ['Relative path to the file (UTF-8) which contains the license for the', 'project.']}, rule='type')
                        data__license_one_of_count11 += 1
                    except JsonSchemaValueException: pass
                if data__license_one_of_count11 < 2:
                    try:
                        data__license_is_dict = isinstance(data__license, dict)
                        if data__license_is_dict:
                            data__license_len = len(data__license)
                            if not all(prop in data__license for prop in ['text']):
                                raise JsonSchemaValueException("" + (name_prefix or "data") + ".license must contain ['text'] properties", value=data__license, name="" + (name_prefix or "data") + ".license", definition={'properties': {'text': {'type': 'string', '$$description': ['The license of the project whose meaning is that of the', '`License field from the core metadata', '`_.']}}, 'required': ['text']}, rule='required')
                            data__license_keys = set(data__license.keys())
                            if "text" in data__license_keys:
                                data__license_keys.remove("text")
                                data__license__text = data__license["text"]
                                if not isinstance(data__license__text, (str)):
                                    raise JsonSchemaValueException("" + (name_prefix or "data") + ".license.text must be string", value=data__license__text, name="" + (name_prefix or "data") + ".license.text", definition={'type': 'string', '$$description': ['The license of the project whose meaning is that of the', '`License field from the core metadata', '`_.']}, rule='type')
                        data__license_one_of_count11 += 1
                    except JsonSchemaValueException: pass
                if data__license_one_of_count11 != 1:
                    raise JsonSchemaValueException("" + (name_prefix or "data") + ".license must be valid exactly by one definition" + (" (" + str(data__license_one_of_count11) + " matches found)"), value=data__license, name="" + (name_prefix or "data") + ".license", definition={'description': '`Project license `_.', 'oneOf': [{'properties': {'file': {'type': 'string', '$$description': ['Relative path to the file (UTF-8) which contains the license for the', 'project.']}}, 'required': ['file']}, {'properties': {'text': {'type': 'string', '$$description': ['The license of the project whose meaning is that of the', '`License field from the core metadata', '`_.']}}, 'required': ['text']}]}, rule='oneOf')
            if "authors" in data_keys:
                data_keys.remove("authors")
                data__authors = data["authors"]
                if not isinstance(data__authors, (list, tuple)):
                    raise JsonSchemaValueException("" + (name_prefix or "data") + ".authors must be array", value=data__authors, name="" + (name_prefix or "data") + ".authors", definition={'type': 'array', 'items': {'$id': '#/definitions/author', 'title': 'Author or Maintainer', '$comment': 'https://peps.python.org/pep-0621/#authors-maintainers', 'type': 'object', 'additionalProperties': False, 'properties': {'name': {'type': 'string', '$$description': ['MUST be a valid email name, i.e. whatever can be put as a name, before an', 'email, in :rfc:`822`.']}, 'email': {'type': 'string', 'format': 'idn-email', 'description': 'MUST be a valid email address'}}}, '$$description': ["The people or organizations considered to be the 'authors' of the project.", 'The exact meaning is open to interpretation (e.g. original or primary authors,', 'current maintainers, or owners of the package).']}, rule='type')
                data__authors_is_list = isinstance(data__authors, (list, tuple))
                if data__authors_is_list:
                    data__authors_len = len(data__authors)
                    for data__authors_x, data__authors_item in enumerate(data__authors):
                        validate_https___packaging_python_org_en_latest_specifications_declaring_project_metadata___definitions_author(data__authors_item, custom_formats, (name_prefix or "data") + ".authors[{data__authors_x}]".format(**locals()))
            if "maintainers" in data_keys:
                data_keys.remove("maintainers")
                data__maintainers = data["maintainers"]
                if not isinstance(data__maintainers, (list, tuple)):
                    raise JsonSchemaValueException("" + (name_prefix or "data") + ".maintainers must be array", value=data__maintainers, name="" + (name_prefix or "data") + ".maintainers", definition={'type': 'array', 'items': {'$id': '#/definitions/author', 'title': 'Author or Maintainer', '$comment': 'https://peps.python.org/pep-0621/#authors-maintainers', 'type': 'object', 'additionalProperties': False, 'properties': {'name': {'type': 'string', '$$description': ['MUST be a valid email name, i.e. whatever can be put as a name, before an', 'email, in :rfc:`822`.']}, 'email': {'type': 'string', 'format': 'idn-email', 'description': 'MUST be a valid email address'}}}, '$$description': ["The people or organizations considered to be the 'maintainers' of the project.", 'Similarly to ``authors``, the exact meaning is open to interpretation.']}, rule='type')
                data__maintainers_is_list = isinstance(data__maintainers, (list, tuple))
                if data__maintainers_is_list:
                    data__maintainers_len = len(data__maintainers)
                    for data__maintainers_x, data__maintainers_item in enumerate(data__maintainers):
                        validate_https___packaging_python_org_en_latest_specifications_declaring_project_metadata___definitions_author(data__maintainers_item, custom_formats, (name_prefix or "data") + ".maintainers[{data__maintainers_x}]".format(**locals()))
            if "keywords" in data_keys:
                data_keys.remove("keywords")
                data__keywords = data["keywords"]
                if not isinstance(data__keywords, (list, tuple)):
                    raise JsonSchemaValueException("" + (name_prefix or "data") + ".keywords must be array", value=data__keywords, name="" + (name_prefix or "data") + ".keywords", definition={'type': 'array', 'items': {'type': 'string'}, 'description': 'List of keywords to assist searching for the distribution in a larger catalog.'}, rule='type')
                data__keywords_is_list = isinstance(data__keywords, (list, tuple))
                if data__keywords_is_list:
                    data__keywords_len = len(data__keywords)
                    for data__keywords_x, data__keywords_item in enumerate(data__keywords):
                        if not isinstance(data__keywords_item, (str)):
                            raise JsonSchemaValueException("" + (name_prefix or "data") + ".keywords[{data__keywords_x}]".format(**locals()) + " must be string", value=data__keywords_item, name="" + (name_prefix or "data") + ".keywords[{data__keywords_x}]".format(**locals()) + "", definition={'type': 'string'}, rule='type')
            if "classifiers" in data_keys:
                data_keys.remove("classifiers")
                data__classifiers = data["classifiers"]
                if not isinstance(data__classifiers, (list, tuple)):
                    raise JsonSchemaValueException("" + (name_prefix or "data") + ".classifiers must be array", value=data__classifiers, name="" + (name_prefix or "data") + ".classifiers", definition={'type': 'array', 'items': {'type': 'string', 'format': 'trove-classifier', 'description': '`PyPI classifier `_.'}, '$$description': ['`Trove classifiers `_', 'which apply to the project.']}, rule='type')
                data__classifiers_is_list = isinstance(data__classifiers, (list, tuple))
                if data__classifiers_is_list:
                    data__classifiers_len = len(data__classifiers)
                    for data__classifiers_x, data__classifiers_item in enumerate(data__classifiers):
                        if not isinstance(data__classifiers_item, (str)):
                            raise JsonSchemaValueException("" + (name_prefix or "data") + ".classifiers[{data__classifiers_x}]".format(**locals()) + " must be string", value=data__classifiers_item, name="" + (name_prefix or "data") + ".classifiers[{data__classifiers_x}]".format(**locals()) + "", definition={'type': 'string', 'format': 'trove-classifier', 'description': '`PyPI classifier `_.'}, rule='type')
                        if isinstance(data__classifiers_item, str):
                            if not custom_formats["trove-classifier"](data__classifiers_item):
                                raise JsonSchemaValueException("" + (name_prefix or "data") + ".classifiers[{data__classifiers_x}]".format(**locals()) + " must be trove-classifier", value=data__classifiers_item, name="" + (name_prefix or "data") + ".classifiers[{data__classifiers_x}]".format(**locals()) + "", definition={'type': 'string', 'format': 'trove-classifier', 'description': '`PyPI classifier `_.'}, rule='format')
            if "urls" in data_keys:
                data_keys.remove("urls")
                data__urls = data["urls"]
                if not isinstance(data__urls, (dict)):
                    raise JsonSchemaValueException("" + (name_prefix or "data") + ".urls must be object", value=data__urls, name="" + (name_prefix or "data") + ".urls", definition={'type': 'object', 'description': 'URLs associated with the project in the form ``label => value``.', 'additionalProperties': False, 'patternProperties': {'^.+$': {'type': 'string', 'format': 'url'}}}, rule='type')
                data__urls_is_dict = isinstance(data__urls, dict)
                if data__urls_is_dict:
                    data__urls_keys = set(data__urls.keys())
                    for data__urls_key, data__urls_val in data__urls.items():
                        if REGEX_PATTERNS['^.+$'].search(data__urls_key):
                            if data__urls_key in data__urls_keys:
                                data__urls_keys.remove(data__urls_key)
                            if not isinstance(data__urls_val, (str)):
                                raise JsonSchemaValueException("" + (name_prefix or "data") + ".urls.{data__urls_key}".format(**locals()) + " must be string", value=data__urls_val, name="" + (name_prefix or "data") + ".urls.{data__urls_key}".format(**locals()) + "", definition={'type': 'string', 'format': 'url'}, rule='type')
                            if isinstance(data__urls_val, str):
                                if not custom_formats["url"](data__urls_val):
                                    raise JsonSchemaValueException("" + (name_prefix or "data") + ".urls.{data__urls_key}".format(**locals()) + " must be url", value=data__urls_val, name="" + (name_prefix or "data") + ".urls.{data__urls_key}".format(**locals()) + "", definition={'type': 'string', 'format': 'url'}, rule='format')
                    if data__urls_keys:
                        raise JsonSchemaValueException("" + (name_prefix or "data") + ".urls must not contain "+str(data__urls_keys)+" properties", value=data__urls, name="" + (name_prefix or "data") + ".urls", definition={'type': 'object', 'description': 'URLs associated with the project in the form ``label => value``.', 'additionalProperties': False, 'patternProperties': {'^.+$': {'type': 'string', 'format': 'url'}}}, rule='additionalProperties')
            if "scripts" in data_keys:
                data_keys.remove("scripts")
                data__scripts = data["scripts"]
                validate_https___packaging_python_org_en_latest_specifications_declaring_project_metadata___definitions_entry_point_group(data__scripts, custom_formats, (name_prefix or "data") + ".scripts")
            if "gui-scripts" in data_keys:
                data_keys.remove("gui-scripts")
                data__guiscripts = data["gui-scripts"]
                validate_https___packaging_python_org_en_latest_specifications_declaring_project_metadata___definitions_entry_point_group(data__guiscripts, custom_formats, (name_prefix or "data") + ".gui-scripts")
            if "entry-points" in data_keys:
                data_keys.remove("entry-points")
                data__entrypoints = data["entry-points"]
                data__entrypoints_is_dict = isinstance(data__entrypoints, dict)
                if data__entrypoints_is_dict:
                    data__entrypoints_keys = set(data__entrypoints.keys())
                    for data__entrypoints_key, data__entrypoints_val in data__entrypoints.items():
                        if REGEX_PATTERNS['^.+$'].search(data__entrypoints_key):
                            if data__entrypoints_key in data__entrypoints_keys:
                                data__entrypoints_keys.remove(data__entrypoints_key)
                            validate_https___packaging_python_org_en_latest_specifications_declaring_project_metadata___definitions_entry_point_group(data__entrypoints_val, custom_formats, (name_prefix or "data") + ".entry-points.{data__entrypoints_key}".format(**locals()))
                    if data__entrypoints_keys:
                        raise JsonSchemaValueException("" + (name_prefix or "data") + ".entry-points must not contain "+str(data__entrypoints_keys)+" properties", value=data__entrypoints, name="" + (name_prefix or "data") + ".entry-points", definition={'$$description': ['Instruct the installer to expose the given modules/functions via', '``entry-point`` discovery mechanism (useful for plugins).', 'More information available in the `Python packaging guide', '`_.'], 'propertyNames': {'format': 'python-entrypoint-group'}, 'additionalProperties': False, 'patternProperties': {'^.+$': {'$id': '#/definitions/entry-point-group', 'title': 'Entry-points', 'type': 'object', '$$description': ['Entry-points are grouped together to indicate what sort of capabilities they', 'provide.', 'See the `packaging guides', '`_', 'and `setuptools docs', '`_', 'for more information.'], 'propertyNames': {'format': 'python-entrypoint-name'}, 'additionalProperties': False, 'patternProperties': {'^.+$': {'type': 'string', '$$description': ['Reference to a Python object. It is either in the form', '``importable.module``, or ``importable.module:object.attr``.'], 'format': 'python-entrypoint-reference', '$comment': 'https://packaging.python.org/specifications/entry-points/'}}}}}, rule='additionalProperties')
                    data__entrypoints_len = len(data__entrypoints)
                    if data__entrypoints_len != 0:
                        data__entrypoints_property_names = True
                        for data__entrypoints_key in data__entrypoints:
                            try:
                                if isinstance(data__entrypoints_key, str):
                                    if not custom_formats["python-entrypoint-group"](data__entrypoints_key):
                                        raise JsonSchemaValueException("" + (name_prefix or "data") + ".entry-points must be python-entrypoint-group", value=data__entrypoints_key, name="" + (name_prefix or "data") + ".entry-points", definition={'format': 'python-entrypoint-group'}, rule='format')
                            except JsonSchemaValueException:
                                data__entrypoints_property_names = False
                        if not data__entrypoints_property_names:
                            raise JsonSchemaValueException("" + (name_prefix or "data") + ".entry-points must be named by propertyName definition", value=data__entrypoints, name="" + (name_prefix or "data") + ".entry-points", definition={'$$description': ['Instruct the installer to expose the given modules/functions via', '``entry-point`` discovery mechanism (useful for plugins).', 'More information available in the `Python packaging guide', '`_.'], 'propertyNames': {'format': 'python-entrypoint-group'}, 'additionalProperties': False, 'patternProperties': {'^.+$': {'$id': '#/definitions/entry-point-group', 'title': 'Entry-points', 'type': 'object', '$$description': ['Entry-points are grouped together to indicate what sort of capabilities they', 'provide.', 'See the `packaging guides', '`_', 'and `setuptools docs', '`_', 'for more information.'], 'propertyNames': {'format': 'python-entrypoint-name'}, 'additionalProperties': False, 'patternProperties': {'^.+$': {'type': 'string', '$$description': ['Reference to a Python object. It is either in the form', '``importable.module``, or ``importable.module:object.attr``.'], 'format': 'python-entrypoint-reference', '$comment': 'https://packaging.python.org/specifications/entry-points/'}}}}}, rule='propertyNames')
            if "dependencies" in data_keys:
                data_keys.remove("dependencies")
                data__dependencies = data["dependencies"]
                if not isinstance(data__dependencies, (list, tuple)):
                    raise JsonSchemaValueException("" + (name_prefix or "data") + ".dependencies must be array", value=data__dependencies, name="" + (name_prefix or "data") + ".dependencies", definition={'type': 'array', 'description': 'Project (mandatory) dependencies.', 'items': {'$id': '#/definitions/dependency', 'title': 'Dependency', 'type': 'string', 'description': 'Project dependency specification according to PEP 508', 'format': 'pep508'}}, rule='type')
                data__dependencies_is_list = isinstance(data__dependencies, (list, tuple))
                if data__dependencies_is_list:
                    data__dependencies_len = len(data__dependencies)
                    for data__dependencies_x, data__dependencies_item in enumerate(data__dependencies):
                        validate_https___packaging_python_org_en_latest_specifications_declaring_project_metadata___definitions_dependency(data__dependencies_item, custom_formats, (name_prefix or "data") + ".dependencies[{data__dependencies_x}]".format(**locals()))
            if "optional-dependencies" in data_keys:
                data_keys.remove("optional-dependencies")
                data__optionaldependencies = data["optional-dependencies"]
                if not isinstance(data__optionaldependencies, (dict)):
                    raise JsonSchemaValueException("" + (name_prefix or "data") + ".optional-dependencies must be object", value=data__optionaldependencies, name="" + (name_prefix or "data") + ".optional-dependencies", definition={'type': 'object', 'description': 'Optional dependency for the project', 'propertyNames': {'format': 'pep508-identifier'}, 'additionalProperties': False, 'patternProperties': {'^.+$': {'type': 'array', 'items': {'$id': '#/definitions/dependency', 'title': 'Dependency', 'type': 'string', 'description': 'Project dependency specification according to PEP 508', 'format': 'pep508'}}}}, rule='type')
                data__optionaldependencies_is_dict = isinstance(data__optionaldependencies, dict)
                if data__optionaldependencies_is_dict:
                    data__optionaldependencies_keys = set(data__optionaldependencies.keys())
                    for data__optionaldependencies_key, data__optionaldependencies_val in data__optionaldependencies.items():
                        if REGEX_PATTERNS['^.+$'].search(data__optionaldependencies_key):
                            if data__optionaldependencies_key in data__optionaldependencies_keys:
                                data__optionaldependencies_keys.remove(data__optionaldependencies_key)
                            if not isinstance(data__optionaldependencies_val, (list, tuple)):
                                raise JsonSchemaValueException("" + (name_prefix or "data") + ".optional-dependencies.{data__optionaldependencies_key}".format(**locals()) + " must be array", value=data__optionaldependencies_val, name="" + (name_prefix or "data") + ".optional-dependencies.{data__optionaldependencies_key}".format(**locals()) + "", definition={'type': 'array', 'items': {'$id': '#/definitions/dependency', 'title': 'Dependency', 'type': 'string', 'description': 'Project dependency specification according to PEP 508', 'format': 'pep508'}}, rule='type')
                            data__optionaldependencies_val_is_list = isinstance(data__optionaldependencies_val, (list, tuple))
                            if data__optionaldependencies_val_is_list:
                                data__optionaldependencies_val_len = len(data__optionaldependencies_val)
                                for data__optionaldependencies_val_x, data__optionaldependencies_val_item in enumerate(data__optionaldependencies_val):
                                    validate_https___packaging_python_org_en_latest_specifications_declaring_project_metadata___definitions_dependency(data__optionaldependencies_val_item, custom_formats, (name_prefix or "data") + ".optional-dependencies.{data__optionaldependencies_key}[{data__optionaldependencies_val_x}]".format(**locals()))
                    if data__optionaldependencies_keys:
                        raise JsonSchemaValueException("" + (name_prefix or "data") + ".optional-dependencies must not contain "+str(data__optionaldependencies_keys)+" properties", value=data__optionaldependencies, name="" + (name_prefix or "data") + ".optional-dependencies", definition={'type': 'object', 'description': 'Optional dependency for the project', 'propertyNames': {'format': 'pep508-identifier'}, 'additionalProperties': False, 'patternProperties': {'^.+$': {'type': 'array', 'items': {'$id': '#/definitions/dependency', 'title': 'Dependency', 'type': 'string', 'description': 'Project dependency specification according to PEP 508', 'format': 'pep508'}}}}, rule='additionalProperties')
                    data__optionaldependencies_len = len(data__optionaldependencies)
                    if data__optionaldependencies_len != 0:
                        data__optionaldependencies_property_names = True
                        for data__optionaldependencies_key in data__optionaldependencies:
                            try:
                                if isinstance(data__optionaldependencies_key, str):
                                    if not custom_formats["pep508-identifier"](data__optionaldependencies_key):
                                        raise JsonSchemaValueException("" + (name_prefix or "data") + ".optional-dependencies must be pep508-identifier", value=data__optionaldependencies_key, name="" + (name_prefix or "data") + ".optional-dependencies", definition={'format': 'pep508-identifier'}, rule='format')
                            except JsonSchemaValueException:
                                data__optionaldependencies_property_names = False
                        if not data__optionaldependencies_property_names:
                            raise JsonSchemaValueException("" + (name_prefix or "data") + ".optional-dependencies must be named by propertyName definition", value=data__optionaldependencies, name="" + (name_prefix or "data") + ".optional-dependencies", definition={'type': 'object', 'description': 'Optional dependency for the project', 'propertyNames': {'format': 'pep508-identifier'}, 'additionalProperties': False, 'patternProperties': {'^.+$': {'type': 'array', 'items': {'$id': '#/definitions/dependency', 'title': 'Dependency', 'type': 'string', 'description': 'Project dependency specification according to PEP 508', 'format': 'pep508'}}}}, rule='propertyNames')
            if "dynamic" in data_keys:
                data_keys.remove("dynamic")
                data__dynamic = data["dynamic"]
                if not isinstance(data__dynamic, (list, tuple)):
                    raise JsonSchemaValueException("" + (name_prefix or "data") + ".dynamic must be array", value=data__dynamic, name="" + (name_prefix or "data") + ".dynamic", definition={'type': 'array', '$$description': ['Specifies which fields are intentionally unspecified and expected to be', 'dynamically provided by build tools'], 'items': {'enum': ['version', 'description', 'readme', 'requires-python', 'license', 'authors', 'maintainers', 'keywords', 'classifiers', 'urls', 'scripts', 'gui-scripts', 'entry-points', 'dependencies', 'optional-dependencies']}}, rule='type')
                data__dynamic_is_list = isinstance(data__dynamic, (list, tuple))
                if data__dynamic_is_list:
                    data__dynamic_len = len(data__dynamic)
                    for data__dynamic_x, data__dynamic_item in enumerate(data__dynamic):
                        if data__dynamic_item not in ['version', 'description', 'readme', 'requires-python', 'license', 'authors', 'maintainers', 'keywords', 'classifiers', 'urls', 'scripts', 'gui-scripts', 'entry-points', 'dependencies', 'optional-dependencies']:
                            raise JsonSchemaValueException("" + (name_prefix or "data") + ".dynamic[{data__dynamic_x}]".format(**locals()) + " must be one of ['version', 'description', 'readme', 'requires-python', 'license', 'authors', 'maintainers', 'keywords', 'classifiers', 'urls', 'scripts', 'gui-scripts', 'entry-points', 'dependencies', 'optional-dependencies']", value=data__dynamic_item, name="" + (name_prefix or "data") + ".dynamic[{data__dynamic_x}]".format(**locals()) + "", definition={'enum': ['version', 'description', 'readme', 'requires-python', 'license', 'authors', 'maintainers', 'keywords', 'classifiers', 'urls', 'scripts', 'gui-scripts', 'entry-points', 'dependencies', 'optional-dependencies']}, rule='enum')
            if data_keys:
                raise JsonSchemaValueException("" + (name_prefix or "data") + " must not contain "+str(data_keys)+" properties", value=data, name="" + (name_prefix or "data") + "", definition={'$schema': 'http://json-schema.org/draft-07/schema', '$id': 'https://packaging.python.org/en/latest/specifications/declaring-project-metadata/', 'title': 'Package metadata stored in the ``project`` table', '$$description': ['Data structure for the **project** table inside ``pyproject.toml``', '(as initially defined in :pep:`621`)'], 'type': 'object', 'properties': {'name': {'type': 'string', 'description': 'The name (primary identifier) of the project. MUST be statically defined.', 'format': 'pep508-identifier'}, 'version': {'type': 'string', 'description': 'The version of the project as supported by :pep:`440`.', 'format': 'pep440'}, 'description': {'type': 'string', '$$description': ['The `summary description of the project', '`_']}, 'readme': {'$$description': ['`Full/detailed description of the project in the form of a README', '`_', "with meaning similar to the one defined in `core metadata's Description", '`_'], 'oneOf': [{'type': 'string', '$$description': ['Relative path to a text file (UTF-8) containing the full description', 'of the project. If the file path ends in case-insensitive ``.md`` or', '``.rst`` suffixes, then the content-type is respectively', '``text/markdown`` or ``text/x-rst``']}, {'type': 'object', 'allOf': [{'anyOf': [{'properties': {'file': {'type': 'string', '$$description': ['Relative path to a text file containing the full description', 'of the project.']}}, 'required': ['file']}, {'properties': {'text': {'type': 'string', 'description': 'Full text describing the project.'}}, 'required': ['text']}]}, {'properties': {'content-type': {'type': 'string', '$$description': ['Content-type (:rfc:`1341`) of the full description', '(e.g. ``text/markdown``). The ``charset`` parameter is assumed', 'UTF-8 when not present.'], '$comment': 'TODO: add regex pattern or format?'}}, 'required': ['content-type']}]}]}, 'requires-python': {'type': 'string', 'format': 'pep508-versionspec', '$$description': ['`The Python version requirements of the project', '`_.']}, 'license': {'description': '`Project license `_.', 'oneOf': [{'properties': {'file': {'type': 'string', '$$description': ['Relative path to the file (UTF-8) which contains the license for the', 'project.']}}, 'required': ['file']}, {'properties': {'text': {'type': 'string', '$$description': ['The license of the project whose meaning is that of the', '`License field from the core metadata', '`_.']}}, 'required': ['text']}]}, 'authors': {'type': 'array', 'items': {'$id': '#/definitions/author', 'title': 'Author or Maintainer', '$comment': 'https://peps.python.org/pep-0621/#authors-maintainers', 'type': 'object', 'additionalProperties': False, 'properties': {'name': {'type': 'string', '$$description': ['MUST be a valid email name, i.e. whatever can be put as a name, before an', 'email, in :rfc:`822`.']}, 'email': {'type': 'string', 'format': 'idn-email', 'description': 'MUST be a valid email address'}}}, '$$description': ["The people or organizations considered to be the 'authors' of the project.", 'The exact meaning is open to interpretation (e.g. original or primary authors,', 'current maintainers, or owners of the package).']}, 'maintainers': {'type': 'array', 'items': {'$id': '#/definitions/author', 'title': 'Author or Maintainer', '$comment': 'https://peps.python.org/pep-0621/#authors-maintainers', 'type': 'object', 'additionalProperties': False, 'properties': {'name': {'type': 'string', '$$description': ['MUST be a valid email name, i.e. whatever can be put as a name, before an', 'email, in :rfc:`822`.']}, 'email': {'type': 'string', 'format': 'idn-email', 'description': 'MUST be a valid email address'}}}, '$$description': ["The people or organizations considered to be the 'maintainers' of the project.", 'Similarly to ``authors``, the exact meaning is open to interpretation.']}, 'keywords': {'type': 'array', 'items': {'type': 'string'}, 'description': 'List of keywords to assist searching for the distribution in a larger catalog.'}, 'classifiers': {'type': 'array', 'items': {'type': 'string', 'format': 'trove-classifier', 'description': '`PyPI classifier `_.'}, '$$description': ['`Trove classifiers `_', 'which apply to the project.']}, 'urls': {'type': 'object', 'description': 'URLs associated with the project in the form ``label => value``.', 'additionalProperties': False, 'patternProperties': {'^.+$': {'type': 'string', 'format': 'url'}}}, 'scripts': {'$id': '#/definitions/entry-point-group', 'title': 'Entry-points', 'type': 'object', '$$description': ['Entry-points are grouped together to indicate what sort of capabilities they', 'provide.', 'See the `packaging guides', '`_', 'and `setuptools docs', '`_', 'for more information.'], 'propertyNames': {'format': 'python-entrypoint-name'}, 'additionalProperties': False, 'patternProperties': {'^.+$': {'type': 'string', '$$description': ['Reference to a Python object. It is either in the form', '``importable.module``, or ``importable.module:object.attr``.'], 'format': 'python-entrypoint-reference', '$comment': 'https://packaging.python.org/specifications/entry-points/'}}}, 'gui-scripts': {'$id': '#/definitions/entry-point-group', 'title': 'Entry-points', 'type': 'object', '$$description': ['Entry-points are grouped together to indicate what sort of capabilities they', 'provide.', 'See the `packaging guides', '`_', 'and `setuptools docs', '`_', 'for more information.'], 'propertyNames': {'format': 'python-entrypoint-name'}, 'additionalProperties': False, 'patternProperties': {'^.+$': {'type': 'string', '$$description': ['Reference to a Python object. It is either in the form', '``importable.module``, or ``importable.module:object.attr``.'], 'format': 'python-entrypoint-reference', '$comment': 'https://packaging.python.org/specifications/entry-points/'}}}, 'entry-points': {'$$description': ['Instruct the installer to expose the given modules/functions via', '``entry-point`` discovery mechanism (useful for plugins).', 'More information available in the `Python packaging guide', '`_.'], 'propertyNames': {'format': 'python-entrypoint-group'}, 'additionalProperties': False, 'patternProperties': {'^.+$': {'$id': '#/definitions/entry-point-group', 'title': 'Entry-points', 'type': 'object', '$$description': ['Entry-points are grouped together to indicate what sort of capabilities they', 'provide.', 'See the `packaging guides', '`_', 'and `setuptools docs', '`_', 'for more information.'], 'propertyNames': {'format': 'python-entrypoint-name'}, 'additionalProperties': False, 'patternProperties': {'^.+$': {'type': 'string', '$$description': ['Reference to a Python object. It is either in the form', '``importable.module``, or ``importable.module:object.attr``.'], 'format': 'python-entrypoint-reference', '$comment': 'https://packaging.python.org/specifications/entry-points/'}}}}}, 'dependencies': {'type': 'array', 'description': 'Project (mandatory) dependencies.', 'items': {'$id': '#/definitions/dependency', 'title': 'Dependency', 'type': 'string', 'description': 'Project dependency specification according to PEP 508', 'format': 'pep508'}}, 'optional-dependencies': {'type': 'object', 'description': 'Optional dependency for the project', 'propertyNames': {'format': 'pep508-identifier'}, 'additionalProperties': False, 'patternProperties': {'^.+$': {'type': 'array', 'items': {'$id': '#/definitions/dependency', 'title': 'Dependency', 'type': 'string', 'description': 'Project dependency specification according to PEP 508', 'format': 'pep508'}}}}, 'dynamic': {'type': 'array', '$$description': ['Specifies which fields are intentionally unspecified and expected to be', 'dynamically provided by build tools'], 'items': {'enum': ['version', 'description', 'readme', 'requires-python', 'license', 'authors', 'maintainers', 'keywords', 'classifiers', 'urls', 'scripts', 'gui-scripts', 'entry-points', 'dependencies', 'optional-dependencies']}}}, 'required': ['name'], 'additionalProperties': False, 'if': {'not': {'required': ['dynamic'], 'properties': {'dynamic': {'contains': {'const': 'version'}, '$$description': ['version is listed in ``dynamic``']}}}, '$$comment': ['According to :pep:`621`:', '    If the core metadata specification lists a field as "Required", then', '    the metadata MUST specify the field statically or list it in dynamic', 'In turn, `core metadata`_ defines:', '    The required fields are: Metadata-Version, Name, Version.', '    All the other fields are optional.', 'Since ``Metadata-Version`` is defined by the build back-end, ``name`` and', '``version`` are the only mandatory information in ``pyproject.toml``.', '.. _core metadata: https://packaging.python.org/specifications/core-metadata/']}, 'then': {'required': ['version'], '$$description': ['version should be statically defined in the ``version`` field']}, 'definitions': {'author': {'$id': '#/definitions/author', 'title': 'Author or Maintainer', '$comment': 'https://peps.python.org/pep-0621/#authors-maintainers', 'type': 'object', 'additionalProperties': False, 'properties': {'name': {'type': 'string', '$$description': ['MUST be a valid email name, i.e. whatever can be put as a name, before an', 'email, in :rfc:`822`.']}, 'email': {'type': 'string', 'format': 'idn-email', 'description': 'MUST be a valid email address'}}}, 'entry-point-group': {'$id': '#/definitions/entry-point-group', 'title': 'Entry-points', 'type': 'object', '$$description': ['Entry-points are grouped together to indicate what sort of capabilities they', 'provide.', 'See the `packaging guides', '`_', 'and `setuptools docs', '`_', 'for more information.'], 'propertyNames': {'format': 'python-entrypoint-name'}, 'additionalProperties': False, 'patternProperties': {'^.+$': {'type': 'string', '$$description': ['Reference to a Python object. It is either in the form', '``importable.module``, or ``importable.module:object.attr``.'], 'format': 'python-entrypoint-reference', '$comment': 'https://packaging.python.org/specifications/entry-points/'}}}, 'dependency': {'$id': '#/definitions/dependency', 'title': 'Dependency', 'type': 'string', 'description': 'Project dependency specification according to PEP 508', 'format': 'pep508'}}}, rule='additionalProperties')
        try:
            try:
                data_is_dict = isinstance(data, dict)
                if data_is_dict:
                    data_len = len(data)
                    if not all(prop in data for prop in ['dynamic']):
                        raise JsonSchemaValueException("" + (name_prefix or "data") + " must contain ['dynamic'] properties", value=data, name="" + (name_prefix or "data") + "", definition={'required': ['dynamic'], 'properties': {'dynamic': {'contains': {'const': 'version'}, '$$description': ['version is listed in ``dynamic``']}}}, rule='required')
                    data_keys = set(data.keys())
                    if "dynamic" in data_keys:
                        data_keys.remove("dynamic")
                        data__dynamic = data["dynamic"]
                        data__dynamic_is_list = isinstance(data__dynamic, (list, tuple))
                        if data__dynamic_is_list:
                            data__dynamic_contains = False
                            for data__dynamic_key in data__dynamic:
                                try:
                                    if data__dynamic_key != "version":
                                        raise JsonSchemaValueException("" + (name_prefix or "data") + ".dynamic must be same as const definition: version", value=data__dynamic_key, name="" + (name_prefix or "data") + ".dynamic", definition={'const': 'version'}, rule='const')
                                    data__dynamic_contains = True
                                    break
                                except JsonSchemaValueException: pass
                            if not data__dynamic_contains:
                                raise JsonSchemaValueException("" + (name_prefix or "data") + ".dynamic must contain one of contains definition", value=data__dynamic, name="" + (name_prefix or "data") + ".dynamic", definition={'contains': {'const': 'version'}, '$$description': ['version is listed in ``dynamic``']}, rule='contains')
            except JsonSchemaValueException: pass
            else:
                raise JsonSchemaValueException("" + (name_prefix or "data") + " must NOT match a disallowed definition", value=data, name="" + (name_prefix or "data") + "", definition={'not': {'required': ['dynamic'], 'properties': {'dynamic': {'contains': {'const': 'version'}, '$$description': ['version is listed in ``dynamic``']}}}, '$$comment': ['According to :pep:`621`:', '    If the core metadata specification lists a field as "Required", then', '    the metadata MUST specify the field statically or list it in dynamic', 'In turn, `core metadata`_ defines:', '    The required fields are: Metadata-Version, Name, Version.', '    All the other fields are optional.', 'Since ``Metadata-Version`` is defined by the build back-end, ``name`` and', '``version`` are the only mandatory information in ``pyproject.toml``.', '.. _core metadata: https://packaging.python.org/specifications/core-metadata/']}, rule='not')
        except JsonSchemaValueException:
            pass
        else:
            data_is_dict = isinstance(data, dict)
            if data_is_dict:
                data_len = len(data)
                if not all(prop in data for prop in ['version']):
                    raise JsonSchemaValueException("" + (name_prefix or "data") + " must contain ['version'] properties", value=data, name="" + (name_prefix or "data") + "", definition={'required': ['version'], '$$description': ['version should be statically defined in the ``version`` field']}, rule='required')
        return data
    
    def validate_https___packaging_python_org_en_latest_specifications_declaring_project_metadata___definitions_dependency(data, custom_formats={}, name_prefix=None):
        if not isinstance(data, (str)):
            raise JsonSchemaValueException("" + (name_prefix or "data") + " must be string", value=data, name="" + (name_prefix or "data") + "", definition={'$id': '#/definitions/dependency', 'title': 'Dependency', 'type': 'string', 'description': 'Project dependency specification according to PEP 508', 'format': 'pep508'}, rule='type')
        if isinstance(data, str):
            if not custom_formats["pep508"](data):
                raise JsonSchemaValueException("" + (name_prefix or "data") + " must be pep508", value=data, name="" + (name_prefix or "data") + "", definition={'$id': '#/definitions/dependency', 'title': 'Dependency', 'type': 'string', 'description': 'Project dependency specification according to PEP 508', 'format': 'pep508'}, rule='format')
        return data
    
    def validate_https___packaging_python_org_en_latest_specifications_declaring_project_metadata___definitions_entry_point_group(data, custom_formats={}, name_prefix=None):
        if not isinstance(data, (dict)):
            raise JsonSchemaValueException("" + (name_prefix or "data") + " must be object", value=data, name="" + (name_prefix or "data") + "", definition={'$id': '#/definitions/entry-point-group', 'title': 'Entry-points', 'type': 'object', '$$description': ['Entry-points are grouped together to indicate what sort of capabilities they', 'provide.', 'See the `packaging guides', '`_', 'and `setuptools docs', '`_', 'for more information.'], 'propertyNames': {'format': 'python-entrypoint-name'}, 'additionalProperties': False, 'patternProperties': {'^.+$': {'type': 'string', '$$description': ['Reference to a Python object. It is either in the form', '``importable.module``, or ``importable.module:object.attr``.'], 'format': 'python-entrypoint-reference', '$comment': 'https://packaging.python.org/specifications/entry-points/'}}}, rule='type')
        data_is_dict = isinstance(data, dict)
        if data_is_dict:
            data_keys = set(data.keys())
            for data_key, data_val in data.items():
                if REGEX_PATTERNS['^.+$'].search(data_key):
                    if data_key in data_keys:
                        data_keys.remove(data_key)
                    if not isinstance(data_val, (str)):
                        raise JsonSchemaValueException("" + (name_prefix or "data") + ".{data_key}".format(**locals()) + " must be string", value=data_val, name="" + (name_prefix or "data") + ".{data_key}".format(**locals()) + "", definition={'type': 'string', '$$description': ['Reference to a Python object. It is either in the form', '``importable.module``, or ``importable.module:object.attr``.'], 'format': 'python-entrypoint-reference', '$comment': 'https://packaging.python.org/specifications/entry-points/'}, rule='type')
                    if isinstance(data_val, str):
                        if not custom_formats["python-entrypoint-reference"](data_val):
                            raise JsonSchemaValueException("" + (name_prefix or "data") + ".{data_key}".format(**locals()) + " must be python-entrypoint-reference", value=data_val, name="" + (name_prefix or "data") + ".{data_key}".format(**locals()) + "", definition={'type': 'string', '$$description': ['Reference to a Python object. It is either in the form', '``importable.module``, or ``importable.module:object.attr``.'], 'format': 'python-entrypoint-reference', '$comment': 'https://packaging.python.org/specifications/entry-points/'}, rule='format')
            if data_keys:
                raise JsonSchemaValueException("" + (name_prefix or "data") + " must not contain "+str(data_keys)+" properties", value=data, name="" + (name_prefix or "data") + "", definition={'$id': '#/definitions/entry-point-group', 'title': 'Entry-points', 'type': 'object', '$$description': ['Entry-points are grouped together to indicate what sort of capabilities they', 'provide.', 'See the `packaging guides', '`_', 'and `setuptools docs', '`_', 'for more information.'], 'propertyNames': {'format': 'python-entrypoint-name'}, 'additionalProperties': False, 'patternProperties': {'^.+$': {'type': 'string', '$$description': ['Reference to a Python object. It is either in the form', '``importable.module``, or ``importable.module:object.attr``.'], 'format': 'python-entrypoint-reference', '$comment': 'https://packaging.python.org/specifications/entry-points/'}}}, rule='additionalProperties')
            data_len = len(data)
            if data_len != 0:
                data_property_names = True
                for data_key in data:
                    try:
                        if isinstance(data_key, str):
                            if not custom_formats["python-entrypoint-name"](data_key):
                                raise JsonSchemaValueException("" + (name_prefix or "data") + " must be python-entrypoint-name", value=data_key, name="" + (name_prefix or "data") + "", definition={'format': 'python-entrypoint-name'}, rule='format')
                    except JsonSchemaValueException:
                        data_property_names = False
                if not data_property_names:
                    raise JsonSchemaValueException("" + (name_prefix or "data") + " must be named by propertyName definition", value=data, name="" + (name_prefix or "data") + "", definition={'$id': '#/definitions/entry-point-group', 'title': 'Entry-points', 'type': 'object', '$$description': ['Entry-points are grouped together to indicate what sort of capabilities they', 'provide.', 'See the `packaging guides', '`_', 'and `setuptools docs', '`_', 'for more information.'], 'propertyNames': {'format': 'python-entrypoint-name'}, 'additionalProperties': False, 'patternProperties': {'^.+$': {'type': 'string', '$$description': ['Reference to a Python object. It is either in the form', '``importable.module``, or ``importable.module:object.attr``.'], 'format': 'python-entrypoint-reference', '$comment': 'https://packaging.python.org/specifications/entry-points/'}}}, rule='propertyNames')
        return data
    
    def validate_https___packaging_python_org_en_latest_specifications_declaring_project_metadata___definitions_author(data, custom_formats={}, name_prefix=None):
        if not isinstance(data, (dict)):
            raise JsonSchemaValueException("" + (name_prefix or "data") + " must be object", value=data, name="" + (name_prefix or "data") + "", definition={'$id': '#/definitions/author', 'title': 'Author or Maintainer', '$comment': 'https://peps.python.org/pep-0621/#authors-maintainers', 'type': 'object', 'additionalProperties': False, 'properties': {'name': {'type': 'string', '$$description': ['MUST be a valid email name, i.e. whatever can be put as a name, before an', 'email, in :rfc:`822`.']}, 'email': {'type': 'string', 'format': 'idn-email', 'description': 'MUST be a valid email address'}}}, rule='type')
        data_is_dict = isinstance(data, dict)
        if data_is_dict:
            data_keys = set(data.keys())
            if "name" in data_keys:
                data_keys.remove("name")
                data__name = data["name"]
                if not isinstance(data__name, (str)):
                    raise JsonSchemaValueException("" + (name_prefix or "data") + ".name must be string", value=data__name, name="" + (name_prefix or "data") + ".name", definition={'type': 'string', '$$description': ['MUST be a valid email name, i.e. whatever can be put as a name, before an', 'email, in :rfc:`822`.']}, rule='type')
            if "email" in data_keys:
                data_keys.remove("email")
                data__email = data["email"]
                if not isinstance(data__email, (str)):
                    raise JsonSchemaValueException("" + (name_prefix or "data") + ".email must be string", value=data__email, name="" + (name_prefix or "data") + ".email", definition={'type': 'string', 'format': 'idn-email', 'description': 'MUST be a valid email address'}, rule='type')
                if isinstance(data__email, str):
                    if not REGEX_PATTERNS["idn-email_re_pattern"].match(data__email):
                        raise JsonSchemaValueException("" + (name_prefix or "data") + ".email must be idn-email", value=data__email, name="" + (name_prefix or "data") + ".email", definition={'type': 'string', 'format': 'idn-email', 'description': 'MUST be a valid email address'}, rule='format')
            if data_keys:
                raise JsonSchemaValueException("" + (name_prefix or "data") + " must not contain "+str(data_keys)+" properties", value=data, name="" + (name_prefix or "data") + "", definition={'$id': '#/definitions/author', 'title': 'Author or Maintainer', '$comment': 'https://peps.python.org/pep-0621/#authors-maintainers', 'type': 'object', 'additionalProperties': False, 'properties': {'name': {'type': 'string', '$$description': ['MUST be a valid email name, i.e. whatever can be put as a name, before an', 'email, in :rfc:`822`.']}, 'email': {'type': 'string', 'format': 'idn-email', 'description': 'MUST be a valid email address'}}}, rule='additionalProperties')
        return data
    PK![_validate_pyproject/__init__.pynu[from functools import reduce
    from typing import Any, Callable, Dict
    
    from . import formats
    from .error_reporting import detailed_errors, ValidationError
    from .extra_validations import EXTRA_VALIDATIONS
    from .fastjsonschema_exceptions import JsonSchemaException, JsonSchemaValueException
    from .fastjsonschema_validations import validate as _validate
    
    __all__ = [
        "validate",
        "FORMAT_FUNCTIONS",
        "EXTRA_VALIDATIONS",
        "ValidationError",
        "JsonSchemaException",
        "JsonSchemaValueException",
    ]
    
    
    FORMAT_FUNCTIONS: Dict[str, Callable[[str], bool]] = {
        fn.__name__.replace("_", "-"): fn
        for fn in formats.__dict__.values()
        if callable(fn) and not fn.__name__.startswith("_")
    }
    
    
    def validate(data: Any) -> bool:
        """Validate the given ``data`` object using JSON Schema
        This function raises ``ValidationError`` if ``data`` is invalid.
        """
        with detailed_errors():
            _validate(data, custom_formats=FORMAT_FUNCTIONS)
        reduce(lambda acc, fn: fn(acc), EXTRA_VALIDATIONS, data)
        return True
    PK!L$__pycache__/setupcfg.cpython-311.pycnu[
    
    icdZddlZddlZddlZddlmZddlmZddlmZddlm	Z	m
    Z
    mZmZm
    Z
    mZmZmZmZmZmZmZddlmZmZdd	lmZdd
    lmZmZddlmZddl m!Z!m"Z"dd
    l#m$Z$ddl%m&Z&e	rddl'm(Z(ddl)m*Z*ee+ej,fZ-ededeffZ.	ede.fZ/ededZ0	d:de-de1fdZ2ddde-ddfdZ3		d;ddde-dee-de4ded f
    d!Z5d"e0d#e+fd$Z6d%ed de1fd&Z7	dGd8d9e$Z?dS)=a<
    Load setuptools configuration from ``setup.cfg`` files.
    
    **API will be made private in the future**
    
    To read project metadata, consider using
    ``build.util.project_wheel_metadata`` (https://pypi.org/project/build/).
    For simple scenarios, you can also try parsing the file directly
    with the help of ``configparser``.
    N)defaultdict)partialwraps)
    TYPE_CHECKINGCallableAnyDictGenericIterableListOptionalSetTupleTypeVarUnion)	FileErrorOptionError)default_environment)InvalidRequirementRequirement)SpecifierSet)InvalidVersionVersion)SetuptoolsDeprecationWarning)expand)DistributionMetadataDistributionstrTarget)r!r)boundFfilepathreturncddlm}|}|r|ng}t||||}t	|S)a,Read given configuration file and returns options from it as a dict.
    
        :param str|unicode filepath: Path to configuration file
            to get options from.
    
        :param bool find_others: Whether to search for other configuration files
            which could be on in various places.
    
        :param bool ignore_option_errors: Whether to silently ignore
            options, values of which could not be resolved (e.g. due to exceptions
            in directives such as file:, attr:, etc.).
            If False exceptions are propagated as expected.
    
        :rtype: dict
        rr )setuptools.distr!find_config_files_applyconfiguration_to_dict)r%find_othersignore_option_errorsr!dist	filenameshandlerss       Q/opt/imunify360/venv/lib64/python3.11/site-packages/setuptools/config/setupcfg.pyread_configurationr28s^$-,,,,,<>>D,7?&&(((RIdHi1EFFH ***r.r!cNt||||S)z`Apply the configuration from a ``setup.cfg`` file into an existing
        distribution object.
        )r*_finalize_requires)r.r%s  r1apply_configurationr6Rs+4Kr3other_filesr-)
    ConfigHandler.c*ddlm}tj|}tj|st
    d|dtj}tjtj	|g||}	|
    ||t||j|}|
    tj|n#tj|wxYw|S)zHRead configuration from ``filepath`` and applies to the ``dist`` object.r)
    _DistributionzConfiguration file z does not exist.)r/)r-)r(r;ospathabspathisfilergetcwdchdirdirnameparse_config_filesparse_configurationcommand_options_finalize_license_files)r.r%r8r-r;current_directoryr/r0s        r1r*r*[s.-----wx((H
    7>>(##JHhHHHIII	HRW__X
    &
    &'''(+(x(I$(((CCC&$&=Q
    
    
    	
    $$&&&
    "####"####Os
    #AC::D
    target_objkeycxd|}tjt||}t|||}|S)z
        Given a target object and option key, get that option from
        the target object, either through a get_{key} method or
        from an attribute directly.
        get_)	functoolsrgetattr)rHrIgetter_nameby_attributegetters     r1_get_optionrQys?,,K$Wj#>>L
    Zl
    ;
    ;F688Or3r0ctt}|D]1}|jD]'}t|j|}|||j|<(2|S)zReturns configuration data gathered by given handlers as a dict.
    
        :param list[ConfigHandler] handlers: Handlers list,
            usually from parse_configuration()
    
        :rtype: dict
        )rdictset_optionsrQrHsection_prefix)r0config_dicthandleroptionvalues     r1r+r+sk$D))K@@)	@	@F 2F;;E:?K./77	@r3distributionrE)ConfigMetadataHandlerConfigOptionsHandlerc	tj|5}t||||}||js|j|_t|j||||j|j}||j	|j|jdddn#1swxYwY||fS)aPerforms additional parsing of configuration options
        for a distribution.
    
        Returns a list of used option handlers.
    
        :param Distribution distribution:
        :param dict command_options:
        :param bool ignore_option_errors: Whether to silently ignore
            options, values of which could not be resolved (e.g. due to exceptions
            in directives such as file:, attr:, etc.).
            If False exceptions are propagated as expected.
        :rtype: list
        N)
    rEnsurePackagesDiscoveredr\parsepackage_dirr[metadatasrc_root_referenced_filesupdate)rZrEr-ensure_discoveredoptionsmetas      r1rDrDs$
    	(	6	6
    :K& 	
    
    	
    
    '	;'.':L$$! $!
    
    
    	
    
    &--%t'=	
    	
    	
    +
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    2=sBB77B;>B;label
    orig_valueparsedcd|vstdkrdSt}	td}|j|vr$t
    |ddSdS#t$rX}tfd|Dr2t
    	|d}t||Yd}~dSd}~wwxYw)amBecause users sometimes misinterpret this configuration:
    
        [options.extras_require]
        foo = bar;python_version<"4"
    
        It looks like one requirement with an environment marker
        but because there is no newline, it's parsed as two requirements
        with a semicolon as separator.
    
        Therefore, if:
            * input string does not contain a newline AND
            * parsed result contains two requirements AND
            * parsing of the two parts from the result (";")
            leads in a valid Requirement with a valid marker
        a UserWarning is shown to inform the user about the possible problem.
        
    rNr)fieldreqc3NK|]}d|V dS)rN
    startswith).0markerrjs  r1	z8_warn_accidental_env_marker_misconfig..s5BBvay##F++BBBBBBr3)
    len
    marker_envkeysrname_AmbiguousMarkeremitranymessage)rhrirjmarkersrnexmsgs  `    r1%_warn_accidental_env_marker_misconfigrs"zS[[A--ll!!G2&)$$8w!!6!9!=====222BBBB'BBBBB	2"**F1I*FFC$S))r1	2	2	2	2	2	22sAB
    C"
    A
    CC"c^eZdZUdZeed<	iZeeefed<	dede	de
    jfdZe
    de	fdZed	Zd
    Ze
    ddZe
    d
    Ze
    dZe
    dZdefdZdefdZe
    dZe
    dZe
    ddZdZdZdZdS)r9z1Handles metadata supplied in configuration files.rUaliasesrHrfrec||_||_t|||_g|_||_t|_dSN)	r-rHrS_section_optionssectionsrTresetrc)selfrHrfr-res     r1__init__zConfigHandler.__init__sV%9!$T227;;<<
    &(!2+.55		r3c#K|D]?\}}||j\}}}|r&|d|fV@dS)N.)items	partitionrUlstrip)clsrf	full_namerYpreseprxs       r1rzConfigHandler._section_optionsss '
    
    	*	*Iu&001CDDNCd
    ++c""E)))))		*	*r3c:td|jjz).Metadata item name to parser function mapping.z!%s must provide .parsers property)NotImplementedError	__class____name__)rs r1parserszConfigHandler.parserss#"/$.2II
    
    	
    r3c|j}|j||}	t||}n#t$rt|wxYw|rdS	|j|d|}n#tf|jz$rYdSwxYwtj
    |j|}t|d|z|}|||j
    |dS)Nc|Srr7)xs r1z+ConfigHandler.__setitem__..%sQr3zset_%s)rHrgetrMAttributeErrorKeyErrorr	Exceptionr-rLr__setattr__rTappend)roption_namerYrH
    current_valuerj
    simple_settersetters        r1__setitem__zConfigHandler.__setitem__s_
    l&&{K@@	(#J<z-ConfigHandler._parse_list..As-BBB%EKKMMB
    
    BBBr3)
    isinstancelist
    splitlinessplit)rrY	separators   r1_parse_listzConfigHandler._parse_list/s\eT""	L5==$$&&EEKK	**EBB5BBBBr3cd}i}||D]\}||\}}}||krtd||||<]|S)zPRepresents value as a dict.
    
            :param value:
            :rtype: dict
            =z&Unable to parse option value to dict: )rrrr)rrYrresultlinerIrvals        r1_parse_dictzConfigHandler._parse_dictCs	OOE**	.	.D NN955MCci!"R5"R"RSSS"%))++F399;;
    r3c2|}|dvS)zQRepresents value as boolean.
    
            :param value:
            :rtype: bool
            )1trueyes)lowerrrYs  r1_parse_boolzConfigHandler._parse_boolTs
    
    ,,,r3cfd}|S)zReturns a parser function to make sure field inputs
            are not files.
    
            Parses a value after getting the key so error messages are
            more informative.
    
            :param key:
            :rtype: callable
            czd}||r"td|S)Nfile:zCOnly strings are accepted for the {0} field, files are not accepted)rq
    ValueErrorformat)rYexclude_directiverIs  r1parserz3ConfigHandler._exclude_files_parser..parserjsI ' 122
     --3VC[[Lr3r7)rrIrs ` r1_exclude_files_parserz#ConfigHandler._exclude_files_parser^s#					
    r3root_dirc,d}t|ts|S||s|S|t|d}d|dD}|j|tj||S)aORepresents value as a string, allowing including text
            from nearest files using `file:` directive.
    
            Directive is sandboxed and won't reach anything outside
            directory with setup.py.
    
            Examples:
                file: README.rst, CHANGELOG.md, src/file.txt
    
            :param str value:
            :rtype: str
            rNc6g|]}|Sr7r)rrr=s  r1rz-ConfigHandler._parse_file..s >>>dTZZ\\>>>r3r)	rr"rqrurrcrdr
    read_files)rrYrinclude_directivespec	filepathss      r1_parse_filezConfigHandler._parse_fileus$%%%	L 122	LS*++--.>>djjoo>>>	%%i000 H555r3cd}||s|S||d}||jjtj|||S)zRepresents value as a module attribute.
    
            Examples:
                attr: package.attr
                attr: package.module.attr
    
            :param str value:
            :rtype: str
            zattr:)rqreplacerdrer`r	read_attr)rrYr`rattr_directive	attr_descs      r1_parse_attrzConfigHandler._parse_attrsh!//	LMM."55		41=>>>	;AAAr3cfd}|S)zReturns parser function to represents value as a list.
    
            Parses a value applying given methods one after another.
    
            :param parse_methods:
            :rtype: callable
            c,|}D]
    }||}|Srr7)rYrjmethod
    parse_methodss   r1r_z1ConfigHandler._get_parser_compound..parses+F'
    (
    (Mr3r7)rrr_s ` r1_get_parser_compoundz"ConfigHandler._get_parser_compounds#					r3cbi}|D]\}\}}|||||<|S)aParses section options into a dictionary.
    
            Applies a given parser to each option in a section.
    
            :param dict section_options:
            :param callable values_parser: function with 2 args corresponding to key, value
            :rtype: dict
            )r)rsection_options
    values_parserrYrI_rs       r1_parse_section_to_dict_with_keyz-ConfigHandler._parse_section_to_dict_with_keysH,2244	1	1MC!S&sC00E#JJr3NcDrfdnd}|||S)aParses section options into a dictionary.
    
            Optionally applies a given parser to each value.
    
            :param dict section_options:
            :param callable values_parser: function with 1 arg corresponding to option value
            :rtype: dict
            c|Srr7)rvrs  r1rz6ConfigHandler._parse_section_to_dict..s}}Q//r3c|Srr7)rrs  r1rz6ConfigHandler._parse_section_to_dict..sUVr3r)rrrrs  ` r1_parse_section_to_dictz$ConfigHandler._parse_section_to_dicts75BW/////22?FKKKr3c|D]>\}\}}tjt5|||<dddn#1swxYwY?dS)zQParses configuration file section.
    
            :param dict section_options:
            N)r
    contextlibsuppressr)rrrxrrYs     r1
    parse_sectionzConfigHandler.parse_sections
    !0 5 5 7 7	#	#D*1e$X..
    #
    #"T
    
    #
    #
    #
    #
    #
    #
    #
    #
    #
    #
    #
    #
    #
    #
    #	#	#sAA	A	c|jD]^\}}d}|rd|z}t|d|zddd}|t	d|jd|d||_dS)	zTParses configuration file items from one
            or more related sections.
    
            rz_%szparse_section%sr__Nz*Unsupported distribution option section: [])rrrMrrrU)rsection_namermethod_postfixsection_parser_methods     r1r_zConfigHandler.parses
    .2]-@-@-B-B	3	3)L/N
    6!&!58?"^3<+>>.:>>>
    
    "!/2222%	3	3r3cDtfd}|S)zthis function will wrap around parameters that are deprecated
    
            :param msg: deprecation message
            :param func: function to be wrapped around
            cfddtjdfi|i|S)N
    stacklevelrz Deprecated config in `setup.cfg`)
    setdefault_DeprecatedConfigrz)argskwargsfunckwrs  r1config_handlerz@ConfigHandler._deprecated_config_handler..config_handlersHMM,***"#EsQQbQQQ4((((r3r)rrrrrs ``` r1_deprecated_config_handlerz(ConfigHandler._deprecated_config_handlersB
    t	)	)	)	)	)	)
    	)
    r3)rr)r
    __module____qualname____doc__r"__annotations__rr
    r#AllCommandOptionsrr^rclassmethodrpropertyrrrrrr_Pathrrrrrrr_rr7r3r1r9r9s;;
    !GT#s(^   #
    ":"*'8***[*
    
    X
    ---4CCC[C&[ --[-[,6566664BBBBB([&[
    L
    L
    L[
    L###3332
    
    
    
    
    r3r9c
    eZdZdZdddddZdZ	dejfd	d
    dede	d
    e
    jdee
    deffd
    ZedZdZxZS)r[raurldescriptionclassifiers	platforms)	home_pagesummary
    classifierplatformFNrHrrfr-rer`rclt||||||_||_dSr)superrr`r)rrHrfr-rer`rrs       r1rzConfigMetadataHandler.__init__s8	W.BDUVVV& 
    
    
    r3c|j}t|j|j}|j}|j}||||||||d||||j|dS)rrlicense)r
    keywordsprovides	obsoletesr	r
    license_filesrlong_descriptionversionproject_urls)rrrrrrr_parse_version)r
    parse_list
    parse_file
    parse_dictexclude_files_parsers     r1rzConfigMetadataHandler.parsers#s%
    T-
    FFF
    %
    #9$""#44ZLL++I66'% **&
    
    	
    r3c>|||j}||krJ|}	t|n##t$rtd|d|wxYw|St
    j|||j	|jS)zSParses `version` option value.
    
            :param value:
            :rtype: str
    
            zVersion loaded from z does not comply with PEP 440: )
    rrrrrrrrrr`)rrYrs   r1rz$ConfigMetadataHandler._parse_version9s""5$-88emmooG
        !
    
    
    !6566,366
    N~d..ud6F
    VVWWWsA A')rrrrUrstrict_moder<curdirrboolrr^rrSrrrrr
    __classcell__rs@r1r[r[sN #	GK'+)!!*!#!#	!
    ":!d^
    !!!!!!!
    
    X
    *XXXXXXXr3r[rceZdZdZdddededejffdZe	dZ
    dZd	ed
    efdZ
    edZd
    ZdZdZdZdZdZdZdZdZxZS)r\rfrHr!r-recvt|||||j|_i|_dSr)rrrbrr`)rrHrfr-rers     r1rzConfigOptionsHandler.__init__Vs=	W.BDUVVV"+
    +-r3c0||dS)N;)r)rrs  r1_parse_list_semicolonz*ConfigOptionsHandler._parse_list_semicolonasu444r3c:|||jS)Nr)rr)rrYs  r1_parse_file_in_rootz(ConfigOptionsHandler._parse_file_in_rootes
    >>>r3rhrYc|||}t|||d|DS)Nc<g|]}|d|S)#rp)rrrs  r1rzAConfigOptionsHandler._parse_requirements_list..ns)DDDts/C/CDDDDr3)r*r,r)rrhrYrjs    r1_parse_requirements_listz-ConfigOptionsHandler._parse_requirements_listhsL++D,D,DU,K,KLL-eUFCCCEDDDDDr3c|j}|j}|j}|j}||||||||dt|jd|j|j|j|j	|t|dS)rzeThe namespace_packages parameter is deprecated, consider using implicit namespaces instead (PEP 420).install_requires)zip_safeinclude_package_datar`scriptseager_resourcesdependency_linksnamespace_packagesr2setup_requires
    tests_requirepackagesentry_points
    py_modulespython_requirescmdclass)rrr_parse_cmdclassrrr0r*_parse_packagesr,r)rr
    parse_boolrparse_cmdclasss     r1rzConfigOptionsHandler.parsersps%
    %
    %
    -#$.%!) *"&"A"AH##!(-/A!!#8!7, 4$+&-
    
    	
    r3cv|jj}tj||||jSr)rer`rr?rr)rrYr`s   r1r@z$ConfigOptionsHandler._parse_cmdclasss1,8t//66T]SSSr3c:ddg}|}||vr||S||jdi}|||dk|j|jtj	di|S)zTParses `packages` option value.
    
            :param value:
            :rtype: list
            zfind:zfind_namespace:z
    packages.findr)
    namespacesrfill_package_dirr7)
    rrparse_section_packages__findrrrdrr`r
    find_packages)rrYfind_directives
    trimmed_valuefind_kwargss     r1rAz$ConfigOptionsHandler._parse_packagess#$56
    
    
    //##E***77Mor22
    
    	%);;]!-		
    	
    	
    #22k222r3c|||j}gdtfd|D}|d}||d|d<|S)zParses `packages.find` configuration file section.
    
            To be used in conjunction with _parse_packages().
    
            :param dict section_options:
            )whereincludeexcludec*g|]\}}|v	|||fSr7r7)rrkr
    valid_keyss   r1rzEConfigOptionsHandler.parse_section_packages__find..s*NNN1ZAaVr3rNNr)rrrSrr)rrsection_datarLrNrSs     @r1rHz1ConfigOptionsHandler.parse_section_packages__finds22?DDTUU444
    NNNN 2 2 4 4NNN
    
    ((#(8K r3cF|||j}||d<dS)z`Parses `entry_points` configuration file section.
    
            :param dict section_options:
            r<N)rrrrrjs   r1parse_section_entry_pointsz/ConfigOptionsHandler.parse_section_entry_pointss,
    ,,_d>NOO%^r3c`|||j}tj|Sr)rrrcanonic_package_data)rrpackage_datas   r1_parse_package_dataz(ConfigOptionsHandler._parse_package_datas+22?DDTUU*<888r3c6|||d<dS)z`Parses `package_data` configuration file section.
    
            :param dict section_options:
            rZNr[rrs  r1parse_section_package_dataz/ConfigOptionsHandler.parse_section_package_datas"
     $77HH^r3c6|||d<dS)zhParses `exclude_package_data` configuration file section.
    
            :param dict section_options:
            exclude_package_dataNr]r^s  r1"parse_section_exclude_package_dataz7ConfigOptionsHandler.parse_section_exclude_package_datas#
    (,'?'?'P'P
    #$$$r3cD|fd}|d<dS)zbParses `extras_require` configuration file section.
    
            :param dict section_options:
            c8d|d|S)Nzextras_require[r)r0)rRrrs  r1rzCConfigOptionsHandler.parse_section_extras_require..s#667M7M7M7MqQQr3extras_requireNrrVs`  r1parse_section_extras_requirez1ConfigOptionsHandler.parse_section_extras_requires<
    55QQQQ
    
    
    "(
    r3cv|||j}tj||j|d<dS)z^Parses `data_files` configuration file section.
    
            :param dict section_options:
            
    data_filesN)rrrcanonic_data_filesrrVs   r1parse_section_data_filesz-ConfigOptionsHandler.parse_section_data_filess;
    ,,_d>NOO#6vt}MM\r3)rrrrUrr#rr^rrr*r,r"r0rrr@rArHrWr[r_rbrfrjr$r%s@r1r\r\SspN	."	.#	.#		.
    ":	.	.	.	.	.	.55[5???EcE#EEEE
    
    X
    @TTT3332*&&&999IIIQQQ
    (
    (
    (NNNNNNNr3r\c0eZdZdZdZdZedZdS)ryzAmbiguous requirement marker.z
        One of the parsed requirements in `{field}` looks like a valid environment marker:
    
            {req!r}
    
        Please make sure that the configuration file is correct.
        You can use dangling lines to avoid this problem.
        z'userguide/declarative_config.html#opt-2c\d|j}||j|j||S)Nz%https://setuptools.pypa.io/en/latest/)see_urlformat_args)	_SEE_DOCS_format_SUMMARY_DETAILS)rrdocss   r1r|z_AmbiguousMarker.messages0Fs}FF{{3<tQS{TTTr3N)rrrrqrrrorr|r7r3r1ryrysG.HH:IUU[UUUr3ryceZdZdZdS)rz!userguide/declarative_config.htmlN)rrrror7r3r1rrs3IIIr3r)FF)r7F)F)@rrrLr<collectionsrrrtypingrrr	r
    rrr
    rrrrrerrorsrrextern.packaging.markersrrvextern.packaging.requirementsrrextern.packaging.specifiersrextern.packaging.versionrrwarningsrrrdistutils.distrr(r!r"PathLikerSingleCommandOptionsrr#rSr2r6r#r*rQr+rDrrr9r[r\ryrr7r3r1rs						######
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    ,+++++++HHHHHHKKKKKKKK666666>>>>>>>>333333-333333,,,,,,
    c2;E5#445
     445	'M!N	O	O	O>C+++	++++4n.$&!&	
    %	
     <	F					E*>$?D*++ +&+:;	++++\22#2t2222@^^^^^GFO^^^B	JXJXJXJXJXM*@AJXJXJXZ\N\N\N\N\N=8\N\N\N~UUUUU3UUU(44444444444r3PK!8?YnYn"__pycache__/expand.cpython-311.pycnu[
    
    i@$dZddlZddlZddlZddlZddlZddlmZddlm	Z	ddl
    mZddlm
    Z
    ddlmZmZmZmZmZmZmZmZmZmZmZmZddlmZdd	lmZdd
    lmZddl m!Z"dd
    l#m$Z$erddl%m&Z&ddl'm(Z(ddl)m*Z*e
    j+Z,ee-ej.fZ/edZ0eddZ1GddZ2	dAdee-dee/dee-fdZ3dAdee-e4ee/fde-fdZ5dee/dee/fdZ6dee4e/fde-fdZ7de/de-fd Z8		dBd!e-d"eee-e-fdee/fd#Z9d$e-d%ee/defd&Z:d'ed$e-defd(Z;d$e-d"eee-e-fde/dee/ee-e-ffd)Z<		dBd*e-d"eee-e-fdee/defd+Z=		dBd,ee-e-fd"eee-e-fdee/dee-effd-Z>dddd.d/eee-e-fdee/dee-fd0Z?d1e/d2e/de-fd3Z@d4eeeee-eAfe-fde-fd5ZBd6eCdeCfd7ZD	dAd8eeEeCfdee/deee-ee-ffd9ZFdCd;e-dee-eCffd<ZGGd=d>ZHGd?d@ee0e1fZIdS)DaiUtility functions to expand configuration directives or special values
    (such glob patterns).
    
    We can split the process of interpreting configuration files into 2 steps:
    
    1. The parsing the file contents from strings to value objects
       that can be understand by Python (for example a string with a comma
       separated list of keywords into an actual Python list of strings).
    
    2. The expansion (or post-processing) of these values according to the
       semantics ``setuptools`` assign to them (for example a configuration field
       with the ``file:`` directive should be expanded from a list of file paths to
       a single string with the contents of those files concatenated)
    
    This module focus on the second step, and therefore allow sharing the expansion
    functions among several configuration file formats.
    
    **PRIVATE MODULE**: API reserved for setuptools internal usage only.
    N)iglob)ConfigParser)
    ModuleSpec)chain)
    TYPE_CHECKINGCallableDictIterableIteratorListMappingOptionalTupleTypeVarUnioncast)Path)
    ModuleType)DistutilsOptionError)	same_path)SetuptoolsWarning)Distribution)ConfigDiscovery)DistributionMetadata_K_VT)	covariantcdeZdZdZdedefdZdeee	j
    e	j
    ffdZdZdS)	StaticModulez>Proxy to a module object that avoids executing arbitrary code.namespecctjtj|j}t
    |t|`	dSN)
    astparsepathlibrorigin
    read_bytesvarsupdatelocalsself)r-r!r"modules    O/opt/imunify360/venv/lib64/python3.11/site-packages/setuptools/config/expand.py__init__zStaticModule.__init__AsP7<44??AABBT
    
    &((###IIIreturnc#K|jjD]gttjrfdjDEd{V6ttjrjrjjfVhdS)Nc3*K|]
    }|jfVdSr$value).0target	statements  r/	z1StaticModule._find_assignments..Is*VV&VY_5VVVVVVr1)	r.body
    isinstancer%Assigntargets	AnnAssignr6r8)r-r9s @r/_find_assignmentszStaticModule._find_assignmentsFs)	:	:I)SZ00
    :VVVVIDUVVVVVVVVVVVIs}55
    :)/
    : '9999		:	:r1c	tfd|DS#t$r}t|jd|d}~wwxYw)zHAttempt to load an attribute "statically", via :func:`ast.literal_eval`.c3K|]@\}}t|tjr!|jk*tj|VAdSr$)r<r%Nameidliteral_eval)r7r8r6attrs   r/r:z+StaticModule.__getattr__..Psa!FEfch//5;I4E4E ''4E4E4E4Er1z has no attribute N)nextr@	ExceptionAttributeErrorr!)r-rFes ` r/__getattr__zStaticModule.__getattr__Ms	P%)%;%;%=%=
    
    	P	P	P DI!G!G!G!GHHaO	Ps,0
    AAAN)
    __name__
    __module____qualname____doc__strrr0rrr%ASTr@rKr1r/r r >s~HHS
    
    :8E#'372B,C#D::::	P	P	P	P	Pr1r patternsroot_dirr2c
    hd}g}ptj|D]tfd|Dr{tjtj}|tfdt|dDtj	
    tjd}|||S)aExpand the list of glob patterns, but preserving relative paths.
    
        :param list[str] patterns: List of glob patterns
        :param str root_dir: Path to which globs should be relative
                             (current directory by default)
        :rtype: list
        >*?[]{}c3 K|]}|vV	dSr$rR)r7charr6s  r/r:z glob_relative..hs'99tu}999999r1c3K|]B}tj|tjdVCdS)/N)ospathrelpathreplacesepr7rarTs  r/r:z glob_relative..lsYGOOD(33;;BFCHHr1T)	recursiver_)
    r`getcwdanyraabspathjoinextendsortedrrbrcrdappend)rSrTglob_charactersexpanded_values	glob_pathrar6s `    @r/
    glob_relativerqYs 544OO&29;;H))999999999
    	)Xu(E(EFFI"" %i4 @ @ @
    
    
    
    7??5(33;;BFCHHD""4((((r1	filepathscddlm}tjptjfd||D}dfdt|DS)zReturn the content of the files concatenated using ``
    `` as str
    
        This function is sandboxed and won't reach anything outside ``root_dir``
    
        (By default ``root_dir`` is the current directory).
        r)always_iterablec3XK|]$}tj|V%dSr$)r`rarjres  r/r:zread_files..s3VV4"',,x..VVVVVVr1
    c3VK|]#}t|t|V$dSr$)
    _assert_local
    _read_fileres  r/r:zread_files..sOx((4r1) setuptools.extern.more_itertoolsrtr`rarirgrj_filter_existing_files)rrrTrt
    _filepathss `  r/
    read_filesr}zsA@@@@@wx629;;77HVVVV??9;U;UVVVJ99*:66r1c#K|D]>}tj|r|V&tjd|d?dS)NzFile z cannot be found)r`raisfileremit)rrras  r/r{r{seEE
    7>>$	EJJJJ"#C4#C#C#CDDDD	EEr1filepathct|d5}|cdddS#1swxYwYdS)Nzutf-8)encoding)openread)rfs  r/ryrys	
    h	)	)	)Qvvxxs377cttj|ttj|jvrd|d|d}t|dS)NzCannot access z (or anything outside )T)rr`rariparentsr)rrTmsgs   r/rxrxsgBGOOH%%&&d27??83L3L.M.M.UUUNxNNNNN"3'''4r1	attr_descpackage_dirc|ptj}|d}|}d|}|pd}t
    |||\}}}t||}	tt|||S#t$r#t||}	t|	|cYSwxYw)aReads the value of an attribute from a module.
    
        This function will try to read the attributed statically first
        (via :func:`ast.literal_eval`), and only evaluate the module if it fails.
    
        Examples:
            read_attr("package.attr")
            read_attr("package.module.attr")
    
        :param str attr_desc: Dot-separated string describing how to reach the
            attribute (see examples above)
        :param dict[str, str] package_dir: Mapping of package names to their
            location in disk (represented by paths relative to ``root_dir``).
        :param str root_dir: Path to directory containing all the packages in
            ``package_dir`` (current directory by default).
        :rtype: str
        .r0)r`rgstripsplitpoprj_find_module
    _find_specgetattrr rH
    _load_spec)
    rrrT
    attrs_path	attr_namemodule_name_parent_pathrar"r.s
              r/	read_attrrs,&29;;H""((--J  I((:&&K+K&2;X&V&V#L$k4((D*|K66	BBB***D+..vy)))))*sB..*CCrmodule_pathctj||}|ptj|}|t	||Sr$)	importlibutilspec_from_file_location	find_specModuleNotFoundError)rrr"s   r/rrsK>11+{KKD89>++K88D|!+...Kr1r"ct|d|}|tjvrtj|Stj|}|tj|<|j||S)NrL)rsysmodulesrrmodule_from_specloaderexec_module)r"rr!r.s    r/rrsi4[11Ds{{4  
    ^
    ,
    ,T
    2
    2FCKKF###Mr1c|}|d}|r|d|vr||d}|dd}t|dkr/tj||d}|d}n|}d|g|dd}n*d|vr&tj||d}tjj|g|dR}t
    |dtj|dft|d	}	td
    |	Dd}
    ||
    |fS)a0Given a module (that could normally be imported by ``module_name``
        after the build is complete), find the path to the parent directory where
        it is contained and the canonical name that could be used to import it
        considering the ``package_dir`` in the build configuration and ``root_dir``
        rrr_Nz.pyz__init__.pyz.*c3XK|]%}tj|!|V&dSr$)r`rar)r7xs  r/r:z_find_module..s5CCa1B1BCCCCCCCr1)	rrsplitlenr`rarjrrrG)rrrTparent_pathmodule_partscustom_pathparts
    parent_module
    path_start
    candidatesrs           r/rrsoK$$S))L
    B?k))%l1o6K&&sA..E5zzA~~ gll8U1X>> %a
    
     +
    ((M#EL4D#EFFKK
    ;
    
    ',,xRAAKkCK,=,=c,B,BCCCJ			RW\\*mDDE
      JCC:CCCTJJK[00r1qualified_class_namec
    |ptj}|d}||dzd}|d|}t|||\}}}t	t|||}	t
    |	|S)z@Given a qualified class name, return the associated class objectrrN)r`rgrfindrrrr)
    rrrTidx
    class_namepkg_namerrarr.s
              r/
    resolve_classrs&29;;H
    
    $
    $S
    )
    )C%cAgii0J#DSD)H&28[(&S&S#L$
    
    ;55{
    C
    CF6:&&&r1valuescHfd|DS)zGiven a dictionary mapping command names to strings for qualified class
        names, apply :func:`resolve_class` to the dict values.
        c:i|]\}}|t|SrR)r)r7kvrrTs   r/
    zcmdclass..s+RRR41aA}QX66RRRr1)items)rrrTs ``r/cmdclassr
    s,SRRRR6<<>>RRRRr1)
    namespacesfill_package_dirrTrc
    ddlm}ddlm}m}|rddlm}nddlm}|ptj}|	ddg}g}	|in|}t|||
    t
    d	kr9t
    fd
    d|fDr|
    d
    d
    D]}
    t||
    }|j|fi|}|	||rX|d|
    ks?tj||s||||
    |	S)aWorks similarly to :func:`setuptools.find_packages`, but with all
        arguments given as keyword arguments. Moreover, ``where`` can be given
        as a list (the results will be simply concatenated).
    
        When the additional keyword argument ``namespaces`` is ``True``, it will
        behave like :func:`setuptools.find_namespace_packages`` (i.e. include
        implicit namespaces as per :pep:`420`).
    
        The ``where`` argument will be considered relative to ``root_dir`` (or the current
        working directory when ``root_dir`` is not given).
    
        If the ``fill_package_dir`` argument is passed, this function will consider it as a
        similar data structure to the ``package_dir`` configuration parameter add fill-in
        any missing package location.
    
        :rtype: list
        r)construct_package_dir)unique_everseenrt)PEP420PackageFinder)
    PackageFinderwhererNrc3FK|]}td|VdS)rN)
    _same_path)r7rsearchs  r/r:z find_packages..>s4VVJvay!$<$< <VVVVVVr1r)setuptools.discoveryrrzrrtrrr`curdirrlistrall
    setdefault
    _nest_pathfindrkgetrasamefiler+)rrrTkwargsrrrtrrpackagesrapackage_pathpkgsrs             @r/
    find_packagesrs0;:::::QQQQQQQQ7MMMMMMM666666$29HJJw&&EH-5rr;K
    ////%"8"899
    :
    :F
    6{{aCVVVVsHoVVVVV##Bq	222GG!(D11!}!,99&99	G  $$,,0@0@x0X0X,##$9$9$$E$EFFFOr1parentrac|dvr|ntj||}tj|S)N>rr)r`rarjnormpath)rras  r/rrMs;Y&&66BGLL,F,FD
    7D!!!r1r6cBt|r
    |}ttttt
    f|}t
    |ts>t|dr)dtt|}nd|z}|S)z`When getting the version directly from an attribute,
        it should be normalised to string.
        __iter__rz%s)
    callablerr
    rrPintr<hasattrrjmapr5s r/versionrRs%S/*E22EeS!!!5*%%	!HHSe__--EE5LELr1package_datac>d|vr|d|d<|S)NrVr)r)rs r/canonic_package_datards+
    l'++C00Rr1
    data_filescrt|tr|Sfd|DS)zFor compatibility with ``setup.py``, ``data_files`` should be a list
        of pairs instead of a dict.
    
        This function also expands glob patterns.
        c:g|]\}}|t|fSrR)rq)r7destrSrTs   r/
    z&canonic_data_files..us<D(
    }Xx001r1)r<rr)rrTs `r/canonic_data_filesrjsT*d##(..00r1entry-pointstextctdd}t|_|||d|D}||jd|S)a?Given the contents of entry-points file,
        process it into a 2-level dictionary (``dict[str, dict[str, str]]``).
        The first level keys are entry-point groups, the second level keys are
        entry-point names, and the second level values are references to objects
        (that correspond to the entry-point value).
        N)=)default_section
    delimiterscXi|]'\}}|t|(SrR)dictr)r7rrs   r/rz entry_points..s,
    <
    <
    >> def obtain_mapping():
        ...     print("Running expensive function!")
        ...     return {"key": "value", "other key": "other value"}
        >>> mapping = LazyMappingProxy(obtain_mapping)
        >>> mapping["key"]
        Running expensive function!
        'value'
        >>> mapping["other key"]
        'other value'
        obtain_mapping_valuec"||_d|_dSr$)_obtain_value)r-rs  r/r0zLazyMappingProxy.__init__s+15r1r2cP|j||_|jSr$)rrrs r/_targetzLazyMappingProxy._targets!;,,..DK{r1keyc6||Sr$)r)r-rs  r/__getitem__zLazyMappingProxy.__getitem__s||~~c""r1cDt|Sr$)rrrs r/__len__zLazyMappingProxy.__len__s4<<>>"""r1cDt|Sr$)iterrrs r/rzLazyMappingProxy.__iter__sDLLNN###r1N)rLrMrNrOrr
    rrr0rr rr"rrrRr1r/rrs6Xb'"b&/6I-J6666R
    #r#b#########$(2,$$$$$$r1rr$)NN)r)JrOr%rr`r'rglobrconfigparserrimportlib.machineryr	itertoolsrtypingrrr	r
    rrr
    rrrrrrtypesrdistutils.errorsr_pathrrwarningsrsetuptools.distrrrdistutils.distr
    from_iterable
    chain_iterrPPathLike_Pathrrr rqbytesr}r{ryrxrrrrrrrrrrrrrrrrrrRr1r/r5s&
    
    
    				
    
    
    
    %%%%%%******
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    111111++++++((((((4,,,,,,444444333333
    
     
    
    c2;WT]]WTT"""PPPPPPPP8:>sm'/	#YB%UHUO ;<PS$EhuoE(5/EEEEue|,
    ES04 $#*#*#*'#s(+,#*uo#*#*#*#*LChuo*Zcj11#+GCH,=#>1JO1
    5(3-$%1111H04 $
    '
    '
    ''#s(+,
    'uo
    '	
    '
    '
    '
    '$04 $SScNS'#s(+,SuoS
    #x-	SSSS15 $	222tCH~.2uo	2
    #Y
    2222j"u"E"c""""
    58E#s(O#>(##LJhJJJKKK
    x
     
     
    &BFJJy"--MFB''J!~~lB77-+;	j  "''0B'CCCB4d;;G##$:D@STT
    	8%+7K##%%%!!+...$$T;777		8	8	8	8	8	8	8	8	8	8	8	8	8	8	8	
    %%d&<==={s/ACC	Cc|jd}|t|ttfrdS|d}t|t
    rp|j|d<|jdi|d<t|j	5tjdi||jd<ddddS#1swxYwYdSdS)NpackagesfindrXpackage-dirfill_package_dir)r`r,
    isinstancelisttupledictrXrOrPr?rt
    find_packages)rerrs   r ryz _ConfigExpander._expand_packagess8&**:66z(T5MBBF||F##dD!!	P#}D'+':'E'EmUW'X'XD#$ 9::
    P
    P292G2O2O$2O2O#J/
    P
    P
    P
    P
    P
    P
    P
    P
    P
    P
    P
    P
    P
    P
    P
    P
    P
    P	P	Ps!CCCc~ttj|j}||jd|dS)N)rXz
    data-files)rrtcanonic_data_filesrXrqr`)re
    data_filess  r r|z"_ConfigExpander._expand_data_filess:W7$-PPP
    D/zJJJJJrAr{c|j}ttj||}||jd|dS)N)r{rXcmdclass)rXrrtrrqr`)rer{rXrs    r r}z _ConfigExpander._expand_cmdclasssA=7+xXXXD/XFFFFFrAc
    dfdjD}|pid|D}j	|dS)N)versionreadmeentry-pointsscriptsgui-scriptsclassifiersdependenciesoptional-dependenciescHi|]}|v||Sr)_obtain).0rmr;r{respecials  r 
    z7_ConfigExpander._expand_all_dynamic..s@
    
    
    G##
    4<<e[99###rA)rrrroptional_dependenciesci|]
    \}}|||Srpr)rkvs   r rz7_ConfigExpander._expand_all_dynamic..sNNNDAq
    1a
    
    
    rA)
    r]r_obtain_entry_points_obtain_version_obtain_readme_obtain_classifiers_obtain_dependencies_obtain_optional_dependenciesitemsr_)rer;r{obtained_dynamicupdatesrs```  @r r~z#_ConfigExpander._expand_all_dynamics	
    
    
    
    
    
    
    
    
    
    
    
    	%%dK88>B(({;;&&t,,006622488"&"D"DT"J"J
    	 	
    	
    	
    ON$4$:$:$<$<NNN(((((rAcpt||}||jsd|d}t|dSdS)Nz#No configuration found for dynamic z.
    Some dynamic fields need to be specified via `tool.setuptools.dynamic`
    others must be specified via the equivalent attribute in `setup.py`.)rr?r)rer;rmpreviousmsgs     r _ensure_previously_setz&_ConfigExpander._ensure_previously_sets_&u-d33D$=YeYYY
    
    %S)))
    rA	specifiercddlm}t|j5|j}d|vrP|j||dtj|d|cdddSd|vr(tj	|d||cdddStd|d|#1swxYwYdS)Nr)always_iterablerattrz	invalid `z`: ) setuptools.extern.more_itertoolsrrPr?rXrdrrt
    read_files	read_attrr6)rer	directiver{rrXs      r _expand_directivez!_ConfigExpander._expand_directives]	EDDDDD
    D5
    6
    6	F	F}H""&--ooi>O.P.PQQQ))F*;XFF		F	F	F	F	F	F	F	F
    ""(6):KRR
    	F	F	F	F	F	F	F	FDDDyDDEEE	F	F	F	F	F	F	F	FtsAB87B8#B88B<?B<c||jvr%|d||j||S|||dS)Nztool.setuptools.dynamic.)rarr)rer;rmr{s    r rz_ConfigExpander._obtains^D$$$))2522 '
    
    	
    ##D%000trAc|d|jvr2d|jvr)tj||d|SdS)Nr)r]rartrr)rer;r{s   r rz_ConfigExpander._obtain_version'sA$$d6F)F)F?4<<i#M#MNNNtrAcd|jvrdS|j}d|vr4||di|ddddS||ddS)Nrcontent-typez
    text/x-rst)textr)r]rarr,r)rer;ras   r rz_ConfigExpander._obtain_readme-s~4<''4&{""T8R88 +H 5 9 9., W W
    
    	
    ##D(333trAcd}tfd|DsdS|d|}|dStj|didtdtffd}|dd|d	d
    S)N)rrrc3*K|]
    }|jvVdSrp)r])rrmres  r 	z7_ConfigExpander._obtain_entry_points..?s*==U5DL(======rArrmgroupc|vrG|}|jvr"ttj||||<dSdSrp)popr]rrr5)rmrvalueexpandedgroupsres   r _set_scriptsz:_ConfigExpander._obtain_entry_points.._set_scriptsIsY
    
    5)),,,_-DUE-R-RSSS"'	rArconsole_scriptsrgui_scripts)anyrrtentry_pointsstr)rer;r{fieldsrrrrs`     @@r rz$_ConfigExpander._obtain_entry_points;s<====f=====	4||D.+>><4%d++"F+	(	(C	(	(	(	(	(	(	(	(	Y 1222]M222rAcrd|jvr-||di}|r|SdS)Nr)r]r
    splitlinesrer;rs   r rz#_ConfigExpander._obtain_classifiersUsCDL((LL}b99E
    *'')))trAchd|jvr(||di}|rt|SdS)Nr)r]r_parse_requirements_listrs   r rz$_ConfigExpander._obtain_dependencies\s?T\))LL~r::E
    7/666trAcdjvrdSdjvrDjd}t|tsJfd|DS|ddS)Nrc
    fi|]-\}}|td||i.S)z.tool.setuptools.dynamic.optional-dependencies.)rr)rrrres   r rzA_ConfigExpander._obtain_optional_dependencies..is`			%E9/**PPP!			rA)r]rarrrr)rer;optional_dependencies_maps`  r rz-_ConfigExpander._obtain_optional_dependenciescs"$,664"d&666(,(89P(Q%7>>>>>				)B(G(G(I(I				
    	
    ##D*ABBBtrANFN)rr)rr)r;r)__name__
    __module____qualname__rr	_Pathboolrfrkrrrqrwrryr|rr}r~rrrrrrrrrrrrAr rZrZs%)%*)-1115/1#	1
    ~&1111"111188S8h8888
    ::::"
    P
    P
    PKKKGGCH,=GGGG
    ))WSRUXEV))))<*>*#****
    
    6=c3h6G
    
    
    
    N3WSRUXEVNcAR>htCH~6N"18c1B	$sDy/	"4rArZc>d|DS)Ncg|]?}||d=|@S)#)r2
    startswith)rlines  r 
    z,_parse_requirements_list..xsV::<<!%
    
     7 7 < <rA)r)rs r rrws/$$&&rAc#K|sdVdS	dVdS#t$r5}td|jjd|Yd}~dSd}~wwxYw)Nzignored error: z - )	Exceptionr3r4	__class__r)r?r9s  r rPrPs
    H
    HHH
    
    F(=FF"FFGGGGGGGGGHs
    A*AAc@eZdZdddedeffdZfdZfdZxZS)rzdistributionrr_r`cft|||_||_dSrp)superrf_project_cfg_setuptools_cfg)rerr_r`rs    r rfz"_EnsurePackagesDiscovered.__init__s3	&&&'-rAc|j|j}}|di}||jpi||_|j|jj$|j	
    d|j_|j|
    d|_|j|
    d|_tS)zWhen entering the context, the values of ``packages``, ``py_modules`` and
            ``package_dir`` that are missing in ``dist`` are copied from ``setuptools_cfg``.
            rNr1
    py-modulesr)rbrrOrr{set_defaults_ignore_ext_modulesmetadatar1rr,
    py_modulesrr	__enter__)rer;cfgr{rs    r rz#_EnsurePackagesDiscovered.__enter__sJ 4c&)nn]B&G&G4+1r222&--///=%!%!2!6!6v!>!>DM?"!ggl33DO= GGJ//DMww  """rAc|jd|jj|jd|jjt|||S)zWhen exiting the context, if values of ``packages``, ``py_modules`` and
            ``package_dir`` are missing in ``setuptools_cfg``, copy from ``dist``.
            rr)rrOrbrrr__exit__)reexc_type	exc_value	tracebackrs    r rz"_EnsurePackagesDiscovered.__exit__s]
    	
    ''
    DJ4GHHH''dj6KLLLww)Y???rA)rrrrrfrr
    __classcell__)rs@r rzrzs.*.9=.OS......#####,@@@@@@@@@rArzceZdZdZdS)rLz``{subject}` in `pyproject.toml` is still *experimental* and likely to change in future releases.N)rrr_SUMMARYrrAr rLrLs	3
    HHrArL)F)TFNr)1__doc__loggingrH
    contextlibr	functoolsrtypingrrrrr	r
    rerrorsr
    rwarningsrr*rrt_apply_pyprojecttomlrrrr>rirrPathLiker	getLoggerrr3rr!rr.r@r=rRrZrrPEnsurePackagesDiscoveredrzrLrrAr rs						%%%%%%OOOOOOOOOOOOOOOOOO22222222((((((FFFFFFFF111111-,,,,,,
    c2;
    '
    H
    %
    %  $    :T:U:t::::0	*	*
    	*	*		*	*	*	*%)	???>
    "	????H!%!&%)	RRRuoRR>
    "	R
    
    RRRR.UUUUUUUUpHHHHH%@%@%@%@%@ @%@%@%@P!2rAPK!,3^3^0__pycache__/_apply_pyprojecttoml.cpython-311.pycnu[
    
    i9UdZddlZddlZddlmZddlmZddlmZm	Z	ddl
    mZddlm
    Z
    ddlmZdd	lmZmZmZmZmZmZmZmZmZmZmZd
    dlmZd
    dlmZerdd
    l m!Z!ddl"m#Z#eiZ$ee%d<eej&e'fZ(ee)e'fZ*edee(gdfZ+ee'e+fZ,ej-e.Z/ddde)de(ddfdZ0ddde)de(fdZ1ddde)de(fdZ2ddde)fdZ3de'de'fdZ4ddde'defdZ5d d!d"d#Z6d$e'dee'fd%Z7ddd&e*de(fd'Z8ddd&e)de(fd(Z9ddd&ee)d)e(d*e'fd+Z:ddd&e)fd,Z;ddd&e)fd-Zddd&e)fd/Z?de)fd0Z@d1e)ddde(fd2ZAe$fd3edee'ee'ffd4ZBd5d6deee'effd7ZCd8e'de'fd9ZDd:eee'ee'e'fdee'fd;ZEdddee'e=ffd<ZFdddee=fd=ZGdddee=fd>ZHd?ZId@ZJe8e9ee:dABee:dCBe;e>e?e
    suggestionmsgs	         r.r'r'WsFB''++L"==J"((**++u&u--***!"5h"?@@J,1C%TYY
    
    z/J%K%KLLL%))(H==D(E****&$11111r@r;c&t|dg}tD]S\}}||vsJ||vsF||}|r9t||t|||<TdS)zJBe temporarily forgiving with ``dynamic`` fields not listed in ``dynamic``dynamicr<r=N)setr2_PREVIOUSLY_DEFINEDr6_MissingDynamicemit_RESET_PREVIOUSLY_DEFINED)rr;rMr<getterr=s      r.r4r4ms-##Ir2233G,2244LL
    v&&%7*:*:F4LLE
    L$$5$>>>'@'D'DU'K'K
    e$LLr@keycR|ddS)z1As defined in :pep:`566#json-compatible-metadata`-_)lowerreplace)rUs r.r7r7xs 99;;sC(((r@r<r=ct|jd|d}|r
    ||dSt|j|s	|tvrt	|j||dSt	|||dS)Nset_)getattrrhasattrSETUPTOOLS_PATCHESsetattr)rr<r=setters    r.r:r:}s
    T]N5NND
    9
    9F
    $u
    
    
    
    
    		&	&$%3E*E*E
    ue,,,,,eU#####r@z
    text/markdownz
    text/x-rstz
    text/plain)z.mdz.rstz.txtfilec@tj|\}}|sdS|tvr
    t|SddtD}d|d}td|d|)N, c3,K|]\}}|d|dVdS)z ()N.0kvs   r.	z&_guess_content_type..s2FFtq!llalllFFFFFFr@z3only the following file extensions are recognized: r"zUndefined content type for )r#r$splitextrY_CONTENT_TYPESrFr6
    ValueError)rbrXextvalidrKs     r._guess_content_typerrs
    W
    
    djjll
    +
    +FAst
    nc""IIFF~/C/C/E/EFFFFFE
    H
    H
    H
    HC
    @4@@3@@
    A
    AAr@valcddlm}t|tr(|}|||}t|}nJ|dpg}|dp|||}|d}t|d||rt|d||r/|j	tt|dSdS)Nrexpandrbtextzcontent-typelong_descriptionlong_description_content_type)setuptools.configrv
    isinstancestr
    read_filesrrr2r:_referenced_filesaddr)rrsr,rvrbrwctypes       r._long_descriptionrs((((((#s$!$  x00#C((wwv$"wwvC&"3"3D("C"CN#($///BD95AAA4""4T??3333344r@cddlm}d|vrNt|d||dg||j|ddSt|d|ddS)Nrrurblicenserw)rzrvr:r}r~r)rrsr,rvs    r._licensers((((((
    }}D)V%6%6F}h%O%OPPP""3v;/////D)S[11111r@	_root_dirkindcg}g}|D]}d|vr||d"d|vr||dBt|d|d}|t||r$t||d||r)t||dd|dSdS)Nnameemail)display_name	addr_specrd_email)appendrr|r:rF)rrsrrr<email_fieldpersonaddrs        r._peoplersEK**vg////
    F
    "
    "LL((((v&/RRRDs4yy))))2D$		% 0 0111CDT///499[+A+ABBBBBCCr@c(t|d|dS)Nproject_urls)r:)rrsrs   r.
    _project_urlsrsnc*****r@cFddlm}t|d||dS)Nr)SpecifierSetpython_requires)&setuptools.extern.packaging.specifiersrr:)rrsrrs    r._python_requiresrs7CCCCCC'c):):;;;;;r@cbt|dgrd}tj|||_dS)Ninstall_requireszA`install_requires` overwritten in `pyproject.toml` (dependencies))r]rrRr)rrsrrKs    r.
    _dependenciesrs;t',,$Qs###Dr@cBt|ddpi}i|||_dS)Nextras_require)r]r)rrsrexistings    r._optional_dependenciesrs1t-t44:H-X--Dr@cb|}|d|di}ddd}t|D]6\}}t|}||vr|||||<7|r#d|D|d<dSdS)Nentry-pointsentry_pointsconsole_scriptsgui_scripts)scriptsrcVi|]&\}}||d|D'S)c"g|]\}}|d|
    S)z = rgrhs   r.
    z2_unify_entry_points...s&:::DAqa<z'_unify_entry_points..sK#
    #
    #
    e#
    ::EKKMM:::#
    #
    #
    r@)poplistr6r7)r;r1rrenamingrUr=r>s       r.r5r5sG;;~w{{>2/N/NOOL,]KKH7==??++@@
    U&s++x/6{{3/?/?L(+,
    #
    #
    +1133#
    #
    #
    
    
    r@	pyprojectc	|di}|didi}t|}|j}|didiD]\}}t	|}||t}	||i|D]S\}
    }t	|
    }
    t||f|||
    <|
    |	vr!t	d|d|
    dTdS)NrBrCcmdclass	distutilszCommand option r"z is not defined)
    r2_valid_command_optionscommand_optionsr6r7rO
    setdefaultr|_loggerwarning)rrrrIr
    valid_optionscmd_optscmdrrqrUr=s            r.rHrHsQvr**J~~lB//33JCCH*844M#H }}VR0044["EEKKMM
    N
    NV!#&&!!#suu--C$$$ ,,..	N	NJC%c**C"%h--!7HSM#% L# L L L L LMMM
    	N	
    N
    Nr@rc	|ddlm}ddlm}dt	|ji}|jd}d|D}d	|D}t||D]M\}}|	|t}	|	t	t|d
    gz}	|	||<N|S)Nrrrrglobalzdistutils.commands)rc34K|]}t|VdSN)_load_eprieps  r.rlz)_valid_command_options..s(HHB8B<<HHHHHHr@c3K|]}||V	dSrrgrs  r.rlz)_valid_command_options..s';;2;B;;;;;;r@user_options)
    _importlibrsetuptools.distr_normalise_cmd_optionsglobal_optionsrrr6r2rOr])
    rrrrunloaded_entry_pointsloaded_entry_pointsrr	cmd_classoptss
              r.rr	s%%%%%%,,,,,,5l6QRRSM1H18LMMMHH2GHHH;;!4;;;Lhnn.>.>??""Y  cee,,,WYPR-S-STTT!
    cr@rzmetadata.EntryPointc	|j|fS#t$r@}|jjd|j}t
    |d|Yd}~dSd}~wwxYw)Nz" while trying to load entry-point z: )rload	Exception	__class____name__rr)rexrKs   r.rrs~##&SS"'SS3"'''ttttts
    A'5A""A'rcFt|dS)Nz_=)r7strip)rs r._normalise_cmd_option_keyr$st$$**4000r@desccd|DS)Nc8h|]}t|dS)r)r)rifancy_options  r.	z)_normalise_cmd_options..)s%PPP<%l1o66PPPr@rg)rs r.rr(sPP4PPPPr@cndt|ddpi}fd|DS)N)rrrc$i|]\}}|v	||
    Srgrg)rirjrkignores   r.rz-_get_previous_entrypoints../s$>>>TQavooAqooor@)r]r6)rr=rs  @r._get_previous_entrypointsr,s@
    /FD.$//52E>>>>U[[]]>>>>r@cRt|ddpi}|dS)Nrrr]r2rr=s  r._get_previous_scriptsr2s+D.$//52E99&'''r@cRt|ddpi}|dS)Nrrrrs  r._get_previous_gui_scriptsr7s*D.$//52E99]###r@cVttd|dS)a8
        Similar to ``operator.attrgetter`` but returns None if ``attr`` is not found
        >>> from types import SimpleNamespace
        >>> obj = SimpleNamespace(a=42, b=SimpleNamespace(c=13))
        >>> _attrgetter("a")(obj)
        42
        >>> _attrgetter("b.c")(obj)
        13
        >>> _attrgetter("d")(obj) is None
        True
        c$t||dSr)r])accxs  r.z_attrgetter..Hs'#q$*?*?r@r")rrsplit)attrs r._attrgetterr<s$6??CQQQr@cfd}|S)aL
        Return the first "truth-y" attribute or None
        >>> from types import SimpleNamespace
        >>> obj = SimpleNamespace(a=42, b=SimpleNamespace(c=13))
        >>> _some_attrgetter("d", "a", "b.c")(obj)
        42
        >>> _some_attrgetter("d", "e", "b.c", "a")(obj)
        13
        >>> _some_attrgetter("d", "e", "f")(obj) is None
        True
        cVfdD}td|DdS)Nc3HK|]}t|VdSr)r)riiobjs  r.rlz5_some_attrgetter.._acessor..Ys355!.+a..%%555555r@c3K|]}||V	dSrrg)rirs  r.rlz5_some_attrgetter.._acessor..Zs"881!-Q----88r@)next)rvaluesr6s` r._acessorz"_some_attrgetter.._acessorXs<5555u55588888$???r@rg)r6rs` r._some_attrgetterrKs(@@@@@Or@author)r
    maintainer)readmerauthorsmaintainersurlsdependenciesoptional_dependenciesrequires_pythonr8script_filesrnamespace_packagesz
            Please migrate to implicit native namespaces instead.
            See https://packaging.python.org/en/latest/guides/packaging-namespace-packages/.
            >license_filer
    license_filesprovides_extrasryz
    metadata.nameversionzmetadata.versiondescriptionzmetadata.descriptionrzmetadata.long_descriptionzrequires-pythonrzmetadata.python_requiresrzmetadata.licenserzmetadata.authorzmetadata.author_emailrzmetadata.maintainerzmetadata.maintainer_emailkeywordszmetadata.keywordsclassifierszmetadata.classifiersrzmetadata.project_urlsrgui-scriptsrroptional-dependenciesr)rrrrrrrrrrr	rSc:eZdZdZdZedededefdZdS)rQz9`{field}` defined outside of `pyproject.toml` is ignored.a
        The following seems to be defined outside of `pyproject.toml`:
    
        `{field} = {value!r}`
    
        According to the spec (see the link below), however, setuptools CANNOT
        consider this value unless `{field}` is listed as `dynamic`.
    
        https://packaging.python.org/en/latest/specifications/declaring-project-metadata/
    
        To prevent this problem, you can list `{field}` under `dynamic` or alternatively
        remove the `[project]` table from your file and rely entirely on other means of
        configuration.
        r<r=r c:|j||S)NrN)_DETAILSformat)clsr<r=s   r.detailsz_MissingDynamic.detailss|""e"<<r(sD				######((((((%%%%%%%%""""""('''''((((((-......,,,,,,!!"%%w%%%
    bk3
    49
    
    
    ~sE2D8
    9
    Z(
    '
    H
    %
    %.,.~.t.u...."2N2D2E2222,L.LLLLL)S)S))))
    $n$S$$$$$
    Bc
    Bhsm
    B
    B
    B
    B4N44u4444*2>222222C.CtDzCeC3CCCC$++T++++<><<<<<  T    ..d....
    
    t
    
    
    
    (NTNN5NNNN&05Wc3s8m9L"&8E#t)4D+E1C1C1111QeC#,C&D!EQ#c(QQQQ?N?tCI????((8D>((((
    $N$x~$$$$
    RRR* wwX...77666!3'	8	8$sO34			%i0
    KK((
    {{-..;;566
    kk566	
    ''(9;UVV{{-..
     13JKK##$9;VWW/00;;566KK/00-$,KK 233 [[)9::!.##4"====='=====r@PK!A#!@@	expand.pynu["""Utility functions to expand configuration directives or special values
    (such glob patterns).
    
    We can split the process of interpreting configuration files into 2 steps:
    
    1. The parsing the file contents from strings to value objects
       that can be understand by Python (for example a string with a comma
       separated list of keywords into an actual Python list of strings).
    
    2. The expansion (or post-processing) of these values according to the
       semantics ``setuptools`` assign to them (for example a configuration field
       with the ``file:`` directive should be expanded from a list of file paths to
       a single string with the contents of those files concatenated)
    
    This module focus on the second step, and therefore allow sharing the expansion
    functions among several configuration file formats.
    
    **PRIVATE MODULE**: API reserved for setuptools internal usage only.
    """
    import ast
    import importlib
    import os
    import pathlib
    import sys
    from glob import iglob
    from configparser import ConfigParser
    from importlib.machinery import ModuleSpec
    from itertools import chain
    from typing import (
        TYPE_CHECKING,
        Callable,
        Dict,
        Iterable,
        Iterator,
        List,
        Mapping,
        Optional,
        Tuple,
        TypeVar,
        Union,
        cast,
    )
    from pathlib import Path
    from types import ModuleType
    
    from distutils.errors import DistutilsOptionError
    
    from .._path import same_path as _same_path
    from ..warnings import SetuptoolsWarning
    
    if TYPE_CHECKING:
        from setuptools.dist import Distribution  # noqa
        from setuptools.discovery import ConfigDiscovery  # noqa
        from distutils.dist import DistributionMetadata  # noqa
    
    chain_iter = chain.from_iterable
    _Path = Union[str, os.PathLike]
    _K = TypeVar("_K")
    _V = TypeVar("_V", covariant=True)
    
    
    class StaticModule:
        """Proxy to a module object that avoids executing arbitrary code."""
    
        def __init__(self, name: str, spec: ModuleSpec):
            module = ast.parse(pathlib.Path(spec.origin).read_bytes())
            vars(self).update(locals())
            del self.self
    
        def _find_assignments(self) -> Iterator[Tuple[ast.AST, ast.AST]]:
            for statement in self.module.body:
                if isinstance(statement, ast.Assign):
                    yield from ((target, statement.value) for target in statement.targets)
                elif isinstance(statement, ast.AnnAssign) and statement.value:
                    yield (statement.target, statement.value)
    
        def __getattr__(self, attr):
            """Attempt to load an attribute "statically", via :func:`ast.literal_eval`."""
            try:
                return next(
                    ast.literal_eval(value)
                    for target, value in self._find_assignments()
                    if isinstance(target, ast.Name) and target.id == attr
                )
            except Exception as e:
                raise AttributeError(f"{self.name} has no attribute {attr}") from e
    
    
    def glob_relative(
        patterns: Iterable[str], root_dir: Optional[_Path] = None
    ) -> List[str]:
        """Expand the list of glob patterns, but preserving relative paths.
    
        :param list[str] patterns: List of glob patterns
        :param str root_dir: Path to which globs should be relative
                             (current directory by default)
        :rtype: list
        """
        glob_characters = {'*', '?', '[', ']', '{', '}'}
        expanded_values = []
        root_dir = root_dir or os.getcwd()
        for value in patterns:
            # Has globby characters?
            if any(char in value for char in glob_characters):
                # then expand the glob pattern while keeping paths *relative*:
                glob_path = os.path.abspath(os.path.join(root_dir, value))
                expanded_values.extend(
                    sorted(
                        os.path.relpath(path, root_dir).replace(os.sep, "/")
                        for path in iglob(glob_path, recursive=True)
                    )
                )
    
            else:
                # take the value as-is
                path = os.path.relpath(value, root_dir).replace(os.sep, "/")
                expanded_values.append(path)
    
        return expanded_values
    
    
    def read_files(filepaths: Union[str, bytes, Iterable[_Path]], root_dir=None) -> str:
        """Return the content of the files concatenated using ``\n`` as str
    
        This function is sandboxed and won't reach anything outside ``root_dir``
    
        (By default ``root_dir`` is the current directory).
        """
        from setuptools.extern.more_itertools import always_iterable
    
        root_dir = os.path.abspath(root_dir or os.getcwd())
        _filepaths = (os.path.join(root_dir, path) for path in always_iterable(filepaths))
        return '\n'.join(
            _read_file(path)
            for path in _filter_existing_files(_filepaths)
            if _assert_local(path, root_dir)
        )
    
    
    def _filter_existing_files(filepaths: Iterable[_Path]) -> Iterator[_Path]:
        for path in filepaths:
            if os.path.isfile(path):
                yield path
            else:
                SetuptoolsWarning.emit(f"File {path!r} cannot be found")
    
    
    def _read_file(filepath: Union[bytes, _Path]) -> str:
        with open(filepath, encoding='utf-8') as f:
            return f.read()
    
    
    def _assert_local(filepath: _Path, root_dir: str):
        if Path(os.path.abspath(root_dir)) not in Path(os.path.abspath(filepath)).parents:
            msg = f"Cannot access {filepath!r} (or anything outside {root_dir!r})"
            raise DistutilsOptionError(msg)
    
        return True
    
    
    def read_attr(
        attr_desc: str,
        package_dir: Optional[Mapping[str, str]] = None,
        root_dir: Optional[_Path] = None,
    ):
        """Reads the value of an attribute from a module.
    
        This function will try to read the attributed statically first
        (via :func:`ast.literal_eval`), and only evaluate the module if it fails.
    
        Examples:
            read_attr("package.attr")
            read_attr("package.module.attr")
    
        :param str attr_desc: Dot-separated string describing how to reach the
            attribute (see examples above)
        :param dict[str, str] package_dir: Mapping of package names to their
            location in disk (represented by paths relative to ``root_dir``).
        :param str root_dir: Path to directory containing all the packages in
            ``package_dir`` (current directory by default).
        :rtype: str
        """
        root_dir = root_dir or os.getcwd()
        attrs_path = attr_desc.strip().split('.')
        attr_name = attrs_path.pop()
        module_name = '.'.join(attrs_path)
        module_name = module_name or '__init__'
        _parent_path, path, module_name = _find_module(module_name, package_dir, root_dir)
        spec = _find_spec(module_name, path)
    
        try:
            return getattr(StaticModule(module_name, spec), attr_name)
        except Exception:
            # fallback to evaluate module
            module = _load_spec(spec, module_name)
            return getattr(module, attr_name)
    
    
    def _find_spec(module_name: str, module_path: Optional[_Path]) -> ModuleSpec:
        spec = importlib.util.spec_from_file_location(module_name, module_path)
        spec = spec or importlib.util.find_spec(module_name)
    
        if spec is None:
            raise ModuleNotFoundError(module_name)
    
        return spec
    
    
    def _load_spec(spec: ModuleSpec, module_name: str) -> ModuleType:
        name = getattr(spec, "__name__", module_name)
        if name in sys.modules:
            return sys.modules[name]
        module = importlib.util.module_from_spec(spec)
        sys.modules[name] = module  # cache (it also ensures `==` works on loaded items)
        spec.loader.exec_module(module)  # type: ignore
        return module
    
    
    def _find_module(
        module_name: str, package_dir: Optional[Mapping[str, str]], root_dir: _Path
    ) -> Tuple[_Path, Optional[str], str]:
        """Given a module (that could normally be imported by ``module_name``
        after the build is complete), find the path to the parent directory where
        it is contained and the canonical name that could be used to import it
        considering the ``package_dir`` in the build configuration and ``root_dir``
        """
        parent_path = root_dir
        module_parts = module_name.split('.')
        if package_dir:
            if module_parts[0] in package_dir:
                # A custom path was specified for the module we want to import
                custom_path = package_dir[module_parts[0]]
                parts = custom_path.rsplit('/', 1)
                if len(parts) > 1:
                    parent_path = os.path.join(root_dir, parts[0])
                    parent_module = parts[1]
                else:
                    parent_module = custom_path
                module_name = ".".join([parent_module, *module_parts[1:]])
            elif '' in package_dir:
                # A custom parent directory was specified for all root modules
                parent_path = os.path.join(root_dir, package_dir[''])
    
        path_start = os.path.join(parent_path, *module_name.split("."))
        candidates = chain(
            (f"{path_start}.py", os.path.join(path_start, "__init__.py")),
            iglob(f"{path_start}.*"),
        )
        module_path = next((x for x in candidates if os.path.isfile(x)), None)
        return parent_path, module_path, module_name
    
    
    def resolve_class(
        qualified_class_name: str,
        package_dir: Optional[Mapping[str, str]] = None,
        root_dir: Optional[_Path] = None,
    ) -> Callable:
        """Given a qualified class name, return the associated class object"""
        root_dir = root_dir or os.getcwd()
        idx = qualified_class_name.rfind('.')
        class_name = qualified_class_name[idx + 1 :]
        pkg_name = qualified_class_name[:idx]
    
        _parent_path, path, module_name = _find_module(pkg_name, package_dir, root_dir)
        module = _load_spec(_find_spec(module_name, path), module_name)
        return getattr(module, class_name)
    
    
    def cmdclass(
        values: Dict[str, str],
        package_dir: Optional[Mapping[str, str]] = None,
        root_dir: Optional[_Path] = None,
    ) -> Dict[str, Callable]:
        """Given a dictionary mapping command names to strings for qualified class
        names, apply :func:`resolve_class` to the dict values.
        """
        return {k: resolve_class(v, package_dir, root_dir) for k, v in values.items()}
    
    
    def find_packages(
        *,
        namespaces=True,
        fill_package_dir: Optional[Dict[str, str]] = None,
        root_dir: Optional[_Path] = None,
        **kwargs,
    ) -> List[str]:
        """Works similarly to :func:`setuptools.find_packages`, but with all
        arguments given as keyword arguments. Moreover, ``where`` can be given
        as a list (the results will be simply concatenated).
    
        When the additional keyword argument ``namespaces`` is ``True``, it will
        behave like :func:`setuptools.find_namespace_packages`` (i.e. include
        implicit namespaces as per :pep:`420`).
    
        The ``where`` argument will be considered relative to ``root_dir`` (or the current
        working directory when ``root_dir`` is not given).
    
        If the ``fill_package_dir`` argument is passed, this function will consider it as a
        similar data structure to the ``package_dir`` configuration parameter add fill-in
        any missing package location.
    
        :rtype: list
        """
        from setuptools.discovery import construct_package_dir
        from setuptools.extern.more_itertools import unique_everseen, always_iterable
    
        if namespaces:
            from setuptools.discovery import PEP420PackageFinder as PackageFinder
        else:
            from setuptools.discovery import PackageFinder  # type: ignore
    
        root_dir = root_dir or os.curdir
        where = kwargs.pop('where', ['.'])
        packages: List[str] = []
        fill_package_dir = {} if fill_package_dir is None else fill_package_dir
        search = list(unique_everseen(always_iterable(where)))
    
        if len(search) == 1 and all(not _same_path(search[0], x) for x in (".", root_dir)):
            fill_package_dir.setdefault("", search[0])
    
        for path in search:
            package_path = _nest_path(root_dir, path)
            pkgs = PackageFinder.find(package_path, **kwargs)
            packages.extend(pkgs)
            if pkgs and not (
                fill_package_dir.get("") == path or os.path.samefile(package_path, root_dir)
            ):
                fill_package_dir.update(construct_package_dir(pkgs, path))
    
        return packages
    
    
    def _nest_path(parent: _Path, path: _Path) -> str:
        path = parent if path in {".", ""} else os.path.join(parent, path)
        return os.path.normpath(path)
    
    
    def version(value: Union[Callable, Iterable[Union[str, int]], str]) -> str:
        """When getting the version directly from an attribute,
        it should be normalised to string.
        """
        if callable(value):
            value = value()
    
        value = cast(Iterable[Union[str, int]], value)
    
        if not isinstance(value, str):
            if hasattr(value, '__iter__'):
                value = '.'.join(map(str, value))
            else:
                value = '%s' % value
    
        return value
    
    
    def canonic_package_data(package_data: dict) -> dict:
        if "*" in package_data:
            package_data[""] = package_data.pop("*")
        return package_data
    
    
    def canonic_data_files(
        data_files: Union[list, dict], root_dir: Optional[_Path] = None
    ) -> List[Tuple[str, List[str]]]:
        """For compatibility with ``setup.py``, ``data_files`` should be a list
        of pairs instead of a dict.
    
        This function also expands glob patterns.
        """
        if isinstance(data_files, list):
            return data_files
    
        return [
            (dest, glob_relative(patterns, root_dir))
            for dest, patterns in data_files.items()
        ]
    
    
    def entry_points(text: str, text_source="entry-points") -> Dict[str, dict]:
        """Given the contents of entry-points file,
        process it into a 2-level dictionary (``dict[str, dict[str, str]]``).
        The first level keys are entry-point groups, the second level keys are
        entry-point names, and the second level values are references to objects
        (that correspond to the entry-point value).
        """
        parser = ConfigParser(default_section=None, delimiters=("=",))  # type: ignore
        parser.optionxform = str  # case sensitive
        parser.read_string(text, text_source)
        groups = {k: dict(v.items()) for k, v in parser.items()}
        groups.pop(parser.default_section, None)
        return groups
    
    
    class EnsurePackagesDiscovered:
        """Some expand functions require all the packages to already be discovered before
        they run, e.g. :func:`read_attr`, :func:`resolve_class`, :func:`cmdclass`.
    
        Therefore in some cases we will need to run autodiscovery during the evaluation of
        the configuration. However, it is better to postpone calling package discovery as
        much as possible, because some parameters can influence it (e.g. ``package_dir``),
        and those might not have been processed yet.
        """
    
        def __init__(self, distribution: "Distribution"):
            self._dist = distribution
            self._called = False
    
        def __call__(self):
            """Trigger the automatic package discovery, if it is still necessary."""
            if not self._called:
                self._called = True
                self._dist.set_defaults(name=False)  # Skip name, we can still be parsing
    
        def __enter__(self):
            return self
    
        def __exit__(self, _exc_type, _exc_value, _traceback):
            if self._called:
                self._dist.set_defaults.analyse_name()  # Now we can set a default name
    
        def _get_package_dir(self) -> Mapping[str, str]:
            self()
            pkg_dir = self._dist.package_dir
            return {} if pkg_dir is None else pkg_dir
    
        @property
        def package_dir(self) -> Mapping[str, str]:
            """Proxy to ``package_dir`` that may trigger auto-discovery when used."""
            return LazyMappingProxy(self._get_package_dir)
    
    
    class LazyMappingProxy(Mapping[_K, _V]):
        """Mapping proxy that delays resolving the target object, until really needed.
    
        >>> def obtain_mapping():
        ...     print("Running expensive function!")
        ...     return {"key": "value", "other key": "other value"}
        >>> mapping = LazyMappingProxy(obtain_mapping)
        >>> mapping["key"]
        Running expensive function!
        'value'
        >>> mapping["other key"]
        'other value'
        """
    
        def __init__(self, obtain_mapping_value: Callable[[], Mapping[_K, _V]]):
            self._obtain = obtain_mapping_value
            self._value: Optional[Mapping[_K, _V]] = None
    
        def _target(self) -> Mapping[_K, _V]:
            if self._value is None:
                self._value = self._obtain()
            return self._value
    
        def __getitem__(self, key: _K) -> _V:
            return self._target()[key]
    
        def __len__(self) -> int:
            return len(self._target())
    
        def __iter__(self) -> Iterator[_K]:
            return iter(self._target())
    PK!>ccsetupcfg.pynu["""
    Load setuptools configuration from ``setup.cfg`` files.
    
    **API will be made private in the future**
    
    To read project metadata, consider using
    ``build.util.project_wheel_metadata`` (https://pypi.org/project/build/).
    For simple scenarios, you can also try parsing the file directly
    with the help of ``configparser``.
    """
    import contextlib
    import functools
    import os
    from collections import defaultdict
    from functools import partial
    from functools import wraps
    from typing import (
        TYPE_CHECKING,
        Callable,
        Any,
        Dict,
        Generic,
        Iterable,
        List,
        Optional,
        Set,
        Tuple,
        TypeVar,
        Union,
    )
    
    from ..errors import FileError, OptionError
    from ..extern.packaging.markers import default_environment as marker_env
    from ..extern.packaging.requirements import InvalidRequirement, Requirement
    from ..extern.packaging.specifiers import SpecifierSet
    from ..extern.packaging.version import InvalidVersion, Version
    from ..warnings import SetuptoolsDeprecationWarning
    from . import expand
    
    if TYPE_CHECKING:
        from distutils.dist import DistributionMetadata  # noqa
    
        from setuptools.dist import Distribution  # noqa
    
    _Path = Union[str, os.PathLike]
    SingleCommandOptions = Dict["str", Tuple["str", Any]]
    """Dict that associate the name of the options of a particular command to a
    tuple. The first element of the tuple indicates the origin of the option value
    (e.g. the name of the configuration file where it was read from),
    while the second element of the tuple is the option value itself
    """
    AllCommandOptions = Dict["str", SingleCommandOptions]  # cmd name => its options
    Target = TypeVar("Target", bound=Union["Distribution", "DistributionMetadata"])
    
    
    def read_configuration(
        filepath: _Path, find_others=False, ignore_option_errors=False
    ) -> dict:
        """Read given configuration file and returns options from it as a dict.
    
        :param str|unicode filepath: Path to configuration file
            to get options from.
    
        :param bool find_others: Whether to search for other configuration files
            which could be on in various places.
    
        :param bool ignore_option_errors: Whether to silently ignore
            options, values of which could not be resolved (e.g. due to exceptions
            in directives such as file:, attr:, etc.).
            If False exceptions are propagated as expected.
    
        :rtype: dict
        """
        from setuptools.dist import Distribution
    
        dist = Distribution()
        filenames = dist.find_config_files() if find_others else []
        handlers = _apply(dist, filepath, filenames, ignore_option_errors)
        return configuration_to_dict(handlers)
    
    
    def apply_configuration(dist: "Distribution", filepath: _Path) -> "Distribution":
        """Apply the configuration from a ``setup.cfg`` file into an existing
        distribution object.
        """
        _apply(dist, filepath)
        dist._finalize_requires()
        return dist
    
    
    def _apply(
        dist: "Distribution",
        filepath: _Path,
        other_files: Iterable[_Path] = (),
        ignore_option_errors: bool = False,
    ) -> Tuple["ConfigHandler", ...]:
        """Read configuration from ``filepath`` and applies to the ``dist`` object."""
        from setuptools.dist import _Distribution
    
        filepath = os.path.abspath(filepath)
    
        if not os.path.isfile(filepath):
            raise FileError(f'Configuration file {filepath} does not exist.')
    
        current_directory = os.getcwd()
        os.chdir(os.path.dirname(filepath))
        filenames = [*other_files, filepath]
    
        try:
            _Distribution.parse_config_files(dist, filenames=filenames)
            handlers = parse_configuration(
                dist, dist.command_options, ignore_option_errors=ignore_option_errors
            )
            dist._finalize_license_files()
        finally:
            os.chdir(current_directory)
    
        return handlers
    
    
    def _get_option(target_obj: Target, key: str):
        """
        Given a target object and option key, get that option from
        the target object, either through a get_{key} method or
        from an attribute directly.
        """
        getter_name = f'get_{key}'
        by_attribute = functools.partial(getattr, target_obj, key)
        getter = getattr(target_obj, getter_name, by_attribute)
        return getter()
    
    
    def configuration_to_dict(handlers: Tuple["ConfigHandler", ...]) -> dict:
        """Returns configuration data gathered by given handlers as a dict.
    
        :param list[ConfigHandler] handlers: Handlers list,
            usually from parse_configuration()
    
        :rtype: dict
        """
        config_dict: dict = defaultdict(dict)
    
        for handler in handlers:
            for option in handler.set_options:
                value = _get_option(handler.target_obj, option)
                config_dict[handler.section_prefix][option] = value
    
        return config_dict
    
    
    def parse_configuration(
        distribution: "Distribution",
        command_options: AllCommandOptions,
        ignore_option_errors=False,
    ) -> Tuple["ConfigMetadataHandler", "ConfigOptionsHandler"]:
        """Performs additional parsing of configuration options
        for a distribution.
    
        Returns a list of used option handlers.
    
        :param Distribution distribution:
        :param dict command_options:
        :param bool ignore_option_errors: Whether to silently ignore
            options, values of which could not be resolved (e.g. due to exceptions
            in directives such as file:, attr:, etc.).
            If False exceptions are propagated as expected.
        :rtype: list
        """
        with expand.EnsurePackagesDiscovered(distribution) as ensure_discovered:
            options = ConfigOptionsHandler(
                distribution,
                command_options,
                ignore_option_errors,
                ensure_discovered,
            )
    
            options.parse()
            if not distribution.package_dir:
                distribution.package_dir = options.package_dir  # Filled by `find_packages`
    
            meta = ConfigMetadataHandler(
                distribution.metadata,
                command_options,
                ignore_option_errors,
                ensure_discovered,
                distribution.package_dir,
                distribution.src_root,
            )
            meta.parse()
            distribution._referenced_files.update(
                options._referenced_files, meta._referenced_files
            )
    
        return meta, options
    
    
    def _warn_accidental_env_marker_misconfig(label: str, orig_value: str, parsed: list):
        """Because users sometimes misinterpret this configuration:
    
        [options.extras_require]
        foo = bar;python_version<"4"
    
        It looks like one requirement with an environment marker
        but because there is no newline, it's parsed as two requirements
        with a semicolon as separator.
    
        Therefore, if:
            * input string does not contain a newline AND
            * parsed result contains two requirements AND
            * parsing of the two parts from the result (";")
            leads in a valid Requirement with a valid marker
        a UserWarning is shown to inform the user about the possible problem.
        """
        if "\n" in orig_value or len(parsed) != 2:
            return
    
        markers = marker_env().keys()
    
        try:
            req = Requirement(parsed[1])
            if req.name in markers:
                _AmbiguousMarker.emit(field=label, req=parsed[1])
        except InvalidRequirement as ex:
            if any(parsed[1].startswith(marker) for marker in markers):
                msg = _AmbiguousMarker.message(field=label, req=parsed[1])
                raise InvalidRequirement(msg) from ex
    
    
    class ConfigHandler(Generic[Target]):
        """Handles metadata supplied in configuration files."""
    
        section_prefix: str
        """Prefix for config sections handled by this handler.
        Must be provided by class heirs.
    
        """
    
        aliases: Dict[str, str] = {}
        """Options aliases.
        For compatibility with various packages. E.g.: d2to1 and pbr.
        Note: `-` in keys is replaced with `_` by config parser.
    
        """
    
        def __init__(
            self,
            target_obj: Target,
            options: AllCommandOptions,
            ignore_option_errors,
            ensure_discovered: expand.EnsurePackagesDiscovered,
        ):
            self.ignore_option_errors = ignore_option_errors
            self.target_obj = target_obj
            self.sections = dict(self._section_options(options))
            self.set_options: List[str] = []
            self.ensure_discovered = ensure_discovered
            self._referenced_files: Set[str] = set()
            """After parsing configurations, this property will enumerate
            all files referenced by the "file:" directive. Private API for setuptools only.
            """
    
        @classmethod
        def _section_options(cls, options: AllCommandOptions):
            for full_name, value in options.items():
                pre, sep, name = full_name.partition(cls.section_prefix)
                if pre:
                    continue
                yield name.lstrip('.'), value
    
        @property
        def parsers(self):
            """Metadata item name to parser function mapping."""
            raise NotImplementedError(
                '%s must provide .parsers property' % self.__class__.__name__
            )
    
        def __setitem__(self, option_name, value):
            target_obj = self.target_obj
    
            # Translate alias into real name.
            option_name = self.aliases.get(option_name, option_name)
    
            try:
                current_value = getattr(target_obj, option_name)
            except AttributeError:
                raise KeyError(option_name)
    
            if current_value:
                # Already inhabited. Skipping.
                return
    
            try:
                parsed = self.parsers.get(option_name, lambda x: x)(value)
            except (Exception,) * self.ignore_option_errors:
                return
    
            simple_setter = functools.partial(target_obj.__setattr__, option_name)
            setter = getattr(target_obj, 'set_%s' % option_name, simple_setter)
            setter(parsed)
    
            self.set_options.append(option_name)
    
        @classmethod
        def _parse_list(cls, value, separator=','):
            """Represents value as a list.
    
            Value is split either by separator (defaults to comma) or by lines.
    
            :param value:
            :param separator: List items separator character.
            :rtype: list
            """
            if isinstance(value, list):  # _get_parser_compound case
                return value
    
            if '\n' in value:
                value = value.splitlines()
            else:
                value = value.split(separator)
    
            return [chunk.strip() for chunk in value if chunk.strip()]
    
        @classmethod
        def _parse_dict(cls, value):
            """Represents value as a dict.
    
            :param value:
            :rtype: dict
            """
            separator = '='
            result = {}
            for line in cls._parse_list(value):
                key, sep, val = line.partition(separator)
                if sep != separator:
                    raise OptionError(f"Unable to parse option value to dict: {value}")
                result[key.strip()] = val.strip()
    
            return result
    
        @classmethod
        def _parse_bool(cls, value):
            """Represents value as boolean.
    
            :param value:
            :rtype: bool
            """
            value = value.lower()
            return value in ('1', 'true', 'yes')
    
        @classmethod
        def _exclude_files_parser(cls, key):
            """Returns a parser function to make sure field inputs
            are not files.
    
            Parses a value after getting the key so error messages are
            more informative.
    
            :param key:
            :rtype: callable
            """
    
            def parser(value):
                exclude_directive = 'file:'
                if value.startswith(exclude_directive):
                    raise ValueError(
                        'Only strings are accepted for the {0} field, '
                        'files are not accepted'.format(key)
                    )
                return value
    
            return parser
    
        def _parse_file(self, value, root_dir: _Path):
            """Represents value as a string, allowing including text
            from nearest files using `file:` directive.
    
            Directive is sandboxed and won't reach anything outside
            directory with setup.py.
    
            Examples:
                file: README.rst, CHANGELOG.md, src/file.txt
    
            :param str value:
            :rtype: str
            """
            include_directive = 'file:'
    
            if not isinstance(value, str):
                return value
    
            if not value.startswith(include_directive):
                return value
    
            spec = value[len(include_directive) :]
            filepaths = [path.strip() for path in spec.split(',')]
            self._referenced_files.update(filepaths)
            return expand.read_files(filepaths, root_dir)
    
        def _parse_attr(self, value, package_dir, root_dir: _Path):
            """Represents value as a module attribute.
    
            Examples:
                attr: package.attr
                attr: package.module.attr
    
            :param str value:
            :rtype: str
            """
            attr_directive = 'attr:'
            if not value.startswith(attr_directive):
                return value
    
            attr_desc = value.replace(attr_directive, '')
    
            # Make sure package_dir is populated correctly, so `attr:` directives can work
            package_dir.update(self.ensure_discovered.package_dir)
            return expand.read_attr(attr_desc, package_dir, root_dir)
    
        @classmethod
        def _get_parser_compound(cls, *parse_methods):
            """Returns parser function to represents value as a list.
    
            Parses a value applying given methods one after another.
    
            :param parse_methods:
            :rtype: callable
            """
    
            def parse(value):
                parsed = value
    
                for method in parse_methods:
                    parsed = method(parsed)
    
                return parsed
    
            return parse
    
        @classmethod
        def _parse_section_to_dict_with_key(cls, section_options, values_parser):
            """Parses section options into a dictionary.
    
            Applies a given parser to each option in a section.
    
            :param dict section_options:
            :param callable values_parser: function with 2 args corresponding to key, value
            :rtype: dict
            """
            value = {}
            for key, (_, val) in section_options.items():
                value[key] = values_parser(key, val)
            return value
    
        @classmethod
        def _parse_section_to_dict(cls, section_options, values_parser=None):
            """Parses section options into a dictionary.
    
            Optionally applies a given parser to each value.
    
            :param dict section_options:
            :param callable values_parser: function with 1 arg corresponding to option value
            :rtype: dict
            """
            parser = (lambda _, v: values_parser(v)) if values_parser else (lambda _, v: v)
            return cls._parse_section_to_dict_with_key(section_options, parser)
    
        def parse_section(self, section_options):
            """Parses configuration file section.
    
            :param dict section_options:
            """
            for name, (_, value) in section_options.items():
                with contextlib.suppress(KeyError):
                    # Keep silent for a new option may appear anytime.
                    self[name] = value
    
        def parse(self):
            """Parses configuration file items from one
            or more related sections.
    
            """
            for section_name, section_options in self.sections.items():
                method_postfix = ''
                if section_name:  # [section.option] variant
                    method_postfix = '_%s' % section_name
    
                section_parser_method: Optional[Callable] = getattr(
                    self,
                    # Dots in section names are translated into dunderscores.
                    ('parse_section%s' % method_postfix).replace('.', '__'),
                    None,
                )
    
                if section_parser_method is None:
                    raise OptionError(
                        "Unsupported distribution option section: "
                        f"[{self.section_prefix}.{section_name}]"
                    )
    
                section_parser_method(section_options)
    
        def _deprecated_config_handler(self, func, msg, **kw):
            """this function will wrap around parameters that are deprecated
    
            :param msg: deprecation message
            :param func: function to be wrapped around
            """
    
            @wraps(func)
            def config_handler(*args, **kwargs):
                kw.setdefault("stacklevel", 2)
                _DeprecatedConfig.emit("Deprecated config in `setup.cfg`", msg, **kw)
                return func(*args, **kwargs)
    
            return config_handler
    
    
    class ConfigMetadataHandler(ConfigHandler["DistributionMetadata"]):
        section_prefix = 'metadata'
    
        aliases = {
            'home_page': 'url',
            'summary': 'description',
            'classifier': 'classifiers',
            'platform': 'platforms',
        }
    
        strict_mode = False
        """We need to keep it loose, to be partially compatible with
        `pbr` and `d2to1` packages which also uses `metadata` section.
    
        """
    
        def __init__(
            self,
            target_obj: "DistributionMetadata",
            options: AllCommandOptions,
            ignore_option_errors: bool,
            ensure_discovered: expand.EnsurePackagesDiscovered,
            package_dir: Optional[dict] = None,
            root_dir: _Path = os.curdir,
        ):
            super().__init__(target_obj, options, ignore_option_errors, ensure_discovered)
            self.package_dir = package_dir
            self.root_dir = root_dir
    
        @property
        def parsers(self):
            """Metadata item name to parser function mapping."""
            parse_list = self._parse_list
            parse_file = partial(self._parse_file, root_dir=self.root_dir)
            parse_dict = self._parse_dict
            exclude_files_parser = self._exclude_files_parser
    
            return {
                'platforms': parse_list,
                'keywords': parse_list,
                'provides': parse_list,
                'obsoletes': parse_list,
                'classifiers': self._get_parser_compound(parse_file, parse_list),
                'license': exclude_files_parser('license'),
                'license_files': parse_list,
                'description': parse_file,
                'long_description': parse_file,
                'version': self._parse_version,
                'project_urls': parse_dict,
            }
    
        def _parse_version(self, value):
            """Parses `version` option value.
    
            :param value:
            :rtype: str
    
            """
            version = self._parse_file(value, self.root_dir)
    
            if version != value:
                version = version.strip()
                # Be strict about versions loaded from file because it's easy to
                # accidentally include newlines and other unintended content
                try:
                    Version(version)
                except InvalidVersion:
                    raise OptionError(
                        f'Version loaded from {value} does not '
                        f'comply with PEP 440: {version}'
                    )
    
                return version
    
            return expand.version(self._parse_attr(value, self.package_dir, self.root_dir))
    
    
    class ConfigOptionsHandler(ConfigHandler["Distribution"]):
        section_prefix = 'options'
    
        def __init__(
            self,
            target_obj: "Distribution",
            options: AllCommandOptions,
            ignore_option_errors: bool,
            ensure_discovered: expand.EnsurePackagesDiscovered,
        ):
            super().__init__(target_obj, options, ignore_option_errors, ensure_discovered)
            self.root_dir = target_obj.src_root
            self.package_dir: Dict[str, str] = {}  # To be filled by `find_packages`
    
        @classmethod
        def _parse_list_semicolon(cls, value):
            return cls._parse_list(value, separator=';')
    
        def _parse_file_in_root(self, value):
            return self._parse_file(value, root_dir=self.root_dir)
    
        def _parse_requirements_list(self, label: str, value: str):
            # Parse a requirements list, either by reading in a `file:`, or a list.
            parsed = self._parse_list_semicolon(self._parse_file_in_root(value))
            _warn_accidental_env_marker_misconfig(label, value, parsed)
            # Filter it to only include lines that are not comments. `parse_list`
            # will have stripped each line and filtered out empties.
            return [line for line in parsed if not line.startswith("#")]
    
        @property
        def parsers(self):
            """Metadata item name to parser function mapping."""
            parse_list = self._parse_list
            parse_bool = self._parse_bool
            parse_dict = self._parse_dict
            parse_cmdclass = self._parse_cmdclass
    
            return {
                'zip_safe': parse_bool,
                'include_package_data': parse_bool,
                'package_dir': parse_dict,
                'scripts': parse_list,
                'eager_resources': parse_list,
                'dependency_links': parse_list,
                'namespace_packages': self._deprecated_config_handler(
                    parse_list,
                    "The namespace_packages parameter is deprecated, "
                    "consider using implicit namespaces instead (PEP 420).",
                    # TODO: define due date, see setuptools.dist:check_nsp.
                ),
                'install_requires': partial(
                    self._parse_requirements_list, "install_requires"
                ),
                'setup_requires': self._parse_list_semicolon,
                'tests_require': self._parse_list_semicolon,
                'packages': self._parse_packages,
                'entry_points': self._parse_file_in_root,
                'py_modules': parse_list,
                'python_requires': SpecifierSet,
                'cmdclass': parse_cmdclass,
            }
    
        def _parse_cmdclass(self, value):
            package_dir = self.ensure_discovered.package_dir
            return expand.cmdclass(self._parse_dict(value), package_dir, self.root_dir)
    
        def _parse_packages(self, value):
            """Parses `packages` option value.
    
            :param value:
            :rtype: list
            """
            find_directives = ['find:', 'find_namespace:']
            trimmed_value = value.strip()
    
            if trimmed_value not in find_directives:
                return self._parse_list(value)
    
            # Read function arguments from a dedicated section.
            find_kwargs = self.parse_section_packages__find(
                self.sections.get('packages.find', {})
            )
    
            find_kwargs.update(
                namespaces=(trimmed_value == find_directives[1]),
                root_dir=self.root_dir,
                fill_package_dir=self.package_dir,
            )
    
            return expand.find_packages(**find_kwargs)
    
        def parse_section_packages__find(self, section_options):
            """Parses `packages.find` configuration file section.
    
            To be used in conjunction with _parse_packages().
    
            :param dict section_options:
            """
            section_data = self._parse_section_to_dict(section_options, self._parse_list)
    
            valid_keys = ['where', 'include', 'exclude']
    
            find_kwargs = dict(
                [(k, v) for k, v in section_data.items() if k in valid_keys and v]
            )
    
            where = find_kwargs.get('where')
            if where is not None:
                find_kwargs['where'] = where[0]  # cast list to single val
    
            return find_kwargs
    
        def parse_section_entry_points(self, section_options):
            """Parses `entry_points` configuration file section.
    
            :param dict section_options:
            """
            parsed = self._parse_section_to_dict(section_options, self._parse_list)
            self['entry_points'] = parsed
    
        def _parse_package_data(self, section_options):
            package_data = self._parse_section_to_dict(section_options, self._parse_list)
            return expand.canonic_package_data(package_data)
    
        def parse_section_package_data(self, section_options):
            """Parses `package_data` configuration file section.
    
            :param dict section_options:
            """
            self['package_data'] = self._parse_package_data(section_options)
    
        def parse_section_exclude_package_data(self, section_options):
            """Parses `exclude_package_data` configuration file section.
    
            :param dict section_options:
            """
            self['exclude_package_data'] = self._parse_package_data(section_options)
    
        def parse_section_extras_require(self, section_options):
            """Parses `extras_require` configuration file section.
    
            :param dict section_options:
            """
            parsed = self._parse_section_to_dict_with_key(
                section_options,
                lambda k, v: self._parse_requirements_list(f"extras_require[{k}]", v),
            )
    
            self['extras_require'] = parsed
    
        def parse_section_data_files(self, section_options):
            """Parses `data_files` configuration file section.
    
            :param dict section_options:
            """
            parsed = self._parse_section_to_dict(section_options, self._parse_list)
            self['data_files'] = expand.canonic_data_files(parsed, self.root_dir)
    
    
    class _AmbiguousMarker(SetuptoolsDeprecationWarning):
        _SUMMARY = "Ambiguous requirement marker."
        _DETAILS = """
        One of the parsed requirements in `{field}` looks like a valid environment marker:
    
            {req!r}
    
        Please make sure that the configuration file is correct.
        You can use dangling lines to avoid this problem.
        """
        _SEE_DOCS = "userguide/declarative_config.html#opt-2"
        # TODO: should we include due_date here? Initially introduced in 6 Aug 2022.
        # Does this make sense with latest version of packaging?
    
        @classmethod
        def message(cls, **kw):
            docs = f"https://setuptools.pypa.io/en/latest/{cls._SEE_DOCS}"
            return cls._format(cls._SUMMARY, cls._DETAILS, see_url=docs, format_args=kw)
    
    
    class _DeprecatedConfig(SetuptoolsDeprecationWarning):
        _SEE_DOCS = "userguide/declarative_config.html"
    PK!P99_apply_pyprojecttoml.pynu["""Translation layer between pyproject config and setuptools distribution and
    metadata objects.
    
    The distribution and metadata objects are modeled after (an old version of)
    core metadata, therefore configs in the format specified for ``pyproject.toml``
    need to be processed before being applied.
    
    **PRIVATE MODULE**: API reserved for setuptools internal usage only.
    """
    import logging
    import os
    from collections.abc import Mapping
    from email.headerregistry import Address
    from functools import partial, reduce
    from inspect import cleandoc
    from itertools import chain
    from types import MappingProxyType
    from typing import (
        TYPE_CHECKING,
        Any,
        Callable,
        Dict,
        List,
        Optional,
        Set,
        Tuple,
        Type,
        Union,
        cast,
    )
    
    from ..errors import RemovedConfigError
    from ..warnings import SetuptoolsWarning
    
    if TYPE_CHECKING:
        from setuptools._importlib import metadata  # noqa
        from setuptools.dist import Distribution  # noqa
    
    EMPTY: Mapping = MappingProxyType({})  # Immutable dict-like
    _Path = Union[os.PathLike, str]
    _DictOrStr = Union[dict, str]
    _CorrespFn = Callable[["Distribution", Any, _Path], None]
    _Correspondence = Union[str, _CorrespFn]
    
    _logger = logging.getLogger(__name__)
    
    
    def apply(dist: "Distribution", config: dict, filename: _Path) -> "Distribution":
        """Apply configuration dict read with :func:`read_configuration`"""
    
        if not config:
            return dist  # short-circuit unrelated pyproject.toml file
    
        root_dir = os.path.dirname(filename) or "."
    
        _apply_project_table(dist, config, root_dir)
        _apply_tool_table(dist, config, filename)
    
        current_directory = os.getcwd()
        os.chdir(root_dir)
        try:
            dist._finalize_requires()
            dist._finalize_license_files()
        finally:
            os.chdir(current_directory)
    
        return dist
    
    
    def _apply_project_table(dist: "Distribution", config: dict, root_dir: _Path):
        project_table = config.get("project", {}).copy()
        if not project_table:
            return  # short-circuit
    
        _handle_missing_dynamic(dist, project_table)
        _unify_entry_points(project_table)
    
        for field, value in project_table.items():
            norm_key = json_compatible_key(field)
            corresp = PYPROJECT_CORRESPONDENCE.get(norm_key, norm_key)
            if callable(corresp):
                corresp(dist, value, root_dir)
            else:
                _set_config(dist, corresp, value)
    
    
    def _apply_tool_table(dist: "Distribution", config: dict, filename: _Path):
        tool_table = config.get("tool", {}).get("setuptools", {})
        if not tool_table:
            return  # short-circuit
    
        for field, value in tool_table.items():
            norm_key = json_compatible_key(field)
    
            if norm_key in TOOL_TABLE_REMOVALS:
                suggestion = cleandoc(TOOL_TABLE_REMOVALS[norm_key])
                msg = f"""
                The parameter `tool.setuptools.{field}` was long deprecated
                and has been removed from `pyproject.toml`.
                """
                raise RemovedConfigError("\n".join([cleandoc(msg), suggestion]))
    
            norm_key = TOOL_TABLE_RENAMES.get(norm_key, norm_key)
            _set_config(dist, norm_key, value)
    
        _copy_command_options(config, dist, filename)
    
    
    def _handle_missing_dynamic(dist: "Distribution", project_table: dict):
        """Be temporarily forgiving with ``dynamic`` fields not listed in ``dynamic``"""
        dynamic = set(project_table.get("dynamic", []))
        for field, getter in _PREVIOUSLY_DEFINED.items():
            if not (field in project_table or field in dynamic):
                value = getter(dist)
                if value:
                    _MissingDynamic.emit(field=field, value=value)
                    project_table[field] = _RESET_PREVIOUSLY_DEFINED.get(field)
    
    
    def json_compatible_key(key: str) -> str:
        """As defined in :pep:`566#json-compatible-metadata`"""
        return key.lower().replace("-", "_")
    
    
    def _set_config(dist: "Distribution", field: str, value: Any):
        setter = getattr(dist.metadata, f"set_{field}", None)
        if setter:
            setter(value)
        elif hasattr(dist.metadata, field) or field in SETUPTOOLS_PATCHES:
            setattr(dist.metadata, field, value)
        else:
            setattr(dist, field, value)
    
    
    _CONTENT_TYPES = {
        ".md": "text/markdown",
        ".rst": "text/x-rst",
        ".txt": "text/plain",
    }
    
    
    def _guess_content_type(file: str) -> Optional[str]:
        _, ext = os.path.splitext(file.lower())
        if not ext:
            return None
    
        if ext in _CONTENT_TYPES:
            return _CONTENT_TYPES[ext]
    
        valid = ", ".join(f"{k} ({v})" for k, v in _CONTENT_TYPES.items())
        msg = f"only the following file extensions are recognized: {valid}."
        raise ValueError(f"Undefined content type for {file}, {msg}")
    
    
    def _long_description(dist: "Distribution", val: _DictOrStr, root_dir: _Path):
        from setuptools.config import expand
    
        if isinstance(val, str):
            file: Union[str, list] = val
            text = expand.read_files(file, root_dir)
            ctype = _guess_content_type(val)
        else:
            file = val.get("file") or []
            text = val.get("text") or expand.read_files(file, root_dir)
            ctype = val["content-type"]
    
        _set_config(dist, "long_description", text)
    
        if ctype:
            _set_config(dist, "long_description_content_type", ctype)
    
        if file:
            dist._referenced_files.add(cast(str, file))
    
    
    def _license(dist: "Distribution", val: dict, root_dir: _Path):
        from setuptools.config import expand
    
        if "file" in val:
            _set_config(dist, "license", expand.read_files([val["file"]], root_dir))
            dist._referenced_files.add(val["file"])
        else:
            _set_config(dist, "license", val["text"])
    
    
    def _people(dist: "Distribution", val: List[dict], _root_dir: _Path, kind: str):
        field = []
        email_field = []
        for person in val:
            if "name" not in person:
                email_field.append(person["email"])
            elif "email" not in person:
                field.append(person["name"])
            else:
                addr = Address(display_name=person["name"], addr_spec=person["email"])
                email_field.append(str(addr))
    
        if field:
            _set_config(dist, kind, ", ".join(field))
        if email_field:
            _set_config(dist, f"{kind}_email", ", ".join(email_field))
    
    
    def _project_urls(dist: "Distribution", val: dict, _root_dir):
        _set_config(dist, "project_urls", val)
    
    
    def _python_requires(dist: "Distribution", val: dict, _root_dir):
        from setuptools.extern.packaging.specifiers import SpecifierSet
    
        _set_config(dist, "python_requires", SpecifierSet(val))
    
    
    def _dependencies(dist: "Distribution", val: list, _root_dir):
        if getattr(dist, "install_requires", []):
            msg = "`install_requires` overwritten in `pyproject.toml` (dependencies)"
            SetuptoolsWarning.emit(msg)
        dist.install_requires = val
    
    
    def _optional_dependencies(dist: "Distribution", val: dict, _root_dir):
        existing = getattr(dist, "extras_require", None) or {}
        dist.extras_require = {**existing, **val}
    
    
    def _unify_entry_points(project_table: dict):
        project = project_table
        entry_points = project.pop("entry-points", project.pop("entry_points", {}))
        renaming = {"scripts": "console_scripts", "gui_scripts": "gui_scripts"}
        for key, value in list(project.items()):  # eager to allow modifications
            norm_key = json_compatible_key(key)
            if norm_key in renaming:
                # Don't skip even if value is empty (reason: reset missing `dynamic`)
                entry_points[renaming[norm_key]] = project.pop(key)
    
        if entry_points:
            project["entry-points"] = {
                name: [f"{k} = {v}" for k, v in group.items()]
                for name, group in entry_points.items()
                if group  # now we can skip empty groups
            }
            # Sometimes this will set `project["entry-points"] = {}`, and that is
            # intentional (for reseting configurations that are missing `dynamic`).
    
    
    def _copy_command_options(pyproject: dict, dist: "Distribution", filename: _Path):
        tool_table = pyproject.get("tool", {})
        cmdclass = tool_table.get("setuptools", {}).get("cmdclass", {})
        valid_options = _valid_command_options(cmdclass)
    
        cmd_opts = dist.command_options
        for cmd, config in pyproject.get("tool", {}).get("distutils", {}).items():
            cmd = json_compatible_key(cmd)
            valid = valid_options.get(cmd, set())
            cmd_opts.setdefault(cmd, {})
            for key, value in config.items():
                key = json_compatible_key(key)
                cmd_opts[cmd][key] = (str(filename), value)
                if key not in valid:
                    # To avoid removing options that are specified dynamically we
                    # just log a warn...
                    _logger.warning(f"Command option {cmd}.{key} is not defined")
    
    
    def _valid_command_options(cmdclass: Mapping = EMPTY) -> Dict[str, Set[str]]:
        from .._importlib import metadata
        from setuptools.dist import Distribution
    
        valid_options = {"global": _normalise_cmd_options(Distribution.global_options)}
    
        unloaded_entry_points = metadata.entry_points(group='distutils.commands')
        loaded_entry_points = (_load_ep(ep) for ep in unloaded_entry_points)
        entry_points = (ep for ep in loaded_entry_points if ep)
        for cmd, cmd_class in chain(entry_points, cmdclass.items()):
            opts = valid_options.get(cmd, set())
            opts = opts | _normalise_cmd_options(getattr(cmd_class, "user_options", []))
            valid_options[cmd] = opts
    
        return valid_options
    
    
    def _load_ep(ep: "metadata.EntryPoint") -> Optional[Tuple[str, Type]]:
        # Ignore all the errors
        try:
            return (ep.name, ep.load())
        except Exception as ex:
            msg = f"{ex.__class__.__name__} while trying to load entry-point {ep.name}"
            _logger.warning(f"{msg}: {ex}")
            return None
    
    
    def _normalise_cmd_option_key(name: str) -> str:
        return json_compatible_key(name).strip("_=")
    
    
    def _normalise_cmd_options(desc: List[Tuple[str, Optional[str], str]]) -> Set[str]:
        return {_normalise_cmd_option_key(fancy_option[0]) for fancy_option in desc}
    
    
    def _get_previous_entrypoints(dist: "Distribution") -> Dict[str, list]:
        ignore = ("console_scripts", "gui_scripts")
        value = getattr(dist, "entry_points", None) or {}
        return {k: v for k, v in value.items() if k not in ignore}
    
    
    def _get_previous_scripts(dist: "Distribution") -> Optional[list]:
        value = getattr(dist, "entry_points", None) or {}
        return value.get("console_scripts")
    
    
    def _get_previous_gui_scripts(dist: "Distribution") -> Optional[list]:
        value = getattr(dist, "entry_points", None) or {}
        return value.get("gui_scripts")
    
    
    def _attrgetter(attr):
        """
        Similar to ``operator.attrgetter`` but returns None if ``attr`` is not found
        >>> from types import SimpleNamespace
        >>> obj = SimpleNamespace(a=42, b=SimpleNamespace(c=13))
        >>> _attrgetter("a")(obj)
        42
        >>> _attrgetter("b.c")(obj)
        13
        >>> _attrgetter("d")(obj) is None
        True
        """
        return partial(reduce, lambda acc, x: getattr(acc, x, None), attr.split("."))
    
    
    def _some_attrgetter(*items):
        """
        Return the first "truth-y" attribute or None
        >>> from types import SimpleNamespace
        >>> obj = SimpleNamespace(a=42, b=SimpleNamespace(c=13))
        >>> _some_attrgetter("d", "a", "b.c")(obj)
        42
        >>> _some_attrgetter("d", "e", "b.c", "a")(obj)
        13
        >>> _some_attrgetter("d", "e", "f")(obj) is None
        True
        """
    
        def _acessor(obj):
            values = (_attrgetter(i)(obj) for i in items)
            return next((i for i in values if i is not None), None)
    
        return _acessor
    
    
    PYPROJECT_CORRESPONDENCE: Dict[str, _Correspondence] = {
        "readme": _long_description,
        "license": _license,
        "authors": partial(_people, kind="author"),
        "maintainers": partial(_people, kind="maintainer"),
        "urls": _project_urls,
        "dependencies": _dependencies,
        "optional_dependencies": _optional_dependencies,
        "requires_python": _python_requires,
    }
    
    TOOL_TABLE_RENAMES = {"script_files": "scripts"}
    TOOL_TABLE_REMOVALS = {
        "namespace_packages": """
            Please migrate to implicit native namespaces instead.
            See https://packaging.python.org/en/latest/guides/packaging-namespace-packages/.
            """,
    }
    
    SETUPTOOLS_PATCHES = {
        "long_description_content_type",
        "project_urls",
        "provides_extras",
        "license_file",
        "license_files",
    }
    
    _PREVIOUSLY_DEFINED = {
        "name": _attrgetter("metadata.name"),
        "version": _attrgetter("metadata.version"),
        "description": _attrgetter("metadata.description"),
        "readme": _attrgetter("metadata.long_description"),
        "requires-python": _some_attrgetter("python_requires", "metadata.python_requires"),
        "license": _attrgetter("metadata.license"),
        "authors": _some_attrgetter("metadata.author", "metadata.author_email"),
        "maintainers": _some_attrgetter("metadata.maintainer", "metadata.maintainer_email"),
        "keywords": _attrgetter("metadata.keywords"),
        "classifiers": _attrgetter("metadata.classifiers"),
        "urls": _attrgetter("metadata.project_urls"),
        "entry-points": _get_previous_entrypoints,
        "scripts": _get_previous_scripts,
        "gui-scripts": _get_previous_gui_scripts,
        "dependencies": _attrgetter("install_requires"),
        "optional-dependencies": _attrgetter("extras_require"),
    }
    
    
    _RESET_PREVIOUSLY_DEFINED: dict = {
        # Fix improper setting: given in `setup.py`, but not listed in `dynamic`
        # dict: pyproject name => value to which reset
        "license": {},
        "authors": [],
        "maintainers": [],
        "keywords": [],
        "classifiers": [],
        "urls": {},
        "entry-points": {},
        "scripts": {},
        "gui-scripts": {},
        "dependencies": [],
        "optional-dependencies": [],
    }
    
    
    class _MissingDynamic(SetuptoolsWarning):
        _SUMMARY = "`{field}` defined outside of `pyproject.toml` is ignored."
    
        _DETAILS = """
        The following seems to be defined outside of `pyproject.toml`:
    
        `{field} = {value!r}`
    
        According to the spec (see the link below), however, setuptools CANNOT
        consider this value unless `{field}` is listed as `dynamic`.
    
        https://packaging.python.org/en/latest/specifications/declaring-project-metadata/
    
        To prevent this problem, you can list `{field}` under `dynamic` or alternatively
        remove the `[project]` table from your file and rely entirely on other means of
        configuration.
        """
        # TODO: Consider removing this check in the future?
        #       There is a trade-off here between improving "debug-ability" and the cost
        #       of running/testing/maintaining these unnecessary checks...
    
        @classmethod
        def details(cls, field: str, value: Any) -> str:
            return cls._DETAILS.format(field=field, value=value)
    PK!`=CCpyprojecttoml.pynu["""
    Load setuptools configuration from ``pyproject.toml`` files.
    
    **PRIVATE MODULE**: API reserved for setuptools internal usage only.
    
    To read project metadata, consider using
    ``build.util.project_wheel_metadata`` (https://pypi.org/project/build/).
    For simple scenarios, you can also try parsing the file directly
    with the help of ``tomllib`` or ``tomli``.
    """
    import logging
    import os
    from contextlib import contextmanager
    from functools import partial
    from typing import TYPE_CHECKING, Callable, Dict, Mapping, Optional, Set, Union
    
    from ..errors import FileError, InvalidConfigError
    from ..warnings import SetuptoolsWarning
    from . import expand as _expand
    from ._apply_pyprojecttoml import _PREVIOUSLY_DEFINED, _MissingDynamic
    from ._apply_pyprojecttoml import apply as _apply
    
    if TYPE_CHECKING:
        from setuptools.dist import Distribution  # noqa
    
    _Path = Union[str, os.PathLike]
    _logger = logging.getLogger(__name__)
    
    
    def load_file(filepath: _Path) -> dict:
        from setuptools.extern import tomli  # type: ignore
    
        with open(filepath, "rb") as file:
            return tomli.load(file)
    
    
    def validate(config: dict, filepath: _Path) -> bool:
        from . import _validate_pyproject as validator
    
        trove_classifier = validator.FORMAT_FUNCTIONS.get("trove-classifier")
        if hasattr(trove_classifier, "_disable_download"):
            # Improve reproducibility by default. See issue 31 for validate-pyproject.
            trove_classifier._disable_download()  # type: ignore
    
        try:
            return validator.validate(config)
        except validator.ValidationError as ex:
            summary = f"configuration error: {ex.summary}"
            if ex.name.strip("`") != "project":
                # Probably it is just a field missing/misnamed, not worthy the verbosity...
                _logger.debug(summary)
                _logger.debug(ex.details)
    
            error = f"invalid pyproject.toml config: {ex.name}."
            raise ValueError(f"{error}\n{summary}") from None
    
    
    def apply_configuration(
        dist: "Distribution",
        filepath: _Path,
        ignore_option_errors=False,
    ) -> "Distribution":
        """Apply the configuration from a ``pyproject.toml`` file into an existing
        distribution object.
        """
        config = read_configuration(filepath, True, ignore_option_errors, dist)
        return _apply(dist, config, filepath)
    
    
    def read_configuration(
        filepath: _Path,
        expand=True,
        ignore_option_errors=False,
        dist: Optional["Distribution"] = None,
    ):
        """Read given configuration file and returns options from it as a dict.
    
        :param str|unicode filepath: Path to configuration file in the ``pyproject.toml``
            format.
    
        :param bool expand: Whether to expand directives and other computed values
            (i.e. post-process the given configuration)
    
        :param bool ignore_option_errors: Whether to silently ignore
            options, values of which could not be resolved (e.g. due to exceptions
            in directives such as file:, attr:, etc.).
            If False exceptions are propagated as expected.
    
        :param Distribution|None: Distribution object to which the configuration refers.
            If not given a dummy object will be created and discarded after the
            configuration is read. This is used for auto-discovery of packages and in the
            case a dynamic configuration (e.g. ``attr`` or ``cmdclass``) is expanded.
            When ``expand=False`` this object is simply ignored.
    
        :rtype: dict
        """
        filepath = os.path.abspath(filepath)
    
        if not os.path.isfile(filepath):
            raise FileError(f"Configuration file {filepath!r} does not exist.")
    
        asdict = load_file(filepath) or {}
        project_table = asdict.get("project", {})
        tool_table = asdict.get("tool", {})
        setuptools_table = tool_table.get("setuptools", {})
        if not asdict or not (project_table or setuptools_table):
            return {}  # User is not using pyproject to configure setuptools
    
        if "distutils" in tool_table:
            _ExperimentalConfiguration.emit(subject="[tool.distutils]")
    
        # There is an overall sense in the community that making include_package_data=True
        # the default would be an improvement.
        # `ini2toml` backfills include_package_data=False when nothing is explicitly given,
        # therefore setting a default here is backwards compatible.
        if dist and getattr(dist, "include_package_data", None) is not None:
            setuptools_table.setdefault("include-package-data", dist.include_package_data)
        else:
            setuptools_table.setdefault("include-package-data", True)
        # Persist changes:
        asdict["tool"] = tool_table
        tool_table["setuptools"] = setuptools_table
    
        with _ignore_errors(ignore_option_errors):
            # Don't complain about unrelated errors (e.g. tools not using the "tool" table)
            subset = {"project": project_table, "tool": {"setuptools": setuptools_table}}
            validate(subset, filepath)
    
        if expand:
            root_dir = os.path.dirname(filepath)
            return expand_configuration(asdict, root_dir, ignore_option_errors, dist)
    
        return asdict
    
    
    def expand_configuration(
        config: dict,
        root_dir: Optional[_Path] = None,
        ignore_option_errors: bool = False,
        dist: Optional["Distribution"] = None,
    ) -> dict:
        """Given a configuration with unresolved fields (e.g. dynamic, cmdclass, ...)
        find their final values.
    
        :param dict config: Dict containing the configuration for the distribution
        :param str root_dir: Top-level directory for the distribution/project
            (the same directory where ``pyproject.toml`` is place)
        :param bool ignore_option_errors: see :func:`read_configuration`
        :param Distribution|None: Distribution object to which the configuration refers.
            If not given a dummy object will be created and discarded after the
            configuration is read. Used in the case a dynamic configuration
            (e.g. ``attr`` or ``cmdclass``).
    
        :rtype: dict
        """
        return _ConfigExpander(config, root_dir, ignore_option_errors, dist).expand()
    
    
    class _ConfigExpander:
        def __init__(
            self,
            config: dict,
            root_dir: Optional[_Path] = None,
            ignore_option_errors: bool = False,
            dist: Optional["Distribution"] = None,
        ):
            self.config = config
            self.root_dir = root_dir or os.getcwd()
            self.project_cfg = config.get("project", {})
            self.dynamic = self.project_cfg.get("dynamic", [])
            self.setuptools_cfg = config.get("tool", {}).get("setuptools", {})
            self.dynamic_cfg = self.setuptools_cfg.get("dynamic", {})
            self.ignore_option_errors = ignore_option_errors
            self._dist = dist
            self._referenced_files: Set[str] = set()
    
        def _ensure_dist(self) -> "Distribution":
            from setuptools.dist import Distribution
    
            attrs = {"src_root": self.root_dir, "name": self.project_cfg.get("name", None)}
            return self._dist or Distribution(attrs)
    
        def _process_field(self, container: dict, field: str, fn: Callable):
            if field in container:
                with _ignore_errors(self.ignore_option_errors):
                    container[field] = fn(container[field])
    
        def _canonic_package_data(self, field="package-data"):
            package_data = self.setuptools_cfg.get(field, {})
            return _expand.canonic_package_data(package_data)
    
        def expand(self):
            self._expand_packages()
            self._canonic_package_data()
            self._canonic_package_data("exclude-package-data")
    
            # A distribution object is required for discovering the correct package_dir
            dist = self._ensure_dist()
            ctx = _EnsurePackagesDiscovered(dist, self.project_cfg, self.setuptools_cfg)
            with ctx as ensure_discovered:
                package_dir = ensure_discovered.package_dir
                self._expand_data_files()
                self._expand_cmdclass(package_dir)
                self._expand_all_dynamic(dist, package_dir)
    
            dist._referenced_files.update(self._referenced_files)
            return self.config
    
        def _expand_packages(self):
            packages = self.setuptools_cfg.get("packages")
            if packages is None or isinstance(packages, (list, tuple)):
                return
    
            find = packages.get("find")
            if isinstance(find, dict):
                find["root_dir"] = self.root_dir
                find["fill_package_dir"] = self.setuptools_cfg.setdefault("package-dir", {})
                with _ignore_errors(self.ignore_option_errors):
                    self.setuptools_cfg["packages"] = _expand.find_packages(**find)
    
        def _expand_data_files(self):
            data_files = partial(_expand.canonic_data_files, root_dir=self.root_dir)
            self._process_field(self.setuptools_cfg, "data-files", data_files)
    
        def _expand_cmdclass(self, package_dir: Mapping[str, str]):
            root_dir = self.root_dir
            cmdclass = partial(_expand.cmdclass, package_dir=package_dir, root_dir=root_dir)
            self._process_field(self.setuptools_cfg, "cmdclass", cmdclass)
    
        def _expand_all_dynamic(self, dist: "Distribution", package_dir: Mapping[str, str]):
            special = (  # need special handling
                "version",
                "readme",
                "entry-points",
                "scripts",
                "gui-scripts",
                "classifiers",
                "dependencies",
                "optional-dependencies",
            )
            # `_obtain` functions are assumed to raise appropriate exceptions/warnings.
            obtained_dynamic = {
                field: self._obtain(dist, field, package_dir)
                for field in self.dynamic
                if field not in special
            }
            obtained_dynamic.update(
                self._obtain_entry_points(dist, package_dir) or {},
                version=self._obtain_version(dist, package_dir),
                readme=self._obtain_readme(dist),
                classifiers=self._obtain_classifiers(dist),
                dependencies=self._obtain_dependencies(dist),
                optional_dependencies=self._obtain_optional_dependencies(dist),
            )
            # `None` indicates there is nothing in `tool.setuptools.dynamic` but the value
            # might have already been set by setup.py/extensions, so avoid overwriting.
            updates = {k: v for k, v in obtained_dynamic.items() if v is not None}
            self.project_cfg.update(updates)
    
        def _ensure_previously_set(self, dist: "Distribution", field: str):
            previous = _PREVIOUSLY_DEFINED[field](dist)
            if previous is None and not self.ignore_option_errors:
                msg = (
                    f"No configuration found for dynamic {field!r}.\n"
                    "Some dynamic fields need to be specified via `tool.setuptools.dynamic`"
                    "\nothers must be specified via the equivalent attribute in `setup.py`."
                )
                raise InvalidConfigError(msg)
    
        def _expand_directive(
            self, specifier: str, directive, package_dir: Mapping[str, str]
        ):
            from setuptools.extern.more_itertools import always_iterable  # type: ignore
    
            with _ignore_errors(self.ignore_option_errors):
                root_dir = self.root_dir
                if "file" in directive:
                    self._referenced_files.update(always_iterable(directive["file"]))
                    return _expand.read_files(directive["file"], root_dir)
                if "attr" in directive:
                    return _expand.read_attr(directive["attr"], package_dir, root_dir)
                raise ValueError(f"invalid `{specifier}`: {directive!r}")
            return None
    
        def _obtain(self, dist: "Distribution", field: str, package_dir: Mapping[str, str]):
            if field in self.dynamic_cfg:
                return self._expand_directive(
                    f"tool.setuptools.dynamic.{field}",
                    self.dynamic_cfg[field],
                    package_dir,
                )
            self._ensure_previously_set(dist, field)
            return None
    
        def _obtain_version(self, dist: "Distribution", package_dir: Mapping[str, str]):
            # Since plugins can set version, let's silently skip if it cannot be obtained
            if "version" in self.dynamic and "version" in self.dynamic_cfg:
                return _expand.version(self._obtain(dist, "version", package_dir))
            return None
    
        def _obtain_readme(self, dist: "Distribution") -> Optional[Dict[str, str]]:
            if "readme" not in self.dynamic:
                return None
    
            dynamic_cfg = self.dynamic_cfg
            if "readme" in dynamic_cfg:
                return {
                    "text": self._obtain(dist, "readme", {}),
                    "content-type": dynamic_cfg["readme"].get("content-type", "text/x-rst"),
                }
    
            self._ensure_previously_set(dist, "readme")
            return None
    
        def _obtain_entry_points(
            self, dist: "Distribution", package_dir: Mapping[str, str]
        ) -> Optional[Dict[str, dict]]:
            fields = ("entry-points", "scripts", "gui-scripts")
            if not any(field in self.dynamic for field in fields):
                return None
    
            text = self._obtain(dist, "entry-points", package_dir)
            if text is None:
                return None
    
            groups = _expand.entry_points(text)
            expanded = {"entry-points": groups}
    
            def _set_scripts(field: str, group: str):
                if group in groups:
                    value = groups.pop(group)
                    if field not in self.dynamic:
                        raise InvalidConfigError(_MissingDynamic.details(field, value))
                    expanded[field] = value
    
            _set_scripts("scripts", "console_scripts")
            _set_scripts("gui-scripts", "gui_scripts")
    
            return expanded
    
        def _obtain_classifiers(self, dist: "Distribution"):
            if "classifiers" in self.dynamic:
                value = self._obtain(dist, "classifiers", {})
                if value:
                    return value.splitlines()
            return None
    
        def _obtain_dependencies(self, dist: "Distribution"):
            if "dependencies" in self.dynamic:
                value = self._obtain(dist, "dependencies", {})
                if value:
                    return _parse_requirements_list(value)
            return None
    
        def _obtain_optional_dependencies(self, dist: "Distribution"):
            if "optional-dependencies" not in self.dynamic:
                return None
            if "optional-dependencies" in self.dynamic_cfg:
                optional_dependencies_map = self.dynamic_cfg["optional-dependencies"]
                assert isinstance(optional_dependencies_map, dict)
                return {
                    group: _parse_requirements_list(
                        self._expand_directive(
                            f"tool.setuptools.dynamic.optional-dependencies.{group}",
                            directive,
                            {},
                        )
                    )
                    for group, directive in optional_dependencies_map.items()
                }
            self._ensure_previously_set(dist, "optional-dependencies")
            return None
    
    
    def _parse_requirements_list(value):
        return [
            line
            for line in value.splitlines()
            if line.strip() and not line.strip().startswith("#")
        ]
    
    
    @contextmanager
    def _ignore_errors(ignore_option_errors: bool):
        if not ignore_option_errors:
            yield
            return
    
        try:
            yield
        except Exception as ex:
            _logger.debug(f"ignored error: {ex.__class__.__name__} - {ex}")
    
    
    class _EnsurePackagesDiscovered(_expand.EnsurePackagesDiscovered):
        def __init__(
            self, distribution: "Distribution", project_cfg: dict, setuptools_cfg: dict
        ):
            super().__init__(distribution)
            self._project_cfg = project_cfg
            self._setuptools_cfg = setuptools_cfg
    
        def __enter__(self):
            """When entering the context, the values of ``packages``, ``py_modules`` and
            ``package_dir`` that are missing in ``dist`` are copied from ``setuptools_cfg``.
            """
            dist, cfg = self._dist, self._setuptools_cfg
            package_dir: Dict[str, str] = cfg.setdefault("package-dir", {})
            package_dir.update(dist.package_dir or {})
            dist.package_dir = package_dir  # needs to be the same object
    
            dist.set_defaults._ignore_ext_modules()  # pyproject.toml-specific behaviour
    
            # Set `name`, `py_modules` and `packages` in dist to short-circuit
            # auto-discovery, but avoid overwriting empty lists purposefully set by users.
            if dist.metadata.name is None:
                dist.metadata.name = self._project_cfg.get("name")
            if dist.py_modules is None:
                dist.py_modules = cfg.get("py-modules")
            if dist.packages is None:
                dist.packages = cfg.get("packages")
    
            return super().__enter__()
    
        def __exit__(self, exc_type, exc_value, traceback):
            """When exiting the context, if values of ``packages``, ``py_modules`` and
            ``package_dir`` are missing in ``setuptools_cfg``, copy from ``dist``.
            """
            # If anything was discovered set them back, so they count in the final config.
            self._setuptools_cfg.setdefault("packages", self._dist.packages)
            self._setuptools_cfg.setdefault("py-modules", self._dist.py_modules)
            return super().__exit__(exc_type, exc_value, traceback)
    
    
    class _ExperimentalConfiguration(SetuptoolsWarning):
        _SUMMARY = (
            "`{subject}` in `pyproject.toml` is still *experimental* "
            "and likely to change in future releases."
        )
    PK!3;	hooks.phpnu[PK!R
    		doctypes.phpnu[PK!cforeign_chars.phpnu[PK!ɀ
    routes.phpnu[PK!6R&L(L(	k mimes.phpnu[PK!~(6I6I
    Hconfig.phpnu[PK!`autoload.phpnu[PK!l6profiler.phpnu[PK!\.
    migration.phpnu[PK!˅
    
    user_agents.phpnu[PK!Mmmsmileys.phpnu[PK!Ӽdatabase.phpnu[PK!$t
    constants.phpnu[PK!
    memcached.phpnu[PK!(
    index.htmlnu[PK!cconfFooter.phpnu[PK!_,-confMgr.phpnu[PK!|'confHeader.phpnu[PK![		mh-linuxnu[PK!
    9
    
    tinker.phpnu[PK!Em0-0-type-ghostscript.mgknu[PK!AVV`?type.mgknu[PK!Y m?type-solaris.mgknu[PK!`==Ttype-windows.mgknu[PK!1
    delegates.mgknu[PK!yuWbreadcrumbs.phpnu[PK!؃utrustedproxy.phpnuIwPK! set-credentials-by-uri.jsnu[PK!QkIload-cafile.jsnu[PK!p`clear-credentials-by-uri.jsnu[PK!רgentle-fs.jsnu[PK!Wh];	;	figgy-config.jsnu[PK!1]cmd-list.jsnu[PK!sN՗++Dcore.jsnu[PK!H33load-prefix.jsnu[PK!nerf-dart.jsnu[PK!
    SSlifecycle.jsnu[PK!i׮%set-user.jsnu[PK!d--Vdefaults.jsnu[PK!M=^Cget-credentials-by-uri.jsnu[PK!SILbin-links.jsnu[PK!h0QO__init__.pynu[PK!;
    
    fUdbus.pynu[PK!Aw%___pycache__/dbus.cpython-36.opt-1.pycnu[PK!w#e__pycache__/__init__.cpython-36.pycnu[PK!w)St__pycache__/__init__.cpython-36.opt-1.pycnu[PK!Awʂ__pycache__/dbus.cpython-36.pycnu[PK!dv
    
    npm-config.jsnu[PK!T##hashing.phpnu[PK!\_	Hcache.phpnu[PK!-::{session.phpnu[PK!3Ϲ$$app.phpnu[PK!yAAbroadcasting.phpnu[PK!aview.phpnu[PK!
    
    logging.phpnu[PK!5=	error_lognu[PK!|DDmail.phpnu[PK!bCehservices.phpnu[PK!0g
    
    	Zqueue.phpnu[PK!0$auth.phpnu[PK!&2 HH<3filesystems.phpnu[PK!
    `
    ;reg-client.jsnu[PK!/	?pacote.jsnu[PK!
    GOfetch-opts.jsnu[PK!
    :Wload-uid.jsnu[PK!C
    Xini.pynu[PK!<::
    Edcli/parser.pynu[PK!,'vcli/__pycache__/__init__.cpython-37.pycnu[PK!W%xcli/__pycache__/parser.cpython-37.pycnu[PK!4T99,cli/__init__.pynu[PK!dhՋ
    
    "__pycache__/convert.cpython-37.pycnu[PK!M#"__pycache__/env_var.cpython-37.pycnu[PK!dKk#U__pycache__/__init__.cpython-37.pycnu[PK!'8
    8
    __pycache__/ini.cpython-37.pycnu[PK!0ee
    env_var.pynu[PK!&
    
    
    convert.pynu[PK!f|definitions.jsnu[PK!_		Pindex.jsnu[PK!];mm
    Edefinition.jsnu[PK!~pp$__pycache__/__init__.cpython-311.pycnu[PK!~::)__pycache__/configuration.cpython-311.pycnu[PK!dII$__pycache__/datatype.cpython-311.pycnu[PK!2Q6Q6$configuration.pynu[PK!GSTtt1[datatype.pynu[PK!{)##]_validate_pyproject/formats.pynu[PK!SaC;C;7_validate_pyproject/__pycache__/formats.cpython-311.pycnu[PK!4	4	8_validate_pyproject/__pycache__/__init__.cpython-311.pycnu[PK!lI<_validate_pyproject/__pycache__/fastjsonschema_exceptions.cpython-311.pycnu[PK!]G=J_validate_pyproject/__pycache__/fastjsonschema_validations.cpython-311.pycnu[PK!qqA_validate_pyproject/__pycache__/extra_validations.cpython-311.pycnu[PK!&OO?_validate_pyproject/__pycache__/error_reporting.cpython-311.pycnu[PK!G(++	_validate_pyproject/extra_validations.pynu[PK!o^7LL00	_validate_pyproject/fastjsonschema_exceptions.pynu[PK!N,,&6	_validate_pyproject/error_reporting.pynu[PK!)111c	_validate_pyproject/fastjsonschema_validations.pynu[PK![E
    _validate_pyproject/__init__.pynu[PK!L$
    __pycache__/setupcfg.cpython-311.pycnu[PK!8?YnYn"!__pycache__/expand.cpython-311.pycnu[PK!|ee)__pycache__/pyprojecttoml.cpython-311.pycnu[PK!,3^3^0__pycache__/_apply_pyprojecttoml.cpython-311.pycnu[PK!A#!@@	Texpand.pynu[PK!>cc˔setupcfg.pynu[PK!P99_apply_pyprojecttoml.pynu[PK!`=CC2pyprojecttoml.pynu[PKhh"v