std::string dosCompatiblePath(const std::string &pathString) { // Some libs of our toolchain does not support UTF-8 on Windows // for Py_SetPythonHome for example, we need to clean path from UTF-8 chars // to make it usable. // The fix found is to convert path into short DOS 8.3 path long length = 0; wchar_t* buffer = NULL; boost::filesystem::path path(pathString, qi::unicodeFacet()); // first, get size necessary for wchar_t* buffer length = GetShortPathNameW(path.wstring(qi::unicodeFacet()).c_str(), NULL, 0); if(length == 0) { qiLogVerbose() << "Cannot retrieve short path for " << pathString.c_str(); return std::string(); } // now, get the path compatible DOS 8.3, ASCII compliant buffer = new wchar_t[length]; length = GetShortPathNameW(path.wstring(qi::unicodeFacet()).c_str(), buffer, length); if(length == 0) { qiLogVerbose() << "Cannot retrieve short path for " << pathString.c_str(); return std::string(); } // whatever the buffer is wchar_t*, all characters inside are ASCII boost::filesystem::path shortPath(std::wstring(buffer), qi::unicodeFacet()); delete [] buffer; return shortPath.string(qi::unicodeFacet()); }
void MaterialPrecache::PrecacheMaterial(const char *path) { QString shortPath(path); shortPath.remove(".xml"); if (materials.contains(shortPath)) { DBGWARNING("!! Already precached:" << path); return; } std::string fullPath(PATH_MATERIAL_ROOT); fullPath += shortPath.toStdString(); fullPath += ".xml"; Material *material = ParseMaterial(fullPath.c_str()); if (material == nullptr) { DBGWARNING("!! Failed precaching material:" << path); return; } materials.insert(shortPath, material); }
void QgsGrass::setMapset( QString gisdbase, QString location, QString mapset ) { QgsDebugMsg( QString( "gisdbase = %1 location = %2 mapset = %3" ).arg( gisdbase ).arg( location ).arg( mapset ) ); init(); // Set principal GRASS variables (in memory) #ifdef Q_OS_WIN G__setenv( "GISDBASE", shortPath( gisdbase ).toUtf8().data() ); #else G__setenv( "GISDBASE", gisdbase.toUtf8().data() ); #endif G__setenv( "LOCATION_NAME", location.toUtf8().data() ); G__setenv( "MAPSET", mapset.toUtf8().data() ); // Add all available mapsets to search path char **ms = 0; G_TRY { ms = G_available_mapsets(); } G_CATCH( QgsGrass::Exception &e ) { Q_UNUSED( e ); QgsDebugMsg( QString( "No available mapsets found: %1" ).arg( e.what() ) ); return; }
main(int argc, char* argv[]) { int i, reps, n, m, mss, ec1, ec2, span, floVal; if (argc != 8 || sscanf(argv[2],"%d",&reps) != 1 || sscanf(argv[3],"%d",&n) != 1 || sscanf(argv[4],"%d",&m) != 1 || sscanf(argv[5],"%d",&mss) != 1 || sscanf(argv[6],"%d",&ec1) != 1 || sscanf(argv[7],"%d",&ec2) != 1) fatal("usage: maxFloRep method reps n m mss ec1 ec2"); Flograph fg(n,m,1,2); for (i = 1; i <= reps; i++) { fg.rgraph(n,m,mss); fg.randCapacity(ec1,ec2); if (strcmp(argv[1],"maxCap") == 0) maxCap(fg,floVal); else if (strcmp(argv[1],"capScale") == 0) capScale(fg,floVal); else if (strcmp(argv[1],"shortPath") == 0) shortPath(fg,floVal); else if (strcmp(argv[1],"dinic") == 0) dinic(fg,floVal); else if (strcmp(argv[1],"dinicDtrees") == 0) dinicDtrees(fg,floVal); else if (strcmp(argv[1],"ppFifo") == 0) ppFifo(fg,floVal,false); else if (strcmp(argv[1],"ppFifoBatch") == 0) ppFifo(fg,floVal,true); else fatal("maxFloRep: undefined method"); } }
static BaseEngine *ps2pdf(const WCHAR *fileName) { // TODO: read from gswin32c's stdout instead of using a TEMP file ScopedMem<WCHAR> shortPath(path::ShortPath(fileName)); ScopedMem<WCHAR> tmpFile(path::GetTempPath(L"PsE")); ScopedFile tmpFileScope(tmpFile); ScopedMem<WCHAR> gswin32c(GetGhostscriptPath()); if (!shortPath || !tmpFile || !gswin32c) return NULL; // try to help Ghostscript determine the intended page size ScopedMem<WCHAR> psSetup; RectI page = ExtractDSCPageSize(fileName); if (!page.IsEmpty()) psSetup.Set(str::Format(L" << /PageSize [%i %i] >> setpagedevice", page.dx, page.dy)); ScopedMem<WCHAR> cmdLine(str::Format( L"\"%s\" -q -dSAFER -dNOPAUSE -dBATCH -dEPSCrop -sOutputFile=\"%s\" -sDEVICE=pdfwrite -c \".setpdfwrite%s\" -f \"%s\"", gswin32c, tmpFile, psSetup ? psSetup : L"", shortPath)); fprintf(stderr, "- %s:%d: using '%ls' for creating '%%TEMP%%\\%ls'\n", path::GetBaseName(__FILE__), __LINE__, gswin32c.Get(), path::GetBaseName(tmpFile)); // TODO: the PS-to-PDF conversion can hang the UI for several seconds HANDLE process = LaunchProcess(cmdLine, NULL, CREATE_NO_WINDOW); if (!process) return NULL; DWORD timeout = 10000; #ifdef DEBUG // allow to disable the timeout for debugging purposes if (GetEnvironmentVariable(L"SUMATRAPDF_NO_GHOSTSCRIPT_TIMEOUT", NULL, 0)) timeout = INFINITE; #endif DWORD exitCode = EXIT_FAILURE; WaitForSingleObject(process, timeout); GetExitCodeProcess(process, &exitCode); TerminateProcess(process, 1); CloseHandle(process); if (exitCode != EXIT_SUCCESS) return NULL; size_t len; ScopedMem<char> pdfData(file::ReadAll(tmpFile, &len)); if (!pdfData) return NULL; ScopedComPtr<IStream> stream(CreateStreamFromData(pdfData, len)); if (!stream) return NULL; return PdfEngine::CreateFromStream(stream); }
int main() { int i; while(scanf("%d",&n)!=EOF){ for(i=0;i<n;i++) scanf("%d %d",&places[i][0],&places[i][1]); calcDistances(); for(i=0;i<n;i++) shortPath(i,0); printf("%.3f\n",best); } return 0; }
void QgsGrass::setMapset( QString gisdbase, QString location, QString mapset ) { QgsDebugMsg( QString( "gisdbase = %1 location = %2 mapset = %3" ).arg( gisdbase ).arg( location ).arg( mapset ) ); init(); // Set principal GRASS variables (in memory) #if defined(WIN32) G__setenv( "GISDBASE", shortPath( gisdbase ).toUtf8().data() ); #else G__setenv( "GISDBASE", gisdbase.toUtf8().data() ); #endif G__setenv( "LOCATION_NAME", location.toUtf8().data() ); G__setenv( "MAPSET", mapset.toUtf8().data() ); // Add all available mapsets to search path char **ms = G_available_mapsets(); for ( int i = 0; ms[i]; i++ ) G_add_mapset_to_search_path( ms[i] ); }
static PdfEngine *ps2pdf(const WCHAR *fileName) { // TODO: read from gswin32c's stdout instead of using a TEMP file ScopedMem<WCHAR> shortPath(path::ShortPath(fileName)); ScopedMem<WCHAR> tmpFile(path::GetTempPath(L"PsE")); ScopedFile tmpFileScope(tmpFile); ScopedMem<WCHAR> gswin32c(GetGhostscriptPath()); if (!shortPath || !tmpFile || !gswin32c) return NULL; ScopedMem<WCHAR> cmdLine(str::Format(L"\"%s\" -q -dSAFER -dNOPAUSE -dBATCH -dEPSCrop -sOutputFile=\"%s\" -sDEVICE=pdfwrite -c .setpdfwrite -f \"%s\"", gswin32c, tmpFile, shortPath)); if (GetEnvironmentVariable(L"MULOG", NULL, 0)) { wprintf(L"ps2pdf: using Ghostscript from '%s'\n", gswin32c.Get()); wprintf(L"ps2pdf: for creating '%s'\n", tmpFile.Get()); } // TODO: the PS-to-PDF conversion can hang the UI for several seconds HANDLE process = LaunchProcess(cmdLine, NULL, CREATE_NO_WINDOW); if (!process) return NULL; DWORD exitCode = EXIT_FAILURE; WaitForSingleObject(process, 10000); GetExitCodeProcess(process, &exitCode); TerminateProcess(process, 1); CloseHandle(process); if (exitCode != EXIT_SUCCESS) return NULL; size_t len; ScopedMem<char> pdfData(file::ReadAll(tmpFile, &len)); if (!pdfData) return NULL; ScopedComPtr<IStream> stream(CreateStreamFromData(pdfData, len)); if (!stream) return NULL; if (GetEnvironmentVariable(L"MULOG", NULL, 0)) printf("ps2pdf: PDF conversion successful\n"); return PdfEngine::CreateFromStream(stream); }
void QgsGrass::setLocation( QString gisdbase, QString location ) { QgsDebugMsg( QString( "gisdbase = %1 location = %2" ).arg( gisdbase ).arg( location ) ); init(); // Set principal GRASS variables (in memory) #if defined(WIN32) G__setenv( "GISDBASE", shortPath( gisdbase ).toLocal8Bit().data() ); #else // This does not work for GISBASE with non ascii chars on Windows XP, // gives error 'LOCATION ... not available': G__setenv( "GISDBASE", gisdbase.toUtf8().constData() ); #endif G__setenv( "LOCATION_NAME", location.toUtf8().constData() ); G__setenv( "MAPSET", "PERMANENT" ); // PERMANENT must always exist // Add all available mapsets to search path char **ms = G_available_mapsets(); for ( int i = 0; ms[i]; i++ ) G_add_mapset_to_search_path( ms[i] ); }
void shortPath(int v,float len){ int i; if(len>=best) return; if(counter==n && len<best) { best=len; return; } for(i=0;i<n;i++) if(visit[i]==0){ counter++; visit[i]=1; shortPath(i,len+dist[v][i]); visit[i]=0; counter--; } }
void GRASS_EXPORT QgsGrass::init( void ) { // Warning!!! // G_set_error_routine() once called from plugin // is not valid in provider -> call it always // Set error function G_set_error_routine( &error_routine ); if ( initialized ) return; QSettings settings; // Is it active mode ? if ( getenv( "GISRC" ) ) { active = true; // Store default values defaultGisdbase = G_gisdbase(); defaultLocation = G_location(); defaultMapset = G_mapset(); } else { active = false; } // Don't use GISRC file and read/write GRASS variables (from location G_VAR_GISRC) to memory only. G_set_gisrc_mode( G_GISRC_MODE_MEMORY ); // Init GRASS libraries (required) G_no_gisinit(); // Doesn't check write permissions for mapset compare to G_gisinit("libgrass++"); // I think that mask should not be used in QGIS as it can only confuses people, // anyway, I don't think anybody is using MASK G_suppress_masking(); // Set program name G_set_program_name( "QGIS" ); // Require GISBASE to be set. This should point to the location of // the GRASS installation. The GRASS libraries use it to know // where to look for things. // Look first to see if GISBASE env var is already set. // This is set when QGIS is run from within GRASS // or when set explicitly by the user. // This value should always take precedence. #if WIN32 QString gisBase = getenv( "WINGISBASE" ) ? getenv( "WINGISBASE" ) : getenv( "GISBASE" ); gisBase = shortPath( gisBase ); #else QString gisBase = getenv( "GISBASE" ); #endif QgsDebugMsg( QString( "GRASS gisBase from GISBASE env var is: %1" ).arg( gisBase ) ); if ( !isValidGrassBaseDir( gisBase ) ) { // Look for gisbase in QSettings gisBase = settings.value( "/GRASS/gisbase", "" ).toString(); QgsDebugMsg( QString( "GRASS gisBase from QSettings is: %1" ).arg( gisBase ) ); } if ( !isValidGrassBaseDir( gisBase ) ) { // Erase gisbase from settings because it does not exists settings.setValue( "/GRASS/gisbase", "" ); #ifdef WIN32 // Use the applicationDirPath()/grass gisBase = shortPath( QCoreApplication::applicationDirPath() + "/grass" ); QgsDebugMsg( QString( "GRASS gisBase = %1" ).arg( gisBase ) ); #else // Use the location specified --with-grass during configure gisBase = GRASS_BASE; QgsDebugMsg( QString( "GRASS gisBase from configure is: %1" ).arg( gisBase ) ); #endif } bool userGisbase = false; bool valid = false; while ( !( valid = isValidGrassBaseDir( gisBase ) ) ) { // ask user if he wants to specify GISBASE QMessageBox::StandardButton res = QMessageBox::warning( 0, QObject::tr( "GRASS plugin" ), QObject::tr( "QGIS couldn't find your GRASS installation.\n" "Would you like to specify path (GISBASE) to your GRASS installation?" ), QMessageBox::Ok | QMessageBox::Cancel ); if ( res != QMessageBox::Ok ) { userGisbase = false; break; } // XXX Need to subclass this and add explantory message above to left side userGisbase = true; // For Mac, GISBASE folder may be inside GRASS bundle. Use Qt file dialog // since Mac native dialog doesn't allow user to browse inside bundles. gisBase = QFileDialog::getExistingDirectory( 0, QObject::tr( "Choose GRASS installation path (GISBASE)" ), gisBase, QFileDialog::DontUseNativeDialog ); if ( gisBase == QString::null ) { // User pressed cancel. No GRASS for you! userGisbase = false; break; } #if defined(WIN32) gisBase = shortPath( gisBase ); #endif } if ( !valid ) { // warn user QMessageBox::information( 0, QObject::tr( "GRASS plugin" ), QObject::tr( "GRASS data won't be available if GISBASE is not specified." ) ); } if ( userGisbase ) { settings.setValue( "/GRASS/gisbase", gisBase ); } QgsDebugMsg( QString( "Valid GRASS gisBase is: %1" ).arg( gisBase ) ); putEnv( "GISBASE", gisBase ); // Add path to GRASS modules #ifdef WIN32 QString sep = ";"; #else QString sep = ":"; #endif QString path = gisBase + "/bin"; path.append( sep + gisBase + "/scripts" ); path.append( sep + QgsApplication::pkgDataPath() + "/grass/scripts/" ); // On windows the GRASS libraries are in // QgsApplication::prefixPath(), we have to add them // to PATH to enable running of GRASS modules // and database drivers #ifdef WIN32 // It seems that QgsApplication::prefixPath() // is not initialized at this point path.append( sep + shortPath( QCoreApplication::applicationDirPath() ) ); // Add path to MSYS bin // Warning: MSYS sh.exe will translate this path to '/bin' if ( QFileInfo( QCoreApplication::applicationDirPath() + "/msys/bin/" ).isDir() ) path.append( sep + shortPath( QCoreApplication::applicationDirPath() + "/msys/bin/" ) ); #endif QString p = getenv( "PATH" ); path.append( sep + p ); QgsDebugMsg( QString( "set PATH: %1" ).arg( path ) ); putEnv( "PATH", path ); // Set PYTHONPATH QString pythonpath = gisBase + "/etc/python"; QString pp = getenv( "PYTHONPATH" ); pythonpath.append( sep + pp ); QgsDebugMsg( QString( "set PYTHONPATH: %1" ).arg( pythonpath ) ); putEnv( "PYTHONPATH", pythonpath ); // Set GRASS_PAGER if not set, it is necessary for some // modules printing to terminal, e.g. g.list // We use 'cat' because 'more' is not present in MSYS (Win) // and it doesn't work well in built in shell (Unix/Mac) // and 'less' is not user friendly (for example user must press // 'q' to quit which is definitely difficult for normal user) // Also scroling can be don in scrollable window in both // MSYS terminal and built in shell. if ( !getenv( "GRASS_PAGER" ) ) { QString pager; QStringList pagers; //pagers << "more" << "less" << "cat"; // se notes above pagers << "cat"; for ( int i = 0; i < pagers.size(); i++ ) { int state; QProcess p; p.start( pagers.at( i ) ); p.waitForStarted(); state = p.state(); p.write( "\004" ); // Ctrl-D p.closeWriteChannel(); p.waitForFinished( 1000 ); p.kill(); if ( state == QProcess::Running ) { pager = pagers.at( i ); break; } } if ( pager.length() > 0 ) { putEnv( "GRASS_PAGER", pager ); } } initialized = 1; }
QString GRASS_EXPORT QgsGrass::openMapset( QString gisdbase, QString location, QString mapset ) { QgsDebugMsg( QString( "gisdbase = %1" ).arg( gisdbase.toUtf8().constData() ) ); QgsDebugMsg( QString( "location = %1" ).arg( location.toUtf8().constData() ) ); QgsDebugMsg( QString( "mapset = %1" ).arg( mapset.toUtf8().constData() ) ); QString mapsetPath = gisdbase + "/" + location + "/" + mapset; // Check if the mapset is in use QString gisBase = getenv( "GISBASE" ); if ( gisBase.isEmpty() ) return QObject::tr( "GISBASE is not set." ); QFileInfo fi( mapsetPath + "/WIND" ); if ( !fi.exists() ) { return QObject::tr( "%1 is not a GRASS mapset." ).arg( mapsetPath ); } QString lock = mapsetPath + "/.gislock"; #ifndef _MSC_VER int pid = getpid(); #else int pid = GetCurrentProcessId(); #endif QgsDebugMsg( QString( "pid = %1" ).arg( pid ) ); #ifndef Q_OS_WIN QFile lockFile( lock ); QProcess *process = new QProcess(); QString lockProgram( gisBase + "/etc/lock" ); QgsDebugMsg( QString( "pid = %1" ).arg( pid ) ); process->start( lockProgram, QStringList() << lock << QString::number( pid ) ); if ( !process->waitForStarted() ) { delete process; return QObject::tr( "Cannot start %1/etc/lock" ).arg( gisBase ); } process->waitForFinished( -1 ); int status = process->exitStatus(); QgsDebugMsg( QString( "status = %1" ).arg( status ) ); delete process; if ( status > 0 ) return QObject::tr( "Mapset is already in use." ); #endif // !WIN32 // Create temporary directory QFileInfo info( mapsetPath ); QString user = info.owner(); mTmp = QDir::tempPath() + "/grass6-" + user + "-" + QString::number( pid ); QDir dir( mTmp ); if ( dir.exists() ) { QFileInfo dirInfo( mTmp ); if ( !dirInfo.isWritable() ) { #ifndef Q_OS_WIN lockFile.remove(); #endif return QObject::tr( "Temporary directory %1 exists but is not writable" ).arg( mTmp ); } } else if ( !dir.mkdir( mTmp ) ) { #ifndef Q_OS_WIN lockFile.remove(); #endif return QObject::tr( "Cannot create temporary directory %1" ).arg( mTmp ); } // Create GISRC file QString globalGisrc = QDir::home().path() + "/.grassrc6"; mGisrc = mTmp + "/gisrc"; QgsDebugMsg( QString( "globalGisrc = %1" ).arg( globalGisrc ) ); QgsDebugMsg( QString( "mGisrc = %1" ).arg( mGisrc ) ); QFile out( mGisrc ); if ( !out.open( QIODevice::WriteOnly ) ) { #ifndef Q_OS_WIN lockFile.remove(); #endif return QObject::tr( "Cannot create %1" ).arg( mGisrc ); } QTextStream stream( &out ); QFile in( globalGisrc ); QString line; bool guiSet = false; char buf[1000]; if ( in.open( QIODevice::ReadOnly ) ) { while ( in.readLine( buf, 1000 ) != -1 ) { line = buf; if ( line.contains( "GISDBASE:" ) || line.contains( "LOCATION_NAME:" ) || line.contains( "MAPSET:" ) ) { continue; } if ( line.contains( "GRASS_GUI:" ) ) guiSet = true; stream << line; } in.close(); } line = "GISDBASE: " + gisdbase + "\n"; stream << line; line = "LOCATION_NAME: " + location + "\n"; stream << line; line = "MAPSET: " + mapset + "\n"; stream << line; if ( !guiSet ) { stream << "GRASS_GUI: wxpython\n"; } out.close(); // Set GISRC environment variable /* _Correct_ putenv() implementation is not making copy! */ putEnv( "GISRC", mGisrc ); // Reinitialize GRASS G__setenv( "GISRC", mGisrc.toUtf8().data() ); #if defined(WIN32) G__setenv( "GISDBASE", shortPath( gisdbase ).toLocal8Bit().data() ); #else G__setenv( "GISDBASE", gisdbase.toUtf8().data() ); #endif G__setenv( "LOCATION_NAME", location.toLocal8Bit().data() ); G__setenv( "MAPSET", mapset.toLocal8Bit().data() ); defaultGisdbase = gisdbase; defaultLocation = location; defaultMapset = mapset; active = true; #ifndef Q_OS_WIN // Close old mapset if ( mMapsetLock.length() > 0 ) { QFile file( mMapsetLock ); file.remove(); } #endif mMapsetLock = lock; return NULL; }
/* orthoEdges: * For edges without position information, construct an orthogonal routing. * If doLbls is true, use edge label info when available to guide routing, * and set label pos for those edges for which this info is not available. */ void orthoEdges (Agraph_t* g, int doLbls) { sgraph* sg; maze* mp; int n_edges; route* route_list; int i, gstart; Agnode_t* n; Agedge_t* e; snode* sn; snode* dn; epair_t* es = N_GNEW(agnedges(g), epair_t); cell* start; cell* dest; PointSet* ps; textlabel_t* lbl; if (Concentrate) ps = newPS(); #ifdef DEBUG { char* s = agget(g, "odb"); char c; odb_flags = 0; if (s && (*s != '\0')) { while ((c = *s++)) { switch (c) { case 'c' : odb_flags |= ODB_CHANG; // emit channel graph break; case 'i' : odb_flags |= (ODB_SGRAPH|ODB_IGRAPH); // emit search graphs break; case 'm' : odb_flags |= ODB_MAZE; // emit maze break; case 'r' : odb_flags |= ODB_ROUTE; // emit routes in maze break; case 's' : odb_flags |= ODB_SGRAPH; // emit search graph break; } } } } #endif if (doLbls) { agerr(AGWARN, "Orthogonal edges do not currently handle edge labels. Try using xlabels.\n"); doLbls = 0; } mp = mkMaze (g, doLbls); sg = mp->sg; #ifdef DEBUG if (odb_flags & ODB_SGRAPH) emitSearchGraph (stderr, sg); #endif /* store edges to be routed in es, along with their lengths */ n_edges = 0; for (n = agfstnode (g); n; n = agnxtnode(g, n)) { for (e = agfstout(g, n); e; e = agnxtout(g,e)) { if ((Nop == 2) && ED_spl(e)) continue; if (Concentrate) { int ti = AGID(agtail(e)); int hi = AGID(aghead(e)); if (ti <= hi) { if (isInPS (ps,ti,hi)) continue; else addPS (ps,ti,hi); } else { if (isInPS (ps,hi,ti)) continue; else addPS (ps,hi,ti); } } es[n_edges].e = e; es[n_edges].d = edgeLen (e); n_edges++; } } route_list = N_NEW (n_edges, route); qsort((char *)es, n_edges, sizeof(epair_t), (qsort_cmpf) edgecmp); gstart = sg->nnodes; PQgen (sg->nnodes+2); sn = &sg->nodes[gstart]; dn = &sg->nodes[gstart+1]; for (i = 0; i < n_edges; i++) { #ifdef DEBUG if ((i > 0) && (odb_flags & ODB_IGRAPH)) emitSearchGraph (stderr, sg); #endif e = es[i].e; start = CELL(agtail(e)); dest = CELL(aghead(e)); if (doLbls && (lbl = ED_label(e)) && lbl->set) { } else { if (start == dest) addLoop (sg, start, dn, sn); else { addNodeEdges (sg, dest, dn); addNodeEdges (sg, start, sn); } if (shortPath (sg, dn, sn)) goto orthofinish; } route_list[i] = convertSPtoRoute(sg, sn, dn); reset (sg); } PQfree (); mp->hchans = extractHChans (mp); mp->vchans = extractVChans (mp); assignSegs (n_edges, route_list, mp); if (setjmp(jbuf)) goto orthofinish; assignTracks (n_edges, route_list, mp); #ifdef DEBUG if (odb_flags & ODB_ROUTE) emitGraph (stderr, mp, n_edges, route_list, es); #endif attachOrthoEdges (g, mp, n_edges, route_list, &sinfo, es, doLbls); orthofinish: if (Concentrate) freePS (ps); for (i=0; i < n_edges; i++) free (route_list[i].segs); free (route_list); freeMaze (mp); }